Signatur
Beschreibung
db2_free_stmt() gibt den Speicher und die Datenbankressourcen frei, die einer zuvor mit db2_prepare() oder db2_exec() erstellten Statement-Ressource zugeordnet sind. Nach dem Aufruf ist das Handle ungültig und darf nicht mehr verwendet werden.
In lang laufenden Anwendungen oder Skripten, die viele Abfragen in einer Schleife ausführen, ist es empfehlenswert, Statement-Ressourcen nach ihrer Verwendung explizit freizugeben, um den Speicherbedarf gering zu halten und Cursor-Limits auf dem Datenbankserver nicht zu überschreiten.
Für Verbindungen, die über Connection-Pooling wiederverwendet werden, ist das explizite Freigeben von Statements besonders wichtig, da offene Cursors die Verbindung blockieren können.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stmt Pflicht | resource | Eine gültige Statement-Ressource, die von db2_prepare() oder db2_exec() zurückgegeben wurde. |
Rückgabewert
true zurück, wenn die Ressourcen erfolgreich freigegeben wurden, andernfalls false.Beispiele
Statement nach Ausführung freigeben
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheim');
if ($conn) {
$sql = 'SELECT id, name FROM kunden WHERE aktiv = ?';
$stmt = db2_prepare($conn, $sql);
if ($stmt) {
db2_execute($stmt, [1]);
while ($row = db2_fetch_assoc($stmt)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
// Ressourcen explizit freigeben
db2_free_stmt($stmt);
}
db2_close($conn);
}
Mehrere Statements in einer Schleife freigeben
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheim');
if ($conn) {
$ids = [101, 102, 103, 104];
foreach ($ids as $id) {
$stmt = db2_prepare($conn, 'SELECT * FROM bestellungen WHERE kunden_id = ?');
if ($stmt) {
db2_execute($stmt, [$id]);
while ($row = db2_fetch_assoc($stmt)) {
echo 'Bestellung ' . $row['bestell_nr'] . PHP_EOL;
}
// Innerhalb der Schleife freigeben, um Cursor-Limit nicht zu überschreiten
db2_free_stmt($stmt);
}
}
db2_close($conn);
}
// Wichtig · Fallstricke
Cursor-Limits: DB2-Datenbankserver haben eine maximale Anzahl gleichzeitig offener Cursors pro Verbindung. Werden Statements in Schleifen erstellt, ohne sie freizugeben, kann dieses Limit schnell erreicht werden, was zu Fehlern führt.
Nach dem Freigeben: Nach dem Aufruf von db2_free_stmt() darf die Statement-Ressource nicht mehr für db2_execute(), db2_fetch_assoc() oder ähnliche Funktionen verwendet werden. Jeder weitere Aufruf auf dem freigegebenen Handle führt zu einem Fehler.
Automatische Freigabe: Ressourcen werden beim Skript-Ende automatisch freigegeben. In lang laufenden Prozessen (z. B. CLI-Daemons) sollte db2_free_stmt() jedoch stets explizit aufgerufen werden.