php pdo: Holen Sie sich den Spaltennamen einer Tabelle

Lesezeit: 6 Minuten

php pdo Holen Sie sich den Spaltennamen einer Tabelle
Laufen

Wie kann ich mit PDO alle Spaltennamen aus einer Tabelle abrufen?

id         name        age
1          Alan        35      
2          Alex        52
3          Amy         15

Die Informationen, die ich erhalten möchte, sind

id         name        age

BEARBEITEN:

Hier mein Versuch,

$db = $connection->get_connection();
$select = $db->query('SELECT * FROM contacts');

$total_column = $select->columnCount();
var_dump($total_column);

for ($counter = 0; $counter < $total_column; $counter ++) {
    $meta = $select->getColumnMeta($counter);
    $column[] = $meta['name'];
}
print_r($column);

Dann bekomme ich,

Array
(
    [0] => id
    [1] => name
    [2] => age
    ...

)

  • Möchten Sie die Spaltennamen in ein Tischoder die Spaltennamen im Datensatz aus einer Abfrage? Dies sind zwei verschiedene Dinge, die auf zwei verschiedene Arten ausgeführt werden. Phils Antwort erfüllt ersteres, JapanPros Antwort erfüllt letzteres!

    – Karl

    25. März 2011 um 3:37 Uhr


  • @charles: Ich glaube, ich möchte nur die Spaltennamen in einer Tabelle abrufen. Ich verstehe nicht ganz was du meinst Spaltennamen im Datensatz aus einer Abfrage. aber siehe meine Antwort in meiner Bearbeitung oben. Danke.

    – Laufen

    25. März 2011 um 4:09 Uhr


  • @lauthiamkok: Das machst du in deinem aktualisierten Beitrag – du machst eine Abfrage, die eine Reihe von Datensätzen zurückgibt, und dann greifst du die Spaltennamen für diesen bestimmten Satz. Es kommt einfach vor, dass die Spaltennamen in Ihrer Ergebnismenge mit denen in Ihrer Tabelle identisch sind. Denken Sie daran, dass SQL-Spalten Aliasnamen haben können.

    – Karl

    25. März 2011 um 4:13 Uhr


  • @lauthiamkok, wenn Sie versucht haben, die Spaltennamen aus einer Tabelle abzurufen, ist die Antwort von @JapanPro unten der beste Weg, dies zu tun – mit der information_schema Methode. Was machst du macht den Job ist aber nicht der “richtige” Weg.

    – Karl

    25. März 2011 um 4:26 Uhr

  • Wenn Sie eine leere Tabelle haben, schlägt Ihre Methode fehl, da es keine Datensätze gibt, aus denen Sie die Spalten abrufen können.

    – Funke

    15. Dezember 2011 um 21:32 Uhr

php pdo Holen Sie sich den Spaltennamen einer Tabelle
Jesper Grann Laursen

Ich löse das Problem folgendermaßen (nur MySQL)

$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);

  • Dies wird nur von MySQL unterstützt.

    – Tom McDonald

    23. März 2012 um 16:44 Uhr

  • warum nicht $q = $dbh->query("DESCRIBE tablename"); $table_fields = $q->fetchAll(PDO::FETCH_COLUMN);?

    – Francisco Presencia

    10. Januar 2013 um 17:34 Uhr


  • Leser, eine generische Lösung finden Sie unter @Will answer.

    – Peter Krauß

    3. Juli 2013 um 11:22 Uhr

  • IMHO, obwohl diese Antwort für viele nützlich sein kann, entspricht sie nicht der in der Frage ausgedrückten Notwendigkeit, dh “Gibt es eine Möglichkeit, den Spaltennamen aus dem Rowset-Array abzurufen, während ich Daten iteriere?” Der Benutzer möchte den Schlüssel im Array sehen, während er Werte iteriert. Die Funktion key($array) kann helfen.

    – ManuelJE

    13. Dezember 2018 um 15:08 Uhr

1646264047 775 php pdo Holen Sie sich den Spaltennamen einer Tabelle
Wille

Dies funktioniert für MySQL, Postgres und wahrscheinlich jeden anderen PDO-Treiber, der die verwendet LIMIT Klausel.

Notiz LIMIT 0 wird für verbesserte Leistung hinzugefügt:

