Obtenez les noms des colonnes de table dans MySQL?

301

Existe-t-il un moyen de récupérer le nom des colonnes d'une table dans mysql? en utilisant php

Un employé
la source

Réponses:

537

Vous pouvez utiliser DESCRIBE :

DESCRIBE my_table;

Ou dans les versions plus récentes, vous pouvez utiliser INFORMATION_SCHEMA :

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table';

Ou vous pouvez utiliser SHOW COLUMNS :

SHOW COLUMNS FROM my_table;
Greg
la source
14
DESCRIBE est en fait un raccourci pour SHOW COLUMNS ( dev.mysql.com/doc/refman/5.0/en/describe.html )
svens
11
Je voterais pour la version Information_Schema, car cette syntaxe est prise en charge par la plupart des principales bases de données. Mieux vaut n'apprendre qu'une seule façon si vous le devez.
Kibbee
3
+1 Je voulais sélectionner les noms de table où il y a une colonneSELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND COLUMN_NAME = 'col_name';
AL̲̳I
2
économiser des octets en utilisant desc my_table;:-)
Alfonso Pérez
3
DESCpour décrire peut être facilement confondu avec DESCpour descendre. Le nombre nominal d'octets que vous enregistrez pour le manque de lisibilité n'en vaut pas la peine.
Jacques Mathieu
34

Les instructions SQL suivantes sont presque équivalentes:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE table_name = 'tbl_name'
  [AND table_schema = 'db_name']
  [AND column_name LIKE 'wild']

SHOW COLUMNS
FROM tbl_name
[FROM db_name]
[LIKE 'wild']

Référence: INFORMATION_SCHEMA COLUMNS

Poneys OMG
la source
1
Pourquoi dites-vous "presque"?
Pacerier
2
@Pacerier D'une part, la seconde ne fonctionnera pas comme une sous-requête.
WAF
@WAF, je pense qu'il voulait dire autre chose, pas ça.
Pacerier
2
Dans mon test rapide, SHOW COLUMNSretourne un tableau contenant les noms de colonne, les types, etc., tandis que SELECT COLUMN NAMErenvoie uniquement les noms de colonne.
mwfearnley
20

J'ai créé une fonction PDO qui renvoie tous les noms de colonnes dans un tableau simple.

public function getColumnNames($table){
    $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = :table";
    try {
        $core = Core::getInstance();
        $stmt = $core->dbh->prepare($sql);
        $stmt->bindValue(':table', $table, PDO::PARAM_STR);
        $stmt->execute();
        $output = array();
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
            $output[] = $row['COLUMN_NAME'];                
        }
        return $output; 
    }

    catch(PDOException $pe) {
        trigger_error('Could not connect to MySQL database. ' . $pe->getMessage() , E_USER_ERROR);
    }
}

La sortie sera un tableau:

Array (
[0] => id
[1] => name
[2] => email
[3] => shoe_size
[4] => likes
... )

Désolé pour la nécro mais j'aime ma fonction;)

PS Je n'ai pas inclus la classe Core mais vous pouvez utiliser votre propre classe .. DS

Philippe
la source
Quel est le fétiche majuscule?
Pacerier
Il n'y a rien de mal à répondre à une vieille question sur Stack Overflow.
bdsl
1
Merci. Pour la sortie, j'ai utilisé de cette façon: $ colonnes = $ stmt-> fetchAll (\ PDO :: FETCH_ASSOC); return array_column ($ colonnes, 'COLUMN_NAME');
Ehsan
6

Cette solution provient de la ligne de commande mysql

mysql>USE information_schema;

Dans la requête ci-dessous, changez simplement <--DATABASE_NAME--> en votre base de données et <--TABLENAME--> en votre nom de table où vous voulez juste les valeurs de champ de l'instruction DESCRIBE

mysql> SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = '<--DATABASE_NAME-->' AND   TABLE_NAME='<--TABLENAME-->';
leela
la source
4

Il y a aussi ceci si vous préférez:

mysql_query('SHOW COLUMNS FROM tableName'); 
James Goodwin
la source
4

Que dis-tu de ça:

SELECT @cCommand := GROUP_CONCAT( COLUMN_NAME ORDER BY column_name SEPARATOR ',\n')
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table';

SET @cCommand = CONCAT( 'SELECT ', @cCommand, ' from my_database.my_table;');
PREPARE xCommand from @cCommand;
EXECUTE xCommand;
Wolf Metzner
la source
4

Il est également intéressant de noter que vous pouvez utiliser
EXPLAIN table_namece qui est synonyme de DESCRIBE table_nameet SHOW COLUMNS FROM table_name bien que EXPLAIN soit plus couramment utilisé pour obtenir des informations sur le plan d'exécution des requêtes.

AnthonyS
la source
3

Examiner:

mysql_query('DESCRIBE '.$table);
Andy Hume
la source
3

