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