MySQL-Abfrage zum Abrufen von Spaltennamen?

286

Ich möchte alle Spaltennamen einer MySQL-Tabelle in ein Array in PHP aufnehmen.

Gibt es dafür eine Abfrage?

Haroldo
quelle

Antworten:

512

Am besten verwenden Sie die virtuelle Metadaten-Datenbank INFORMATION_SCHEMA . Insbesondere die Tabelle INFORMATION_SCHEMA.COLUMNS ...

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

Es ist SEHR leistungsfähig und kann Ihnen Tonnen von Informationen liefern, ohne Text analysieren zu müssen (z. B. Spaltentyp, ob die Spalte nullwertfähig ist, maximale Spaltengröße, Zeichensatz usw.) ...

Oh, und es ist Standard-SQL (während SHOW ... es sich um eine MySQL-spezifische Erweiterung handelt) ...

Weitere Informationen über den Unterschied zwischen SHOW...und die Verwendung von INFORMATION_SCHEMATabellen, überprüfen Sie die MySQL - out - Dokumentation auf INFORMATION_SCHEMAallgemein ...

ircmaxell
quelle
27
Es ist nur Standard-SQL, wenn Sie diese dummen MySQL-spezifischen Backticks nicht verwenden, um Tabellennamen zu zitieren. Ich hasse sie, sie lassen meinen Code falsch aussehen.
MarkR
17
@ MarkR Ich habe sie ursprünglich nicht aufgenommen, als ich die Antwort schrieb. Aber dann sah es aus wie eine Wand aus schwarzer Schrift. Also habe ich die Back-Ticks hinzugefügt, um die Syntaxhervorhebung zu nutzen. Ja, ich hätte es auch SET @@SESSION.sql_mode = 'ANSI_QUOTES';vorher haben können, aber das gefällt mir wirklich nicht. Und ich habe kein Problem mit den Back-Ticks für die Abgrenzung der Bezeichner. Tatsächlich mag ich sie besser als doppelte Anführungszeichen (doppelte Anführungszeichen lassen die Abfrage für mich falsch erscheinen) ... Für jeden seine eigenen ...
ircmaxell
2
Das Zitieren der Tabellennamen ist im obigen Beispiel überhaupt nicht erforderlich.
MarkR
20
@ MarkR Ich weiß, dass es nicht ist. Deshalb habe ich gesagt, dass ich sie ursprünglich nicht aufgenommen habe, als ich die Antwort schrieb . Ich habe sie hinzugefügt, um die Syntaxhervorhebung zu nutzen ...
ircmaxell
4
Beachten Sie, dass die Auswahl von InnodDB-Tabellen aus information_schema sehr schmerzhaft langsam sein kann. In einigen Servern mehr als eine Minute
Macjohn
206

Sie können die folgende Abfrage für MYSQL verwenden:

SHOW columns FROM your-table;

Unten finden Sie den Beispielcode, der zeigt, wie die obige Syntax in PHP implementiert wird, um die Namen der Spalten aufzulisten:

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

Einzelheiten zur Ausgabe des SHOW COLUMNS FROM TABLEBesuchs finden Sie unter: MySQL Refrence.

bcosca
quelle
5
Oder ... DESC TableName;;-)
double_j
Gibt es eine Möglichkeit, das Array für weitere Abfragen zu speichern? Möchten Sie die Datenbank nach $ row [4] durchsuchen, um den Wert in der fünften Spalte zu erhalten?
user3866044
43

Es scheint zwei Möglichkeiten zu geben:

DESCRIBE `tablename`

oder

SHOW COLUMNS FROM `tablename`

Mehr dazu DESCRIBEhier: http://dev.mysql.com/doc/refman/5.0/en/describe.html

Surreale Träume
quelle
4
Ahh, DESCRIBEist nur eine Abkürzung für SHOW COLUMNS FROM.
Surreale Träume
7
Und DESCist noch kürzer für DESCRIBE!
Brett Widmeier
21

Ich habe das in der Vergangenheit getan.

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

Verwenden Sie mysql_fetch_field()diese Option , um alle Spaltendaten anzuzeigen. Siehe Handbuch .

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

"Warnung Diese Erweiterung ist ab PHP 5.5.0 veraltet und wird in Zukunft entfernt."

Gavin Simpson
quelle
2
mysqli_num_fields()und mysqli_fetch_field_direct()sind die aktualisierten Methoden
Gusstavv Gil
5

Eine alte PHP-Funktion "mysql_list_fields ()" ist veraltet. Der beste Weg, um Namen von Feldern zu erhalten, ist heute die Abfrage "SHOW COLUMNS FROM table_name [LIKE 'name']". Hier ist ein kleines Beispiel:

$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; }
user2558588
quelle
4
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();
Abdul Gaffar Shah
quelle
4

Ich bin mir nicht sicher, ob Sie danach gesucht haben, aber das hat bei mir funktioniert:

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

Das gibt ein einfaches Array der Spaltennamen / Variablennamen in Ihrer Tabelle oder Ihrem Array als Zeichenfolgen zurück, was ich brauchte, um MySQL-Abfragen dynamisch zu erstellen. Meine Frustration war, dass ich einfach nicht sehr gut weiß, wie man Arrays in PHP indiziert, also war ich mir nicht sicher, was ich mit den Ergebnissen von DESC oder SHOW anfangen sollte. Hoffe meine Antwort ist hilfreich für Anfänger wie mich!

So überprüfen Sie das Ergebnis: print_r($col_names);

useranon
quelle
4

Wenn Sie Ihre gesamte Tabellenstruktur mit einigen Dateien überprüfen möchten, verwenden Sie diesen Code. In dieser Abfrage wähle ich Spaltenname, Spaltentyp und Tabellenname für weitere Details. Ich verwende order by column_type, damit ich es leicht sehen kann.

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

