Signatur
Beschreibung
PgSql\Result ist eine vollständig opake Klasse, die seit PHP 8.1.0 anstelle des bisherigen resource-Typs für PostgreSQL-Abfrageergebnisse verwendet wird. Objekte dieser Klasse werden von Funktionen wie pg_query(), pg_query_params(), pg_execute() oder pg_get_result() zurückgegeben.
Da die Klasse vollständig opak ist, besitzt sie keine öffentlich zugänglichen Eigenschaften oder Methoden. Sie dient ausschließlich als typsicheres Handle, das an die zugehörigen pg_*-Funktionen übergeben wird, beispielsweise an pg_fetch_assoc(), pg_num_rows() oder pg_free_result().
Der Wechsel von resource zu PgSql\Result verbessert die Typsicherheit erheblich, da PHP und IDEs nun in der Lage sind, den Typ korrekt zu prüfen und zu dokumentieren. Bestehender Code, der auf den Typ resource prüft (z. B. mit is_resource()), muss für PHP 8.1+ angepasst werden.
Die Klasse kann nicht manuell instanziiert werden – Instanzen entstehen ausschließlich als Rückgabewerte der PostgreSQL-Erweiterungsfunktionen. Nach Gebrauch sollte das Objekt mit pg_free_result() freigegeben werden, um Speicher zu sparen, auch wenn dies bei Objekten automatisch durch den Garbage Collector erfolgt.
Beispiele
Einfache Abfrage und Ergebnis verarbeiten
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn instanceof PgSql\Connection) {
die('Verbindung fehlgeschlagen.');
}
$result = pg_query($conn, 'SELECT id, name FROM users LIMIT 5');
if (!$result instanceof PgSql\Result) {
die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}
echo 'Anzahl Zeilen: ' . pg_num_rows($result) . PHP_EOL;
while ($row = pg_fetch_assoc($result)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
pg_free_result($result);
pg_close($conn);
Parametrisierte Abfrage mit pg_query_params()
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
// Sicheres Einfügen mit parametrisierten Abfragen
$result = pg_query_params(
$conn,
'SELECT id, email FROM users WHERE name = $1',
['Alice']
);
if ($result instanceof PgSql\Result) {
$row = pg_fetch_assoc($result);
if ($row) {
echo 'ID: ' . $row['id'] . ', E-Mail: ' . $row['email'] . PHP_EOL;
} else {
echo 'Kein Eintrag gefunden.' . PHP_EOL;
}
pg_free_result($result);
}
pg_close($conn);
// Wichtig · Fallstricke
Migration von PHP 8.0 auf 8.1+: Code, der is_resource($result) verwendet, muss auf $result instanceof PgSql\Result umgestellt werden, da is_resource() für Objekte false zurückgibt.
Sicherheit: Verwende stets pg_query_params() oder pg_execute() mit Platzhaltern statt manuell zusammengesetzter SQL-Strings, um SQL-Injection zu vermeiden. Benutzereingaben niemals direkt in SQL einbetten.
Speicher: Obwohl der Garbage Collector PgSql\Result-Objekte automatisch freigibt, empfiehlt es sich bei großen Ergebnismengen, pg_free_result() explizit aufzurufen, um Speicher zeitnah freizugeben.