Signatur
Beschreibung
sqlsrv_free_stmt() gibt sämtliche Ressourcen frei, die mit einem über sqlsrv_query() oder sqlsrv_prepare() erzeugten Statement-Handle verknüpft sind. Das Handle selbst wird dabei ungültig und kann danach nicht mehr verwendet werden.
Diese Funktion sollte immer aufgerufen werden, sobald ein Statement nicht mehr benötigt wird, um Speicher und Serverressourcen (z. B. serverseitige Cursor) freizugeben. In lang laufenden Skripten oder Schleifen mit vielen Statements ist das explizite Freigeben besonders wichtig, da PHP Ressourcen andernfalls erst am Skriptende freigibt.
Im Gegensatz zu sqlsrv_cancel(), das lediglich noch nicht abgerufene Ergebnisse verwirft, zerstört sqlsrv_free_stmt() das Statement vollständig. Ein einmal freigegebenes Statement-Handle kann nicht wiederverwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stmt Pflicht | resource | Das Statement-Handle, das durch sqlsrv_query() oder sqlsrv_prepare() erzeugt wurde und freigegeben werden soll. |
Rückgabewert
true zurück, wenn die Ressourcen erfolgreich freigegeben wurden. Gibt false zurück, wenn ein Fehler auftritt (z. B. wenn ein ungültiges Handle übergeben wird).Beispiele
Statement nach Abfrage freigeben
<?php
$serverName = 'localhost';
$connectionInfo = [
'Database' => 'TestDB',
'UID' => 'sa',
'PWD' => 'geheimesPasswort',
];
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
die('Verbindung fehlgeschlagen: ' . print_r(sqlsrv_errors(), true));
}
$sql = 'SELECT id, name FROM kunden WHERE aktiv = 1';
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
die('Abfrage fehlgeschlagen: ' . print_r(sqlsrv_errors(), true));
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
// Ressourcen freigeben
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
Mehrere Statements in einer Schleife freigeben
<?php
$conn = sqlsrv_connect('localhost', [
'Database' => 'ShopDB',
'UID' => 'sa',
'PWD' => 'geheimesPasswort',
]);
$artikelIds = [101, 202, 303];
foreach ($artikelIds as $id) {
$params = [$id];
$stmt = sqlsrv_prepare($conn, 'SELECT name, preis FROM artikel WHERE id = ?', $params);
if ($stmt && sqlsrv_execute($stmt)) {
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
if ($row) {
echo 'Artikel ' . $id . ': ' . $row['name'] . ' — ' . $row['preis'] . ' EUR' . PHP_EOL;
}
}
// Statement nach jeder Iteration freigeben, um Ressourcen zu schonen
if ($stmt !== false) {
sqlsrv_free_stmt($stmt);
}
}
sqlsrv_close($conn);
// Wichtig · Fallstricke
Achtung: Nach dem Aufruf von sqlsrv_free_stmt() ist das übergebene Handle ungültig. Jeder weitere Zugriff auf dieses Handle (z. B. mit sqlsrv_fetch_array()) führt zu einem Fehler. Stellen Sie sicher, dass alle Ergebnisse verarbeitet wurden, bevor Sie das Statement freigeben.
Wenn Sie sqlsrv_cancel() verwenden möchten, um nur den Ergebnispuffer zu leeren und das Statement für eine erneute Ausführung offen zu halten, verwenden Sie stattdessen sqlsrv_cancel(). sqlsrv_free_stmt() eignet sich ausschließlich zum endgültigen Freigeben.