Signatur
Beschreibung
pg_result_error_field() ermöglicht es, einzelne strukturierte Felder einer PostgreSQL-Fehlermeldung abzufragen, die bei einem fehlgeschlagenen Datenbankaufruf entstanden ist. Im Unterschied zu pg_result_error(), das die gesamte Fehlermeldung als Text zurückgibt, erlaubt diese Funktion den gezielten Zugriff auf einzelne Bestandteile wie SQLSTATE-Code, Detailnachrichten, Hints oder Zeilennummern.
Die verfügbaren Felder werden über vordefinierte Konstanten adressiert, z. B. PGSQL_DIAG_SEVERITY, PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY, PGSQL_DIAG_MESSAGE_DETAIL, PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION und weitere. Diese Felder entsprechen direkt der PostgreSQL-libpq-Struktur PGresult.
Diese Funktion ist besonders nützlich, wenn Anwendungen auf spezifische Fehlertypen reagieren müssen, etwa bei Constraint-Verletzungen (SQLSTATE 23505 für eindeutige Schlüssel), ohne die Fehlermeldung parsen zu müssen. So lässt sich fehlerresistenter und wartbarer Datenbankcode schreiben.
Steht das angeforderte Feld nicht zur Verfügung, gibt die Funktion null zurück. Wurde keine Fehlerkondition ausgelöst, wird ebenfalls null geliefert.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | PgSql\Result | Eine PostgreSQL-Ergebnis-Instanz (PgSql\Result), die von Funktionen wie pg_query(), pg_execute() oder pg_get_result() zurückgegeben wurde — typischerweise ein fehlgeschlagenes Ergebnis. |
|
| $field_code Pflicht | int | Eine der vordefinierten PGSQL_DIAG_*-Konstanten, die das gewünschte Fehlerfeld identifiziert, z. B. PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY oder PGSQL_DIAG_SOURCE_LINE. |
Rückgabewert
string zurück. Gibt null zurück, wenn das Feld nicht vorhanden ist oder kein Fehler vorliegt. Gibt false zurück bei einem ungültigen result-Parameter.Beispiele
SQLSTATE-Code eines Unique-Constraint-Fehlers auslesen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Tabelle mit eindeutigem Index anlegen (einmalig)
// CREATE TABLE benutzer (id SERIAL PRIMARY KEY, email TEXT UNIQUE);
// Ersten Eintrag einfügen
pg_query($conn, "INSERT INTO benutzer (email) VALUES ('test@example.com')");
// Doppelten Eintrag einfügen — löst Fehler aus
$result = pg_query($conn, "INSERT INTO benutzer (email) VALUES ('test@example.com')");
if ($result === false) {
$result = pg_get_result($conn);
}
// Strukturierte Fehlerfelder auslesen
$sqlstate = pg_result_error_field($result, PGSQL_DIAG_SQLSTATE);
$primary = pg_result_error_field($result, PGSQL_DIAG_MESSAGE_PRIMARY);
$detail = pg_result_error_field($result, PGSQL_DIAG_MESSAGE_DETAIL);
echo "SQLSTATE: $sqlstate\n";
echo "Fehler: $primary\n";
if ($detail !== null) {
echo "Detail: $detail\n";
}
// Gezielte Reaktion auf Unique-Violation
if ($sqlstate === '23505') {
echo "Hinweis: Diese E-Mail-Adresse ist bereits registriert.\n";
}
pg_close($conn);
Alle verfügbaren Diagnosefelder ausgeben
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
$result = pg_query($conn, 'SELECT * FROM nicht_existente_tabelle');
if ($result === false) {
// Bei synchronen Abfragen liefert pg_query() false;
// pg_get_result() nutzen für den PgSql\Result-Handle
// Alternativ: Verbindungsobjekt für Fehlerfelder nutzen
$result = pg_get_result($conn);
}
$felder = [
PGSQL_DIAG_SEVERITY => 'Schweregrad',
PGSQL_DIAG_SQLSTATE => 'SQLSTATE',
PGSQL_DIAG_MESSAGE_PRIMARY => 'Hauptnachricht',
PGSQL_DIAG_MESSAGE_DETAIL => 'Detail',
PGSQL_DIAG_MESSAGE_HINT => 'Hinweis',
PGSQL_DIAG_STATEMENT_POSITION => 'Position',
PGSQL_DIAG_SOURCE_FILE => 'Quelldatei',
PGSQL_DIAG_SOURCE_LINE => 'Quellzeile',
PGSQL_DIAG_SOURCE_FUNCTION => 'Quellfunktion',
];
foreach ($felder as $konstante => $bezeichnung) {
$wert = pg_result_error_field($result, $konstante);
if ($wert !== null) {
echo "$bezeichnung: $wert\n";
}
}
pg_close($conn);
// Wichtig · Fallstricke
Wichtig: Diese Funktion erfordert ein gültiges PgSql\Result-Objekt. Gibt pg_query() direkt false zurück, muss pg_get_result() verwendet werden, um ein auswertbares Ergebnis-Objekt zu erhalten.
Die verfügbaren PGSQL_DIAG_*-Konstanten hängen von der zur Kompilierzeit verwendeten libpq-Version ab. Auf älteren PostgreSQL-Installationen können bestimmte Felder fehlen und null zurückliefern.
Sicherheit: Fehlermeldungsfelder wie PGSQL_DIAG_MESSAGE_DETAIL können sensible Informationen über Datenbankstruktur oder Datenwerte enthalten. Diese sollten niemals ungeprüft an den Browser ausgegeben werden — stets nur intern protokollieren.