Start · Sprachen · PHP · Referenz · pg_meta_data

pg_meta_data

Funktion

Liefert Metadaten (Spalteninformationen) einer PostgreSQL-Tabelle als assoziatives Array.

seit PHP 4.3.0 Kategorie: db

Signatur

pg_meta_data(PgSql\Connection $connection, string $table_name, bool $extended = false): array|false

Beschreibung

pg_meta_data() ruft Metainformationen zu den Spalten einer angegebenen PostgreSQL-Tabelle ab. Das Ergebnis ist ein assoziatives Array, dessen Schlüssel die Spaltennamen sind. Jeder Eintrag enthält weitere Informationen wie den Datentyp, die Länge und ob die Spalte nicht NULL sein darf.

Die Funktion ist besonders nützlich, wenn man dynamische Formulare, automatisierte Validierungen oder generische Datenbankzugriffs-Schichten erstellt, bei denen man die Tabellenstruktur zur Laufzeit auswerten möchte – ohne manuell information_schema-Abfragen zu schreiben.

Mit dem optionalen Parameter $extended (ab PHP 5.6) kann man erweiterte Informationen anfordern, darunter z. B. die interne PostgreSQL-Typen-ID (typtype), was bei benutzerdefinierten Typen und Enumerationen hilfreich ist.

Schlägt der Aufruf fehl – etwa weil die Tabelle nicht existiert oder die Verbindung ungültig ist –, gibt die Funktion false zurück.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Datenbankverbindung, wie sie von pg_connect() oder pg_pconnect() zurückgegeben wird.
$table_name Pflicht string Der Name der Tabelle, deren Metadaten abgerufen werden sollen. Der Name ist case-sensitiv und kann ein Schema-Präfix enthalten (z. B. 'public.users').
$extended bool false Wenn true, werden erweiterte Typinformationen zurückgegeben, darunter typtype und attisarray. Nützlich beim Arbeiten mit benutzerdefinierten PostgreSQL-Typen oder Enumerationen.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein assoziatives Array zurück, bei dem die Schlüssel die Spaltennamen der Tabelle sind. Jeder Wert ist wiederum ein Array mit folgenden Schlüsseln: num (Spaltenindex), type (PostgreSQL-Typname), len (Länge des Typs), not null (bool), has default (bool), array dims (Anzahl der Array-Dimensionen) und is enum (bool). Bei aktiviertem $extended kommen zusätzliche Felder wie typtype hinzu. Bei einem Fehler wird false zurückgegeben.

Beispiele

Spaltennamen und Typen einer Tabelle ausgeben

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$meta = pg_meta_data($conn, 'users');
if ($meta === false) {
    die('Tabelle nicht gefunden oder Fehler aufgetreten');
}

foreach ($meta as $column => $info) {
    echo "Spalte: $column\n";
    echo "  Typ:       " . $info['type'] . "\n";
    echo "  Not Null:  " . ($info['not null'] ? 'ja' : 'nein') . "\n";
    echo "  Default:   " . ($info['has default'] ? 'ja' : 'nein') . "\n";
    echo "\n";
}

pg_close($conn);
Spalte: id Typ: int4 Not Null: ja Default: ja Spalte: username Typ: varchar Not Null: ja Default: nein Spalte: email Typ: text Not Null: nein Default: nein

Erweiterte Metadaten mit $extended = true abrufen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Erweiterte Informationen anfordern
$meta = pg_meta_data($conn, 'orders', true);
if ($meta === false) {
    die('Fehler beim Abrufen der Metadaten');
}

foreach ($meta as $column => $info) {
    echo "Spalte: $column\n";
    echo "  Typ:      " . $info['type'] . "\n";
    echo "  typtype:  " . ($info['typtype'] ?? 'n/a') . "\n"; // z. B. 'e' für Enum
    echo "  Is Enum:  " . ($info['is enum'] ? 'ja' : 'nein') . "\n";
    echo "\n";
}

pg_close($conn);
Spalte: id Typ: int4 typtype: b Is Enum: nein Spalte: status Typ: order_status typtype: e Is Enum: ja

// Wichtig · Fallstricke

Schemapräfix: Wenn eine Tabelle nicht im Standardschema liegt, muss der vollständige, qualifizierte Name angegeben werden, z. B. 'myschema.mytable'. Andernfalls schlägt die Funktion fehl.

Sicherheit: Übergeben Sie Tabellennamen niemals ungefiltert aus Benutzereingaben. Da der Tabellenname kein gebundener Parameter ist, besteht ein SQL-Injection-Risiko. Verwenden Sie eine Whitelist erlaubter Tabellennamen oder escapen Sie den Namen mit pg_escape_identifier().

PHP 8.1: Ab PHP 8.1 ist der Verbindungsparameter vom Typ PgSql\Connection statt dem früheren resource-Typ. Älterer Code mit resource-Prüfungen muss ggf. angepasst werden.