Signatur
Beschreibung
pg_field_table() ermittelt zu einem Feld eines PostgreSQL-Abfrageergebnisses, aus welcher Tabelle dieses Feld stammt. Das ist besonders dann nützlich, wenn eine Abfrage mehrere Tabellen über einen JOIN verbindet und man zur Laufzeit feststellen möchte, welchem Ursprungsobjekt ein bestimmtes Ergebnisfeld zuzuordnen ist.
Standardmäßig gibt die Funktion den Tabellennamen als String zurück. Wird der dritte Parameter $oid_only auf true gesetzt, liefert die Funktion stattdessen die OID der Tabelle als Integer – was effizienter sein kann, wenn der Name nicht benötigt wird oder wenn man die OID direkt für weitere PostgreSQL-Systemabfragen (z. B. gegen pg_class) verwenden möchte.
Der Parameter $field ist nullbasiert, das heißt das erste Feld hat den Index 0. Felder, die keiner realen Tabelle zugeordnet sind (z. B. berechnete Ausdrücke oder Aggregatfunktionen), liefern false zurück.
Die Funktion ist ausschließlich für PostgreSQL-Verbindungen gedacht und arbeitet mit dem Ergebnis-Handle, das von Funktionen wie pg_query() oder pg_execute() zurückgegeben wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | PgSql\Result | Ein PostgreSQL-Ergebnisobjekt, das von pg_query(), pg_query_params() oder pg_execute() zurückgegeben wurde. |
|
| $field Pflicht | int | Nullbasierter Index des Feldes im Ergebnis. Das erste Feld hat den Index 0. |
|
| $oid_only | bool | false | Wenn true, wird die OID der Tabelle als Integer zurückgegeben anstelle des Tabellennamens als String. |
Rückgabewert
string zurück, wenn $oid_only false ist. Gibt die OID als int zurück, wenn $oid_only true ist. Gibt false zurück, wenn das Feld keiner Tabelle zugeordnet ist (z. B. bei berechneten Ausdrücken) oder ein Fehler aufgetreten ist.Beispiele
Tabellennamen eines Feldes aus einem JOIN-Ergebnis ermitteln
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
$result = pg_query($conn, 'SELECT u.id, u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id LIMIT 1');
if (!$result) {
die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}
$feldAnzahl = pg_num_fields($result);
for ($i = 0; $i < $feldAnzahl; $i++) {
$feldName = pg_field_name($result, $i);
$tabellenName = pg_field_table($result, $i);
echo "Feld '{$feldName}' stammt aus Tabelle: {$tabellenName}\n";
}
pg_free_result($result);
pg_close($conn);
OID der Tabelle statt des Namens abrufen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
$result = pg_query($conn, 'SELECT id, name FROM users LIMIT 1');
if (!$result) {
die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}
// OID des zweiten Feldes ('name') abrufen
$oid = pg_field_table($result, 1, true);
if ($oid === false) {
echo "Feld ist keiner Tabelle zugeordnet.\n";
} else {
echo "OID der Tabelle: {$oid}\n";
// OID für eine Systemabfrage verwenden
$metaResult = pg_query_params($conn, 'SELECT relname FROM pg_class WHERE oid = $1', [$oid]);
$row = pg_fetch_assoc($metaResult);
echo "Tabellenname via pg_class: " . $row['relname'] . "\n";
}
pg_free_result($result);
pg_close($conn);
// Wichtig · Fallstricke
Berechnete Felder: Felder, die aus Ausdrücken, Aggregatfunktionen (z. B. COUNT(*), SUM()) oder Aliasen ohne Tabellenbezug bestehen, sind keiner Tabelle zugeordnet. In diesen Fällen gibt pg_field_table() false zurück — prüfen Sie den Rückgabewert daher immer mit === false.
OID-Stabilität: OIDs in PostgreSQL sind innerhalb einer Datenbankinstanz eindeutig, können sich aber nach einem pg_dump/pg_restore-Zyklus ändern. Verlassen Sie sich für dauerhaft gespeicherte Referenzen lieber auf den Tabellennamen.
Namensänderungen im API: Vor PHP 8.1 war der Typ des ersten Parameters resource anstelle von PgSql\Result. Ab PHP 8.1 wird das objektorientierte PgSql\Result-Handle verwendet.