Signatur
Beschreibung
pg_free_result() gibt den internen Speicher frei, der von einem PgSql\Result-Objekt (früher eine resource) belegt wird, das durch Funktionen wie pg_query(), pg_execute() oder pg_query_params() erzeugt wurde. Nach dem Aufruf ist das Ergebnisobjekt nicht mehr verwendbar.
PHP gibt Ergebnisobjekte zwar am Ende eines Skripts automatisch frei, jedoch empfiehlt es sich, pg_free_result() explizit aufzurufen, wenn große Ergebnismengen nicht mehr benötigt werden – insbesondere in Schleifen oder bei mehreren aufeinanderfolgenden Abfragen in lang laufenden Skripten, um den Speicherverbrauch gering zu halten.
In modernen PHP-Versionen (ab PHP 8.1) ist das Ergebnishandle ein PgSql\Result-Objekt statt einer klassischen Ressource, das Verhalten von pg_free_result() bleibt jedoch identisch. Die Funktion liefert true bei Erfolg und false bei einem ungültigen Argument.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | PgSql\Result | Das PostgreSQL-Ergebnisobjekt, das von pg_query(), pg_query_params(), pg_execute() oder ähnlichen Funktionen zurückgegeben wurde. |
Rückgabewert
true zurück, wenn der Speicher erfolgreich freigegeben wurde. Gibt false zurück, wenn das übergebene Argument kein gültiges Ergebnisobjekt ist.Beispiele
Speicher nach einer einfachen Abfrage freigeben
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
$result = pg_query($conn, 'SELECT id, name FROM users LIMIT 100');
if ($result === false) {
die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}
while ($row = pg_fetch_assoc($result)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
// Ergebnis explizit freigeben, sobald es nicht mehr benötigt wird
pg_free_result($result);
pg_close($conn);
?>
Mehrere Abfragen in einer Schleife – Speicher jeweils freigeben
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
$tabellen = ['orders', 'products', 'customers'];
foreach ($tabellen as $tabelle) {
// Tabellenname darf NICHT per pg_query_params übergeben werden,
// daher hier nur zu Demo-Zwecken – in der Praxis Namen whitelisten!
$result = pg_query($conn, "SELECT COUNT(*) AS anzahl FROM {$tabelle}");
if ($result !== false) {
$row = pg_fetch_assoc($result);
echo "Tabelle '{$tabelle}': " . $row['anzahl'] . " Einträge" . PHP_EOL;
// Speicher sofort nach Verwendung freigeben
pg_free_result($result);
}
}
pg_close($conn);
?>
// Wichtig · Fallstricke
Sicherheitshinweis: Tabellen- oder Spaltennamen können nicht über pg_query_params() parametrisiert werden. Werden sie dynamisch zusammengebaut, müssen sie über eine Whitelist geprüft oder mit pg_escape_identifier() abgesichert werden, um SQL-Injection zu verhindern.
Nach dem Aufruf von pg_free_result() darf das übergebene Ergebnisobjekt nicht mehr verwendet werden – jeglicher weitere Zugriff darauf führt zu einem Fehler. Es empfiehlt sich, die Variable anschließend auf null zu setzen ($result = null;), um versehentliche Wiederverwendung zu verhindern.
Ab PHP 8.1 wurde der Typ des Ergebnis-Handles von resource auf PgSql\Result geändert. Älterer Code, der is_resource() auf dem Rückgabewert prüft, muss entsprechend angepasst werden.