Start · Sprachen · PHP · Referenz · pg_set_error_verbosity

pg_set_error_verbosity

Funktion

Bestimmt den Detaillierungsgrad von Fehlermeldungen, die von <code>pg_last_error</code> und <code>pg_result_error</code> zurückgegeben werden.

seit PHP 5.1.0 Kategorie: db

Signatur

pg_set_error_verbosity(PgSql\Connection $connection, int $verbosity): int

Beschreibung

pg_set_error_verbosity legt fest, wie ausführlich PostgreSQL-Fehlermeldungen sein sollen, die über pg_last_error und pg_result_error abgerufen werden. Die Einstellung wirkt sich auf alle nachfolgenden Fehler innerhalb der angegebenen Datenbankverbindung aus.

Es stehen drei Detaillierungsgrade zur Verfügung: PGSQL_ERRORS_TERSE liefert nur die wichtigsten Informationen (Schweregrad, Primärnachricht, Position), PGSQL_ERRORS_DEFAULT ist der Standardwert und enthält zusätzlich Details, Hinweise, Kontextinformationen und die Datei-/Zeilenangabe des Fehlers, während PGSQL_ERRORS_VERBOSE alle verfügbaren Felder der Fehlermeldung einschließt.

Diese Funktion ist besonders nützlich beim Debuggen komplexer PostgreSQL-Abfragen oder gespeicherter Prozeduren, bei denen ausführliche Fehlermeldungen schnell zur Fehlerursache führen. In Produktionsumgebungen empfiehlt sich hingegen PGSQL_ERRORS_TERSE, um keine internen Datenbankdetails nach außen zu geben.

Die Funktion gibt den zuvor gültigen Detaillierungsgrad zurück, sodass er bei Bedarf wiederhergestellt werden kann.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Datenbankverbindung, die zuvor mit pg_connect oder pg_pconnect geöffnet wurde.
$verbosity Pflicht int Der gewünschte Detaillierungsgrad. Mögliche Werte sind PGSQL_ERRORS_TERSE, PGSQL_ERRORS_DEFAULT und PGSQL_ERRORS_VERBOSE.

Rückgabewert

Typ
int
Beschreibung
Gibt den vorherigen Detaillierungsgrad zurück (PGSQL_ERRORS_TERSE, PGSQL_ERRORS_DEFAULT oder PGSQL_ERRORS_VERBOSE), sodass er bei Bedarf wiederhergestellt werden kann.

Beispiele

Detaillierte Fehlermeldungen beim Debuggen aktivieren

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');

if (!$conn) {
    die('Verbindung fehlgeschlagen.');
}

// Ausführliche Fehlermeldungen für Debugging aktivieren
$previousVerbosity = pg_set_error_verbosity($conn, PGSQL_ERRORS_VERBOSE);

// Fehlerhafte Abfrage absichtlich ausführen
$result = pg_query($conn, 'SELECT * FROM nicht_vorhandene_tabelle');

if (!$result) {
    echo 'Fehler: ' . pg_last_error($conn) . PHP_EOL;
}

// Vorherigen Detaillierungsgrad wiederherstellen
pg_set_error_verbosity($conn, $previousVerbosity);

pg_close($conn);
Fehler: ERROR: relation "nicht_vorhandene_tabelle" does not exist LINE 1: SELECT * FROM nicht_vorhandene_tabelle ^ LOCATION: parserOpenTable, parse_relation.c:1159

Minimale Fehlermeldungen in der Produktionsumgebung

<?php
$conn = pg_connect('host=localhost dbname=produktionsdb user=app password=sicher');

if (!$conn) {
    die('Verbindung fehlgeschlagen.');
}

// In Produktion: nur knappe Fehlermeldungen verwenden
pg_set_error_verbosity($conn, PGSQL_ERRORS_TERSE);

$result = pg_query($conn, 'SELECT id FROM benutzer WHERE aktiv = TRUE');

if (!$result) {
    // Knappe Fehlermeldung – keine internen Details werden preisgegeben
    error_log('DB-Fehler: ' . pg_last_error($conn));
    echo 'Ein Datenbankfehler ist aufgetreten. Bitte versuchen Sie es später erneut.';
} else {
    while ($row = pg_fetch_assoc($result)) {
        echo 'Benutzer-ID: ' . $row['id'] . PHP_EOL;
    }
}

pg_close($conn);

// Wichtig · Fallstricke

Sicherheitshinweis: In Produktionsumgebungen sollte PGSQL_ERRORS_TERSE oder PGSQL_ERRORS_DEFAULT verwendet werden. PGSQL_ERRORS_VERBOSE kann interne Datenbankstrukturdetails (wie Dateinamen und Zeilennummern im PostgreSQL-Quellcode) offenlegen, die einem Angreifer nützliche Informationen liefern könnten.

Die Einstellung gilt pro Verbindung und wird nicht global gespeichert. Bei der Verwendung von Verbindungs-Pools sollte der Detaillierungsgrad nach Bedarf neu gesetzt werden.

Ab PHP 8.1 ist der erste Parameter vom Typ PgSql\Connection (ein Objekt) anstelle der früheren Ressource. Älterer Code, der eine Ressource übergibt, ist jedoch weiterhin kompatibel.