La fonction MySQL décrit la table devrait vous amener où vous voulez aller (mettez votre nom de table pour "table"). Vous devrez analyser la sortie, mais c'est assez facile. Si je me souviens bien, si vous exécutez cette requête, le résultat de la requête PHP accédant aux fonctions qui vous donneraient normalement une paire clé-valeur aura les noms de colonne comme clés. Mais cela fait un moment que je n'ai pas utilisé PHP, alors ne m'y tenez pas. :)

dannysauer
la source
Il y a de très bons documents sur php.net dans us3.php.net/manual/en/function.mysql-list-fields.php
dannysauer
3

Vous pouvez également vérifier mysql_fetch_array(), comme dans:

$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs)) {
//$row[0] = 'First Field';
//$row['first_field'] = 'First Field';
}
thewebguy
la source
3

J'avais besoin de noms de colonnes sous forme de tableau plat, tandis que les autres réponses renvoyaient des tableaux associatifs, j'ai donc utilisé:

$con = mysqli_connect('localhost',$db_user,$db_pw,$db_name);
$table = 'people';

/**
* Get the column names for a mysql table
**/

function get_column_names($con, $table) {
  $sql = 'DESCRIBE '.$table;
  $result = mysqli_query($con, $sql);

  $rows = array();
  while($row = mysqli_fetch_assoc($result)) {
    $rows[] = $row['Field'];
  }

  return $rows;
}

$col_names = function get_column_names($con, $table);

$ col_names est désormais égal à:

(
    [0] => name
    [1] => parent
    [2] => number
    [3] => chart_id
    [4] => type
    [5] => id
)
duhaime
la source
2

La mysql_list_fieldsfonction pourrait vous intéresser; mais, comme le dit le manuel:

Cette fonction est obsolète. Il est préférable d'utiliser mysql_query()pour émettre une SHOW COLUMNS FROM table [LIKE 'name']instruction SQL à la place.

Pascal MARTIN
la source
Comment fonctionne la fonction si elle n'émet pas de requête SQL au serveur? Pourquoi est-il déconseillé?
Pacerier
2

vous pouvez obtenir la structure complète de la table en utilisant la commande simple suivante.

DESC TableName

ou vous pouvez utiliser la requête suivante.

SHOW COLUMNS FROM TableName
Harish Kumar
la source
2

dans mysql pour obtenir les détails des colonnes et la structure des tableaux en suivant des mots clés ou des requêtes

1.DESC table_name

2.DESCRIBE table_name

3.SHOW COLUMNS FROM table_name

4.SHOW create table table_name;

5.EXPLAIN table_name

denny
la source
2
$col = $db->query("SHOW COLUMNS FROM category");

while ($fildss = $col->fetch_array())
{             
    $filds[] = '"{'.$fildss['Field'].'}"';
    $values[] = '$rows->'.$fildss['Field'].'';
}

if($type == 'value')
{
    return $values = implode(',', $values);
}
else {
     return $filds = implode(',', $filds);
}
ibRQD
la source
1
Pour être plus utile aux futurs utilisateurs, pourriez-vous fournir un contexte pour votre réponse, pas seulement un vidage de code.
Paul Zahra
1

cela a fonctionné pour moi ..

$sql = "desc MyTableName";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>";
}
Ad Kahn
la source
1

J'ai écrit un simple script php pour récupérer les colonnes de la table via PHP: Show_table_columns.php

<?php
$db = 'Database'; //Database name
$host = 'Database_host'; //Hostname or Server ip
$user = 'USER'; //Database user
$pass = 'Password'; //Database user password
$con = mysql_connect($host, $user, $pass);
if ($con) {
    $link = mysql_select_db($db) or die("no database") . mysql_error();
    $count = 0;
    if ($link) {
        $sql = "
            SELECT column_name
            FROM   information_schema.columns
            WHERE  table_schema = '$db'
                   AND table_name = 'table_name'"; // Change the table_name your own table name
        $result = mysql_query($sql, $con);
        if (mysql_query($sql, $con)) {
            echo $sql . "<br> <br>";
            while ($row = mysql_fetch_row($result)) {
                echo "COLUMN " . ++$count . ": {$row[0]}<br>";
                $table_name = $row[0];
            }
            echo "<br>Total No. of COLUMNS: " . $count;
        } else {
            echo "Error in query.";
        }
    } else {
        echo "Database not found.";
    }
} else {
    echo "Connection Failed.";
}
?>

Prendre plaisir!

Cheikh Hussnain
la source
1
Veuillez poster la réponse réelle ici et n'utilisez votre résumé que comme sauvegarde / référence
ChrisF
0

mysqli fetch_field () a fonctionné pour moi:

if ($result = $mysqli -> query($sql)) {
  // Get field information for all fields
  while ($fieldinfo = $result -> fetch_field()) {
    printf("Name: %s\n", $fieldinfo -> name);
    printf("Table: %s\n", $fieldinfo -> table);
    printf("Max. Len: %d\n", $fieldinfo -> max_length);
  }
  $result -> free_result();
}

Source: https://www.w3schools.com/pHP/func_mysqli_fetch_field.asp

David M
la source