Start · Sprachen · PHP · Referenz · pg_close_stmt

pg_close_stmt

Funktion

Schließt (deallociert) ein zuvor mit <code>pg_prepare()</code> erzeugtes vorbereitetes Statement auf dem PostgreSQL-Server.

seit PHP 8.1.0 Kategorie: db

Signatur

pg_close_stmt(PgSql\Connection $connection, string $statement_name): bool

Beschreibung

pg_close_stmt() gibt die serverseitigen Ressourcen eines vorbereiteten Statements frei, das zuvor mit pg_prepare() oder einem ähnlichen Mechanismus auf dem PostgreSQL-Server angelegt wurde. Intern sendet die Funktion einen DEALLOCATE-Befehl an den Server.

Vorbereitete Statements werden auf dem PostgreSQL-Server für die Dauer der Verbindung gespeichert. Wenn in einer Anwendung viele Statements dynamisch erzeugt werden (z. B. in Schleifen), kann der Speicherverbrauch auf dem Datenbankserver erheblich ansteigen. pg_close_stmt() ermöglicht es, nicht mehr benötigte Statements gezielt zu entfernen und so Ressourcen freizugeben.

Die Funktion ist besonders bei lang laufenden Skripten oder Persistent Connections sinnvoll, da in diesen Szenarien vorbereitete Statements sonst für die gesamte Laufzeit der Verbindung bestehen bleiben und Speicher belegen würden.

Nach dem Aufruf von pg_close_stmt() kann das Statement mit dem angegebenen Namen nicht mehr ausgeführt werden. Es muss mit pg_prepare() neu erstellt werden, bevor es erneut verwendet werden kann.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Datenbankverbindung, die als PgSql\Connection-Instanz vorliegt und über pg_connect() oder pg_pconnect() erzeugt wurde.
$statement_name Pflicht string Der Name des vorbereiteten Statements, das deallociert werden soll. Dieser Name wurde beim Aufruf von pg_prepare() als zweites Argument übergeben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Statement erfolgreich deallociert wurde. Gibt false zurück, wenn ein Fehler auftrat, z. B. wenn kein Statement mit dem angegebenen Namen existiert oder die Verbindung ungültig ist.

Beispiele

Vorbereitetes Statement nach Verwendung freigeben

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

// Statement vorbereiten
$result = pg_prepare($conn, 'get_user', 'SELECT id, name FROM users WHERE id = $1');
if (!$result) {
    die('Vorbereitung fehlgeschlagen: ' . pg_last_error($conn));
}

// Statement ausführen
$result = pg_execute($conn, 'get_user', [42]);
while ($row = pg_fetch_assoc($result)) {
    echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . PHP_EOL;
}

// Statement nicht mehr benötigt — freigeben
if (pg_close_stmt($conn, 'get_user')) {
    echo 'Statement erfolgreich deallociert.' . PHP_EOL;
} else {
    echo 'Fehler beim Deallocieren: ' . pg_last_error($conn) . PHP_EOL;
}

pg_close($conn);
ID: 42, Name: Max Mustermann Statement erfolgreich deallociert.

Dynamische Statements in einer Schleife verwalten

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

$tables = ['orders', 'products', 'customers'];

foreach ($tables as $table) {
    $stmtName = 'count_' . $table;

    // Dynamisches Statement für jede Tabelle
    pg_prepare($conn, $stmtName, "SELECT COUNT(*) FROM {$table}");
    $result = pg_execute($conn, $stmtName, []);
    $row = pg_fetch_row($result);
    echo "Anzahl Datensätze in {$table}: " . $row[0] . PHP_EOL;

    // Sofort freigeben, um Ressourcen zu schonen
    pg_close_stmt($conn, $stmtName);
}

pg_close($conn);
Anzahl Datensätze in orders: 150 Anzahl Datensätze in products: 300 Anzahl Datensätze in customers: 75

// Wichtig · Fallstricke

Sicherheitshinweis: Im zweiten Beispiel wird der Tabellenname direkt in den SQL-String interpoliert. Da Tabellennamen keine Parameter ($1, $2, ...) sein können, muss sichergestellt werden, dass diese Werte nicht aus unvertrauenswürdigen Quellen stammen. Andernfalls besteht eine SQL-Injection-Gefahr. Validiere Tabellennamen stets gegen eine Whitelist.

Verfügbarkeit: pg_close_stmt() ist erst ab PHP 8.1.0 verfügbar. In älteren PHP-Versionen kann ein vorbereitetes Statement durch direktes Ausführen des SQL-Befehls DEALLOCATE statement_name über pg_query() freigegeben werden.

Persistent Connections: Bei Verwendung von pg_pconnect() bleiben vorbereitete Statements über mehrere Anfragen hinweg bestehen. Es empfiehlt sich, vor dem erneuten Vorbereiten eines Statements mit gleichem Namen dieses zunächst mit pg_close_stmt() zu deallocieren oder den Fehlerfall abzufangen.