Signatur
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
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);
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.