web-dev-qa-db-fra.com

Requête MySQL pour obtenir les noms de colonnes?

Je voudrais obtenir tous les noms d'une table de table mysql dans un tableau en php?

Y a-t-il une requête pour cela? 

235
Haroldo

Le meilleur moyen consiste à utiliser la base de données virtuelle INFORMATION_SCHEMA métadonnées. Plus précisément, la INFORMATION_SCHEMA.COLUMNS table ...

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

Il est TRÈS puissant et peut vous donner des TONNES d’informations sans avoir à analyser le texte (type de colonne, type de colonne, valeur de la colonne, taille de colonne maximale, jeu de caractères, etc.).

Oh, et c'est du SQL standard (considérant que SHOW ... est une extension spécifique de MySQL) ...

Pour plus d'informations sur la différence entre SHOW... et l'utilisation des tables INFORMATION_SCHEMA, consultez la documentation MySQL sur INFORMATION_SCHEMA en général ...

440
ircmaxell

Vous pouvez utiliser la requête suivante pour MYSQL:

SHOW columns FROM your-table;

Voici l'exemple de code qui montre comment implémenter la syntaxe ci-dessus en php pour lister les noms de colonnes 

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

Pour plus de détails sur la sortie de SHOW COLUMNS FROM TABLE, visitez: MySQL Refrence.

172
stillstanding

On dirait qu'il y a 2 façons:

DESCRIBE `tablename`

ou

SHOW COLUMNS FROM `tablename`

Plus d'informations sur DESCRIBE ici: http://dev.mysql.com/doc/refman/5.0/fr/describe.html

38
Surreal Dreams

J'ai fait cela par le passé.

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 
16
Jeff

Edit: Aujourd'hui, j'ai appris le meilleur moyen de le faire. S'il vous plaît voir la réponse de ircmaxell.


Analyser la sortie de SHOW COLUMNS FROM table;

En savoir plus ici: http://dev.mysql.com/doc/refman/5.0/en/show-columns.html

13

Une ancienne fonction PHP "mysql_list_fields ()" est obsolète. Donc, aujourd'hui, le meilleur moyen d'obtenir les noms de champs est une requête "SHOW COLUMNS FROM nom_table [LIKE 'nom']". Alors, voici un petit exemple:

$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
  $fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }
5
user2558588

Utilisez mysql_fetch_field() pour afficher toutes les données de colonne. Voir manuel .

$query = 'select * from myfield';
$result = mysql_query($query);
$i = 0;
while ($i < mysql_num_fields($result))
{
   $fld = mysql_fetch_field($result, $i);
   $myarray[]=$fld->name;
   $i = $i + 1;
}

"Avertissement Cette extension est obsolète à partir de PHP 5.5.0 et sera supprimée à l'avenir."

5
Gavin Simpson
function get_col_names(){  
    $sql = "SHOW COLUMNS FROM tableName";  
    $result = mysql_query($sql);     
    while($record = mysql_fetch_array($result)){  
     $fields[] = $record['0'];  
    }
    foreach ($fields as $value){  
      echo 'column name is : '.$value.'-';  
}  
 }  

return get_col_names();
3

lorsque vous voulez vérifier la structure de toutes vos tables avec certains fichiers, utilisez ce code. Dans cette requête, je sélectionne nom_colonne, type_colonne et nom_table pour plus de détails. J'utilise order by column_type pour pouvoir le voir facilement. 

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

Si vous voulez cocher seulement le type double déposé, alors vous pouvez le faire facilement 

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%'  order by DATA_TYPE;

 enter image description here

si vous voulez vérifier quel champ autorise le type nul, etc., alors vous pouvez l'utiliser 

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;

 enter image description here

vous voulez vérifier plus puis ce lien vous aider également.

https://dev.mysql.com/doc/refman/5.7/en/columns-table.html

3
Shafiqul Islam

Essayez celui-ci, je l'utilise personnellement:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
2
mohsin

Je ne sais pas si c'est ce que vous cherchiez, mais cela a fonctionné pour moi:

$query = query("DESC YourTable");  
$col_names = array_column($query, 'Field');

Cela renvoie un simple tableau des noms de colonnes/noms de variables de votre table ou tableau sous forme de chaînes, ce dont j'avais besoin pour construire dynamiquement des requêtes MySQL. Ma frustration était que je ne savais tout simplement pas comment indexer les tableaux dans PHP, alors je ne savais pas quoi faire des résultats de DESC ou SHOW. J'espère que ma réponse sera utile aux débutants comme moi!

Pour vérifier le résultat: print_r($col_names);

2
unami