Wenn Sie nur doppelt typisierte Dateien überprüfen möchten, können Sie dies problemlos tun

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;

Geben Sie hier die Bildbeschreibung ein

Wenn Sie überprüfen möchten, in welchem ​​Feld der Nulltyp usw. zulässig ist, können Sie dies verwenden

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;

Geben Sie hier die Bildbeschreibung ein

Sie möchten mehr überprüfen, als dieser Link Ihnen auch hilft.

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

Shafiqul Islam
quelle
Gut. Sehr hilfreich.
Sazzad Hissain Khan
3

SHOW COLUMNS in MySQL 5.1 (nicht 5.5) verwendet eine temporäre Festplattentabelle.

Daher kann es in einigen Fällen als langsam angesehen werden. Zumindest kann es Ihren Wert für created_tmp_disk_tables erhöhen . Stellen Sie sich eine temporäre Festplattentabelle pro Verbindung oder pro Seitenanforderung vor.

SPALTEN ANZEIGEN ist nicht wirklich so langsam, möglicherweise weil es den Dateisystem-Cache verwendet. Phpmyadmin sagt konsequent ~ 0,5ms. Dies ist nichts im Vergleich zu 500 ms bis 1000 ms beim Bereitstellen einer WordPress-Seite. Trotzdem gibt es Zeiten, in denen es darauf ankommt. Es liegt eine Beteiligung des Festplattensystems vor. Sie wissen nie, was passiert, wenn der Server ausgelastet ist, der Cache voll ist, die Festplatte blockiert ist usw.

Das Abrufen von Spaltennamen über SELECT * FROM ... LIMIT 1 betrug ca. 0,1 ms und kann auch den Abfragecache verwenden.

Hier ist mein kleiner optimierter Code, um Spaltennamen aus einer Tabelle abzurufen, ohne wenn möglich show-Spalten zu verwenden:

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

Anmerkungen:

  • Solange die erste Zeile Ihrer Tabelle keinen Megabyte-Datenbereich enthält, sollte dies einwandfrei funktionieren.
  • Die Funktionsnamen db_rows und db_row_ar sollten durch Ihr spezifisches Datenbank-Setup ersetzt werden.
Johan
quelle
Hallo Johan, ich erhalte die Fehlermeldung: Aufruf der undefinierten Funktion db_row_ar (), wenn ich db_columns_ar ('myTableName') ausführe;
KarlosFontana
Entschuldigung, ich werde es im Text klarstellen. Das war ein imaginärer Funktionsname, der für alles steht, was Ihre Datenbankklasse oder Ihr Setup für diese Art von Dingen verwendet.
Johan
3

Probieren Sie dieses aus, ich persönlich benutze es:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
Mohsin
quelle
1
Warum wählen Sie nur die Spaltennamen "stock_id" und "drug_name" aus?
Frank Bryce
arbeitete für mich, aber ohne das "wo ..." Zeug. Mit PDO: $ this-> dbHandle = neues PDO (...); $ query = 'SHOW COLUMNS FROM'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ results as $ result) {// mache etwas mit jedem $ result}
Zaphoid
2

IN WORDPRESS:

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

Diese Frage ist alt, aber ich habe hier nach einer Möglichkeit gesucht, eine bestimmte Abfrage auf dynamische Weise zu finden (nicht unbedingt nur die Felder einer Tabelle). Und da die Leute dies in anderen verwandten Fragen immer wieder als Antwort auf diese bestimmte Aufgabe angeben, teile ich anhand der Tipps von Gavin Simpson die Art und Weise, wie ich festgestellt habe, dass dies möglich ist:

//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>";
    }
}

Dies kann leicht modifiziert werden, um die Feldnamen in ein Array einzufügen.

Verwenden eines einfachen: $sql="SELECT * FROM myTable LIMIT 1"Kann Ihnen die Felder einer beliebigen Tabelle geben, ohne dass Sie SHOW COLUMNSein zusätzliches PHP-Modul verwenden müssen, falls erforderlich (Entfernen des Daten-Dump-Teils).

Hoffentlich hilft das jemand anderem.

Gusstavv Gil
quelle
2

Wenn Sie PHP verwenden, verwenden Sie dieses Wesentliche .

Es kann ausgewählte Felder mit vollständigen Informationen ohne Ergebnis erhalten , und alle benutzerdefinierten Felder wie:

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

Wenn über SQL keine Daten zurückgegeben werden, werden auch die Feldnamen aname, bname und der andere Feldname von b angezeigt

nur zwei Zeilen:

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

Diese Abfrage ruft eine Liste aller Spalten in einer Datenbank ab, ohne dass ein Tabellenname angegeben werden muss. Es wird nur eine Liste mit Spaltennamen zurückgegeben:

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

Als ich diese Abfrage in phpmyadmin ausführte, wurden jedoch eine Reihe von Fehlern angezeigt. Trotzdem hat es funktioniert. Verwenden Sie es daher mit Vorsicht.


quelle
2

Die einfachste Lösung aller Antworten:

DESC `table name`

oder

DESCRIBE `table name`

oder

SHOW COLUMNS FROM `table name`
Gil Baggio
quelle
2

Wenn Sie nur die Feldnamen und -typen benötigen (möglicherweise zum einfachen Einfügen in Excel):

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

entfernen

DATA_TYPE='decimal'

wenn Sie alle Datentypen wollen

Amir No-Family
quelle
1

Ich bin kein Experte, aber das funktioniert bei mir ..

$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>";}    

}
Ad Kahn
quelle
0

Ich habe diese Abfrage in SQL Server ausprobiert und dies hat bei mir funktioniert:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Purvi Barot
quelle