Start · Sprachen · PHP · Referenz · pg_free_result

pg_free_result

Funktion

Gibt den von einem PostgreSQL-Abfrageergebnis belegten Speicher frei und macht die zugehörige Ressource ungültig.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_free_result(PgSql\Result $result): bool

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

Typ
bool
Beschreibung
Gibt 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);
?>
1: Alice 2: Bob ...

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);
?>
Tabelle 'orders': 1530 Einträge Tabelle 'products': 248 Einträge Tabelle 'customers': 874 Einträge

// 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.