Start · Sprachen · PHP · Referenz · sqlsrv_free_stmt

sqlsrv_free_stmt

Funktion

Gibt alle Ressourcen eines SQLSRV-Statement-Handles frei und macht es ungültig.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_free_stmt(resource $stmt): bool

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

Typ
bool
Beschreibung
Gibt 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);
1: Max Mustermann 2: Erika Musterfrau

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);
Artikel 101: Tastatur — 29.99 EUR Artikel 202: Maus — 19.99 EUR Artikel 303: Monitor — 199.99 EUR

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