Tabellenspaltennamen in MySQL abrufen?

301

Gibt es eine Möglichkeit, den Spaltennamen einer Tabelle in MySQL abzurufen? mit php

Ein Angestellter
quelle

Antworten:

537

Sie können DESCRIBE verwenden :

DESCRIBE my_table;

Oder in neueren Versionen können Sie INFORMATION_SCHEMA verwenden :

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

Oder Sie können SHOW COLUMNS verwenden :

SHOW COLUMNS FROM my_table;
Greg
quelle
14
DESCRIBE ist eigentlich eine Abkürzung für SHOW COLUMNS ( dev.mysql.com/doc/refman/5.0/en/describe.html )
Svens
11
Ich würde für die Information_Schema-Version stimmen, da diese Syntax von den meisten wichtigen Datenbanken unterstützt wird. Am besten lernst du nur 1 Weg, wenn du musst.
Kibbee
3
+1 Ich wollte Tabellennamen auswählen, in denen eine Spalte vorhanden istSELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND COLUMN_NAME = 'col_name';
AL̲̳I
2
Speichern Sie Bytes mit desc my_table;:-)
Alfonso Pérez
3
DESCfür beschreiben kann leicht mit DESCfür absteigend verwechselt werden . Die nominelle Anzahl von Bytes, die Sie aufgrund mangelnder Lesbarkeit speichern, ist es nicht wert.
Jacques Mathieu
34

Die folgenden SQL-Anweisungen sind nahezu gleichwertig:

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']

Referenz: INFORMATION_SCHEMA COLUMNS

OMG Ponys
quelle
1
Warum sagst du "fast"?
Pacerier
2
@Pacerier Zum einen funktioniert die zweite nicht als Unterabfrage.
WAF
@WAF, ich denke er meinte etwas ganz anderes, nicht das.
Pacerier
2
Gibt in meinem Schnelltest SHOW COLUMNSeine Tabelle zurück, die die Spaltennamen, -typen usw. enthält, während SELECT COLUMN NAMEnur die Spaltennamen zurückgegeben werden.
mwfearnley
20

Ich habe eine PDO-Funktion erstellt, die alle Spaltennamen in einem einfachen Array zurückgibt.

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);
    }
}

Die Ausgabe wird ein Array sein:

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

Entschuldigung für den Nekro, aber ich mag meine Funktion;)

PS Ich habe die Klasse Core nicht aufgenommen, aber Sie können Ihre eigene Klasse verwenden. DS

Philip
quelle
Was ist mit dem Großbuchstabenfetisch?
Pacerier
Es ist nichts Falsches daran, eine alte Frage zu Stack Overflow zu beantworten.
BDSL
1
Vielen Dank. Für die Ausgabe habe ich Folgendes verwendet: $ column = $ stmt-> fetchAll (\ PDO :: FETCH_ASSOC); return array_column ($ columns, 'COLUMN_NAME');
Ehsan
6

Diese Lösung stammt aus der Kommandozeilen-MySQL

mysql>USE information_schema;

In der folgenden Abfrage ändern Sie einfach <--DATABASE_NAME--> in Ihre Datenbank und <--TABLENAME--> in Ihren Tabellennamen, in dem Sie nur Feldwerte der DESCRIBE-Anweisung wünschen

mysql> SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = '<--DATABASE_NAME-->' AND   TABLE_NAME='<--TABLENAME-->';
Leela
quelle
4

Es gibt auch dies, wenn Sie es vorziehen:

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

Wie wäre es damit:

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
quelle
4

Es ist auch interessant zu bemerken, dass Sie verwenden können,
EXPLAIN table_namewas gleichbedeutend ist mit DESCRIBE table_nameund SHOW COLUMNS FROM table_name obwohl EXPLAIN häufiger verwendet wird, um Informationen über den Abfrageausführungsplan zu erhalten.

AnthonyS
quelle
3

Einblick in:

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

Die MySQL-Funktion Beschreibungstabelle sollte Sie dahin bringen, wo Sie hin möchten (geben Sie Ihren Tabellennamen für "Tabelle" ein). Sie müssen die Ausgabe etwas analysieren, aber es ist ziemlich einfach. Wenn Sie diese Abfrage ausführen, hat das PHP-Abfrageergebnis, das auf Funktionen zugreift, die Ihnen normalerweise ein Schlüssel-Wert-Paar geben würden, die Spaltennamen als Schlüssel. Aber es ist schon eine Weile her, dass ich PHP verwendet habe, also halte mich nicht daran fest. :) :)

dannysauer
quelle
Es gibt einige ziemlich gute Dokumente bei php.net in us3.php.net/manual/en/function.mysql-list-fields.php
dannysauer
3

Sie können auch auschecken mysql_fetch_array(), wie in:

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

Ich brauchte Spaltennamen als flaches Array, während die anderen Antworten assoziative Arrays zurückgaben, also verwendete ich:

$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 ist jetzt gleich:

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

Die mysql_list_fieldsFunktion könnte Sie interessieren; aber wie im Handbuch heißt es:

Diese Funktion ist veraltet. Es ist vorzuziehen, stattdessen mysql_query()eine SQL- SHOW COLUMNS FROM table [LIKE 'name']Anweisung auszugeben.

Pascal MARTIN
quelle
Wie funktioniert die Funktion, wenn keine SQL-Abfrage an den Server ausgegeben wird? Warum wird es veraltet?
Pacerier
2

Sie können die gesamte Tabellenstruktur mit dem folgenden einfachen Befehl abrufen.

DESC TableName

oder Sie können folgende Abfrage verwenden.

SHOW COLUMNS FROM TableName
Harish Kumar
quelle
2

in MySQL, um Spalten Details und Tabellenstruktur durch Folgen von Schlüsselwörtern oder Abfragen zu erhalten

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
quelle
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
quelle
1
Um zukünftigen Benutzern hilfreicher zu sein, geben Sie bitte einen Kontext für Ihre Antwort an, nicht nur einen Code-Dump.
Paul Zahra
1

das hat bei mir funktioniert ..

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

Ich habe ein einfaches PHP-Skript geschrieben, um Tabellenspalten über PHP abzurufen : 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.";
}
?>

Genießen!

Hussnain Scheich
quelle
1
Bitte posten Sie die aktuelle Antwort hier und verwenden Sie Ihren Kern nur als Backup / Referenz
ChrisF
0

mysqli fetch_field () hat für mich gearbeitet:

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();
}

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

David M.
quelle