Start · Sprachen · PHP · Referenz · pg_set_error_context_visibility

pg_set_error_context_visibility

Funktion

Legt fest, ob Kontext-Informationen in PostgreSQL-Fehlermeldungen sichtbar sind, und gibt die vorherige Einstellung zurück.

seit PHP 8.1.0 Kategorie: db

Signatur

pg_set_error_context_visibility(PgSql\Connection $connection, int $visibility): int

Beschreibung

pg_set_error_context_visibility() steuert, ob PostgreSQL bei Fehlern zusätzliche Kontext-Informationen (z. B. Stack-Traces aus PL/pgSQL-Funktionen oder gespeicherten Prozeduren) in die Fehlermeldung einbettet. Diese Kontextzeilen können bei der Fehlersuche sehr hilfreich sein, sollen aber in Produktivumgebungen möglicherweise nicht nach außen weitergegeben werden.

Die Funktion erwartet eine aktive PostgreSQL-Verbindung sowie einen der Sichtbarkeits-Konstanten PGSQL_ERRORS_TERSE, PGSQL_ERRORS_DEFAULT oder PGSQL_ERRORS_VERBOSE. Mit PGSQL_ERRORS_TERSE werden Kontextzeilen unterdrückt, während PGSQL_ERRORS_DEFAULT und PGSQL_ERRORS_VERBOSE diese ausgeben.

Der Rückgabewert ist die zuvor aktive Einstellung, sodass sie nach einem temporären Wechsel problemlos wiederhergestellt werden kann. Dies ist besonders dann nützlich, wenn man den Kontext nur für einzelne kritische Abschnitte ein- oder ausschalten möchte.

Zu beachten ist, dass diese Funktion eng mit pg_set_error_verbosity() verwandt ist, die den allgemeinen Detailgrad der Fehlermeldungen steuert. Beide Funktionen agieren auf derselben libpq-Verbindung und ergänzen einander.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Verbindungsinstanz, wie sie von pg_connect() oder pg_pconnect() zurückgegeben wird.
$visibility Pflicht int Der gewünschte Sichtbarkeitsgrad. Erlaubte Werte sind die Konstanten PGSQL_SHOW_CONTEXT_NEVER, PGSQL_SHOW_CONTEXT_ERRORS und PGSQL_SHOW_CONTEXT_ALWAYS.

Rückgabewert

Typ
int
Beschreibung
Gibt die zuvor aktive Sichtbarkeitseinstellung als Integer-Konstante zurück (PGSQL_SHOW_CONTEXT_NEVER, PGSQL_SHOW_CONTEXT_ERRORS oder PGSQL_SHOW_CONTEXT_ALWAYS), damit diese bei Bedarf wiederhergestellt werden kann.

Beispiele

Kontext-Sichtbarkeit temporär deaktivieren

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

// Vorherige Einstellung merken und Kontext-Ausgabe deaktivieren
$previous = pg_set_error_context_visibility($conn, PGSQL_SHOW_CONTEXT_NEVER);

// Eine fehlerhafte Abfrage ausführen
$result = @pg_query($conn, 'SELECT * FROM nicht_vorhanden');
if (!$result) {
    // Fehlermeldung enthält nun keinen Kontext-Stack
    echo 'Fehler: ' . pg_last_error($conn) . PHP_EOL;
}

// Ursprüngliche Einstellung wiederherstellen
pg_set_error_context_visibility($conn, $previous);

pg_close($conn);
Fehler: ERROR: relation "nicht_vorhanden" does not exist

Kontext-Ausgabe für Debug-Zwecke dauerhaft aktivieren

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

// Im Entwicklungsmodus immer Kontext ausgeben
if (defined('APP_DEBUG') && APP_DEBUG) {
    pg_set_error_context_visibility($conn, PGSQL_SHOW_CONTEXT_ALWAYS);
} else {
    // In Produktion keinen Kontext ausgeben
    pg_set_error_context_visibility($conn, PGSQL_SHOW_CONTEXT_NEVER);
}

// Fehlerbehaftete PL/pgSQL-Funktion aufrufen
$result = @pg_query($conn, 'SELECT meine_fehlerhafte_funktion()');
if (!$result) {
    echo 'Datenbankfehler: ' . pg_last_error($conn) . PHP_EOL;
    // Im Debug-Modus erscheinen hier zusätzlich Stack-Trace-Kontextzeilen
}

pg_close($conn);

// Wichtig · Fallstricke

Sicherheitshinweis: In Produktivumgebungen sollte PGSQL_SHOW_CONTEXT_NEVER bevorzugt werden, da Kontext-Informationen interne Datenbankstrukturen, Funktionsnamen und Zeilennummern preisgeben können. Diese Informationen könnten Angreifern helfen, Schwachstellen gezielter auszunutzen.

Verfügbarkeit: Die Funktion ist erst ab PHP 8.1.0 verfügbar, da sie auf neueren libpq-Features aufbaut. Für ältere PHP-Versionen existiert keine direkte Entsprechung; der Verbositäts-Level kann dort nur grob über pg_set_error_verbosity() gesteuert werden.

Die Konstanten PGSQL_SHOW_CONTEXT_NEVER, PGSQL_SHOW_CONTEXT_ERRORS und PGSQL_SHOW_CONTEXT_ALWAYS entsprechen den libpq-Werten PQSHOW_CONTEXT_NEVER, PQSHOW_CONTEXT_ERRORS und PQSHOW_CONTEXT_ALWAYS.