$rs = $db->query('SELECT * FROM my_table LIMIT 0');
for ($i = 0; $i < $rs->columnCount(); $i++) {
    $col = $rs->getColumnMeta($i);
    $columns[] = $col['name'];
}
print_r($columns);

  • Danke Will! Hallo Leser, das ist die generische PDO-Lösung! Die Lauer-Lösung, die nur von MySQL — und PDOStatement::getColumnMeta() unterstützt wird, ist komplex, wird nicht von allen PDO-Treibern unterstützt und wird als experimentell aufgeführt. PS: die Abfrage läuft auch mit leeren Tabellen.

    – Peter Krauß

    3. Juli 2013 um 11:14 Uhr


  • Vereinfachen Sie vielleicht mit etwas wie $columns = array_keys($rs->fetchAll(PDO::FETCH_ASSOC));… Ich versuche es nicht.

    – Peter Krauß

    3. Juli 2013 um 11:33 Uhr


  • @PeterKrauss, ja, es braucht mindestens ein Ergebnis.

    – David d C e Freitas

    22. April 2014 um 3:42 Uhr

  • @DaviddCeFreitas, entschuldige die Methode getColumnMeta eine 6+ Jahre alte “ist EXPERIMENTAL”-Warnung haben … Die einzige Möglichkeit besteht darin, eine nicht leere Tabelle zu verwenden. Sie können so etwas wie verwenden SELECT * FROM my_table WHERE id=0 und füllen Sie alle Tabellen mit einer Zeile ohne Daten.

    – Peter Krauß

    22. April 2014 um 8:45 Uhr


  • LIMIT 0 ist eine MySQL/PGSQL-spezifische Syntax. Wie ist das generisch? Wie macht man das?

    – Ber

    8. Mai 2016 um 2:52 Uhr


Meine 2 Cent:

$result = $db->query('select * from table limit 1');
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));

Und Sie erhalten die Spaltennamen als Array in den var $fields.

  • Dies erzeugt eine Warnung, wenn die Tabelle leer ist! ===> “Warnung: array_keys() erwartet, dass Parameter 1 ein Array ist, bool gegeben in…”

    – Oliver M Grech

    10. April 2021 um 22:13 Uhr

1646264048 505 php pdo Holen Sie sich den Spaltennamen einer Tabelle
Pramendra Gupta

$sql = “Spaltenname aus information_schema.columns auswählen, wobei Tabellenname=”myTable””;

Credits der PHP-Funktion: http://www.sitepoint.com/forums/php-application-design-147/get-pdo-column-name-easy-way-559336.html

function getColumnNames()
{
    $sql = "SELECT column_name FROM information_schema.columns WHERE table_name="myTable"";
    #$sql="SHOW COLUMNS FROM " . $this->table;
    $stmt = $this->connection->prepare($sql);
    try {
        if ($stmt->execute())
        {
            $raw_column_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach($raw_column_data as $outer_key => $array)
            {
                foreach($array as $inner_key => $value
                {
                    if (!(int)$inner_key)
                    {
                        $this->column_names[] = $value;
                    }
                }
            }
        }
        return $this->column_names;
    }
    catch (Exception $e)
    {
        return $e->getMessage(); //return exception
    }
}

Hier ist die Funktion, die ich verwende. Erstellt basierend auf der obigen Antwort von @ Lauer und einigen anderen Ressourcen:

//Get Columns
function getColumns($tablenames) {
global $hostname , $dbnames, $username, $password;
try {
$condb = new PDO("mysql:host=$hostname;dbname=$dbnames", $username, $password);

//debug connection
$condb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$condb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// get column names
$query = $condb->prepare("DESCRIBE $tablenames");
$query->execute();
$table_names = $query->fetchAll(PDO::FETCH_COLUMN);
return $table_names;

//Close connection
$condb = null;

} catch(PDOExcepetion $e) {
echo $e->getMessage();
}
}

Anwendungsbeispiel:

$columns = getColumns('name_of_table'); // OR getColumns($name_of_table); if you are using variable.

foreach($columns as $col) {
echo $col . '<br/>';
}

1646264049 435 php pdo Holen Sie sich den Spaltennamen einer Tabelle
David

Dies ist eine alte Frage, aber hier ist mein Beitrag

function getColumns($dbhandle, $tableName) {
    $columnsquery = $dbhandle->query("PRAGMA table_info($tableName)");
    $columns = array();
    foreach ($columnsquery as $k) {
        $columns[] = $k['name'];
    }
    return $columns;
}

Setzen Sie einfach Ihre Variable für Ihr PDO-Objekt und den Tabellennamen. Funktioniert bei mir

Dieser Ansatz funktioniert für mich in SQLite und MySQL. Bei anderen funktioniert es vielleicht, bitte teilen Sie mir Ihre Erfahrungen mit.

  • Funktioniert, wenn Zeilen vorhanden sind
  • Funktioniert, wenn keine Zeilen vorhanden sind (testen Sie mit DELETE FROM table)

Code:

$calendarDatabase = new \PDO('sqlite:calendar-of-tasks.db');    
$statement = $calendarDatabase->query('SELECT *, COUNT(*) FROM data LIMIT 1');
$columns = array_keys($statement->fetch(PDO::FETCH_ASSOC));
array_pop($columns);
var_dump($columns);

Ich gebe keine Garantie dafür, dass dies gültiges SQL nach ANSI oder anderem ist, aber es funktioniert für mich.

  • Wie leistungsfähig wird dies sein, wenn die Datenbank 284.000 Zeilen enthält?

    – Mike32

    27. Dezember 2018 um 5:37 Uhr

  • @ miken32 danke für diesen Hinweis. Aktualisierter Code, um mit Datenbanken beliebiger Größe zu arbeiten

    – Wilhelm Entriken

    27. Dezember 2018 um 5:40 Uhr

917290cookie-checkphp pdo: Holen Sie sich den Spaltennamen einer Tabelle

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy