it-swarm.com.de

MySQL-Abfrage, um Spaltennamen zu erhalten?

Ich möchte alle MySQL-Tabellennamen in ein Array in PHP aufnehmen.

Gibt es eine Abfrage dafür? 

235
Haroldo

Am besten verwenden Sie die virtuelle Datenbank INFORMATION_SCHEMA / metadata. 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 geben, ohne Text analysieren zu müssen (z. B. Spaltentyp, ob die Spalte nullfähig ist, maximale Spaltengröße, Zeichensatz usw.).

Oh, und es ist Standard SQL (Während SHOW ... eine MySQL-spezifische Erweiterung ist) ...

Weitere Informationen zum Unterschied zwischen SHOW... und Verwendung der INFORMATION_SCHEMA-Tabellen finden Sie in der MySQL Dokumentation zu INFORMATION_SCHEMA im Allgemeinen ...

440
ircmaxell

Sie können folgende Abfrage für MySQL verwenden:

SHOW columns FROM your-table;

Unten ist der 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 von SHOW COLUMNS FROM TABLE finden Sie unter: MySQL Refrence.

172
stillstanding

Anscheinend gibt es zwei Möglichkeiten:

DESCRIBE `tablename`

oder

SHOW COLUMNS FROM `tablename`

Mehr zu DESCRIBE hier: http://dev.mysql.com/doc/refman/5.0/de/describe.html

38
Surreal Dreams

Ich habe das in der Vergangenheit gemacht.

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

Edit: Heute habe ich gelernt, wie man das besser macht. Bitte sehen Sie die Antwort von ircmaxell.


Analysiere die Ausgabe von SHOW COLUMNS FROM table;

Hier mehr darüber: http://dev.mysql.com/doc/refman/5.0/de/show-columns.html

13

Eine alte PHP - Funktion "mysql_list_fields ()" ist veraltet. Heute ist der beste Weg, um Namen von Feldern zu erhalten, eine Abfrage "SHOW COLUMNS FROM Tabellenname [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; }
5
user2558588

Verwenden Sie mysql_fetch_field(), um alle Spaltendaten anzuzeigen. Siehe manual .

$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 seit PHP 5.5.0 veraltet und wird in der Zukunft entfernt."

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

wenn Sie Ihre gesamte Tabellenstruktur mit einigen Feldern überprüfen möchten, verwenden Sie diesen Code. In dieser Abfrage wähle ich column_name, column_type und table_name für weitere Details. Ich benutze 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 doppelte Typen prü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;

 enter image description here

wenn Sie prüfen möchten, in welchem ​​Feld ein 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;

 enter image description here

sie möchten mehr als diesen Link prüfen, helfen Ihnen auch.

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

3
Shafiqul Islam

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

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

Nicht sicher, ob Sie das gesucht haben, aber das hat für mich funktioniert:

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

Dies gibt ein einfaches Array der Spalten-/Variablennamen in Ihrer Tabelle oder Ihrem Array als Zeichenfolgen zurück. Dies war das, was ich zum dynamischen Erstellen von MySQL-Abfragen benötigte. Mein Frust war, dass ich einfach nicht weiß, wie man Arrays in PHP sehr gut indiziert, also war ich mir nicht sicher, was ich mit den Ergebnissen von DESC oder SHOW anfangen sollte. Ich hoffe, meine Antwort ist für Anfänger wie mich hilfreich!

Um das Ergebnis zu überprüfen: print_r($col_names);

2
unami

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

In manchen Fällen kann dies als langsam angesehen werden. Zumindest kann Ihr created_tmp_disk_tables -Wert erhöht werden. Stellen Sie sich eine temporäre Festplattentabelle pro Verbindung oder pro Seitenanforderung vor.

SHOW COLUMNS ist nicht wirklich langsam, möglicherweise weil der Dateisystemcache verwendet wird. Phpmyadmin sagt konstant ~ 0.5ms. Dies ist nichts im Vergleich zu 500ms-1000ms beim Bereitstellen einer WordPress-Seite. Aber es gibt Zeiten, in denen es wichtig ist. Es ist ein Festplattensystem involviert, Sie wissen nie, was passiert, wenn der Server ausgelastet ist, der Cache voll ist, die Festplatte angehalten ist usw.

Das Abrufen von Spaltennamen über SELECT * FROM ... LIMIT 1 betrug ca. ~ 0.1ms, und es kann auch Abfrage-Cache verwendet werden.

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

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 Tabellen keinen Megabyte-Datenbereich enthält, sollte dies problemlos funktionieren.
  • Die Funktionsnamen db_rows und db_row_ar sollten durch Ihre spezifische Datenbankeinrichtung ersetzt werden.
2
Johan

IN 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

wenn Sie PHP verwenden, verwenden Sie diese Gist.

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

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

wenn sql keine Daten zurückgibt, werden auch die Feldnamen aname, bname, anderer Feldname von bangezeigt. _

nur zwei Zeilen:

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

Die einfachste Lösung unter allen Antworten:

DESC `table name`

oder

DESCRIBE `table name`

oder

SHOW COLUMNS FROM `table name`
1
Gil Baggio

Diese Frage ist alt, aber ich habe hier nach einem Weg gesucht, eine bestimmte Abfrage mit ihren Feldnamen auf dynamische Weise zu finden (nicht notwendigerweise nur die Felder einer Tabelle). Und da die Leute dies in anderen verwandten Fragen immer wieder als Antwort auf diese gegebene Aufgabe bezeichnen, teile ich die Art und Weise, wie ich sie gefunden habe, mit den Tipps von 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>";
    }
}

Dies kann leicht geändert werden, um die Feldnamen in ein Array einzufügen.

Mit einem einfachen: $sql="SELECT * FROM myTable LIMIT 1" können Sie die Felder einer beliebigen Tabelle angeben, ohne SHOW COLUMNS oder ein zusätzliches PHP-Modul verwenden zu müssen (Entfernen des Daten-Dump-Teils).

Hoffentlich hilft das jemand anderem.

1
Gusstavv Gil

Diese Abfrage ruft eine Liste aller Spalten in einer Datenbank ab, ohne einen Tabellennamen angeben zu müssen. Es gibt eine Liste nur der Spaltennamen zurück: 

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

Beim Ausführen dieser Abfrage in phpmyadmin wurde jedoch eine Reihe von Fehlern angezeigt. Trotzdem hat es funktioniert. Verwenden Sie es daher mit Vorsicht. 

1
Ignat Ospadov

wenn Sie nur die Feldnamen und -typen benötigen (vielleicht zum einfachen Kopieren in Excel):

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

löschen 

DATA_TYPE='decimal'

wenn Sie alle Datentypen wünschen

0
Amir No-Family

ich bin kein Experte, aber das funktioniert für mich ..

$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