SHOW COLUMNS dans mysql 5.1 (pas 5.5) utilise une table de disque temporaire.

Cela peut donc être considéré comme lent dans certains cas. Au moins, cela peut augmenter votre valeur created_tmp_disk_tables. Imaginez une table de disque temporaire par connexion ou par demande de page.

SHOW COLUMNS n'est pas si lent, peut-être parce qu'il utilise le cache du système de fichiers. Phpmyadmin dit ~ 0.5ms de façon constante. Ce n'est rien comparé à 500ms-1000ms de servir une page wordpress. Mais encore, il y a des moments où ça compte. Il y a une implication du système de disque, vous ne savez jamais ce qui se passe lorsque le serveur est occupé, le cache est plein, le disque dur est bloqué, etc.

Récupération des noms de colonne via SELECT * FROM ... LIMIT 1 était d'environ ~ 0,1 ms et peut également utiliser le cache de requêtes.

Voici donc mon petit code optimisé pour obtenir les noms de colonne d'une table, sans utiliser show columns si possible:

function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();

global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
    return $db_columns_ar_cache[$table];


//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
    {
    foreach($row as $name=>$val)
        $cols[$name]=$name;
    }
else
    {
    $coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
    if($coldata)
        foreach($coldata as $row)
            $cols[$row->Field]=$row->Field;
    }
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}

Remarques:

  • Tant que la première ligne de vos tables ne contient pas une plage de données en mégaoctets, cela devrait fonctionner correctement.
  • Les noms de fonction db_rows et db_row_ar doivent être remplacés par votre configuration de base de données spécifique.
2
Johan

EN WORDPRESS:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}
1
T.Todua

si vous utilisez php, utilisez ceci Gist.

il peut obtenir des informations complètes sur les champs sélectionnés sans résultat et tous les champs personnalisés tels que:

SELECT a.name aname, b.name bname, b.* 
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;

si ci-dessus, sql ne renvoie aucune donnée, les noms de champs aname, bname, l'autre nom de b du b

juste deux lignes:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();
1
zhi.yang

La solution la plus simple parmi toutes les réponses:

DESC `table name`

ou

DESCRIBE `table name`

ou

SHOW COLUMNS FROM `table name`
1
Gil Baggio

Cette question est ancienne, mais je suis arrivée ici à la recherche d'un moyen de trouver de manière dynamique une requête donnée, dont les noms de champs (pas uniquement les champs d'une table). Et comme les gens continuent de pointer cela comme la réponse à cette tâche donnée dans d'autres questions connexes, je partage ce que j'ai découvert en faisant, en utilisant les conseils de Gavin Simpson:

//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
    $rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
    if(mysqli_num_rows($rsResult)>0)
    {
        //We start with header. >>>Here we retrieve the field names<<<
        echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
        $i = 0;
        while ($i < mysqli_num_fields($rsResult)){
           $field = mysqli_fetch_field_direct($rsResult, $i);
           $fieldName=$field->name;
           echo "<td><strong>$fieldName</strong></td>";
           $i = $i + 1;
        }
        echo "</tr>"; 
        //>>>Field names retrieved<<<

        //We dump info
        $bolWhite=true;
        while ($row = mysqli_fetch_assoc($rsResult)) {
            echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
            $bolWhite=!$bolWhite;
            foreach($row as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}

Cela peut être facilement modifié pour insérer les noms de champs dans un tableau.

L'utilisation d'un simple: $sql="SELECT * FROM myTable LIMIT 1" peut vous donner les champs de n'importe quelle table, sans avoir besoin d'utiliser SHOW COLUMNS ni de module php supplémentaire, si nécessaire (supprimer la partie vidage de données).

Espérons que cela aide quelqu'un d'autre.

1
Gusstavv Gil

Cette requête extrait une liste de toutes les colonnes d'une base de données sans avoir à spécifier un nom de table. Il retourne une liste de noms de colonnes uniquement: 

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'db_name'

Cependant, lorsque j'ai exécuté cette requête dans phpmyadmin, une série d'erreurs s'est affichée. Néanmoins, cela a fonctionné. Alors utilisez-le avec prudence. 

1
Ignat Ospadov

si vous avez seulement besoin des noms et des types de champs (peut-être pour un copier-coller facile dans Excel):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

retirer 

DATA_TYPE='decimal'

si vous voulez tous les types de données

0
Amir No-Family

je ne suis pas un expert, mais ça marche pour moi.

$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>"; // returns the first column of array. in this case Field

      // the below code will return a full array-> Field,Type,Null,Key,Default,Extra    
      // for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}    

}
0
Ad Kahn