Start · Sprachen · PHP · Referenz · mysqli_stmt_free_result

mysqli_stmt_free_result

Funktion

Gibt den mit einer vorbereiteten Anweisung (<code>mysqli_stmt</code>) verbundenen Ergebnisspeicher frei.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_free_result(mysqli_stmt $statement): void

Beschreibung

mysqli_stmt_free_result() gibt den Speicher frei, der für ein Ergebnisset reserviert wurde, das zuvor mit mysqli_stmt_store_result() im Arbeitsspeicher abgelegt wurde. Nach dem Aufruf dieser Funktion sind keine weiteren Fetch-Operationen auf dem betreffenden Statement möglich, bis erneut Daten abgerufen werden.

Diese Funktion ist besonders wichtig, wenn Sie mysqli_stmt_store_result() verwendet haben, um ein vollständiges Ergebnisset in den Arbeitsspeicher zu laden. Ohne explizites Freigeben kann es bei großen Ergebnismengen oder in Schleifen mit vielen Abfragen zu unnötig hohem Speicherverbrauch kommen.

Im objektorientierten Stil steht die äquivalente Methode mysqli_stmt::free_result() zur Verfügung. Es empfiehlt sich, nach der Verarbeitung eines Ergebnissets immer mysqli_stmt_free_result() aufzurufen und anschließend das Statement mit mysqli_stmt_close() zu schließen, um Ressourcen vollständig freizugeben.

Parameter

Name Typ Default Beschreibung
$statement Pflicht mysqli_stmt Das mysqli_stmt-Objekt, das von mysqli_stmt_init() oder mysqli_prepare() zurückgegeben wurde und dessen Ergebnisspeicher freigegeben werden soll.

Rückgabewert

Typ
void
Beschreibung
Diese Funktion hat keinen Rückgabewert.

Beispiele

Prozeduraler Stil: Ergebnisspeicher nach Abfrage freigeben

<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');

if (!$mysqli) {
    die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}

$stmt = mysqli_prepare($mysqli, 'SELECT id, name FROM users WHERE active = ?');
mysqli_stmt_bind_param($stmt, 'i', $active);

$active = 1;
mysqli_stmt_execute($stmt);

// Ergebnisset in den Arbeitsspeicher laden
mysqli_stmt_store_result($stmt);
mysqli_stmt_bind_result($stmt, $id, $name);

while (mysqli_stmt_fetch($stmt)) {
    echo "ID: $id, Name: $name\n";
}

// Ergebnisspeicher freigeben
mysqli_stmt_free_result($stmt);

// Statement schließen
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
ID: 1, Name: Alice ID: 2, Name: Bob

Objektorientierter Stil: Mehrere Abfragen mit Speicherfreigabe

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_errno) {
    die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}

$kategorien = [1, 2, 3];

$stmt = $mysqli->prepare('SELECT id, title FROM articles WHERE category_id = ?');

foreach ($kategorien as $katId) {
    $stmt->bind_param('i', $katId);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($id, $title);

    echo "Kategorie $katId:\n";
    while ($stmt->fetch()) {
        echo "  - [$id] $title\n";
    }

    // Ergebnisspeicher nach jeder Iteration freigeben
    $stmt->free_result();
}

$stmt->close();
$mysqli->close();
Kategorie 1: - [10] PHP-Grundlagen Kategorie 2: - [11] Datenbanken mit MySQLi Kategorie 3: - [12] Objektorientiertes PHP

// Wichtig · Fallstricke

Wichtig: mysqli_stmt_free_result() ist nur dann wirkungsvoll, wenn zuvor mysqli_stmt_store_result() aufgerufen wurde. Ohne diesen vorherigen Aufruf gibt es keinen gepufferten Speicher freizugeben.

Wenn Sie einen ungepufferten Ergebnissatz verwenden (d. h. ohne mysqli_stmt_store_result()), müssen Sie alle Zeilen fetchen oder mysqli_stmt_reset() aufrufen, bevor Sie das Statement wiederverwenden können.

Beim Schließen eines Statements mit mysqli_stmt_close() wird auch der Ergebnisspeicher implizit freigegeben. Dennoch ist es gute Praxis, mysqli_stmt_free_result() explizit aufzurufen, um den Speicher so früh wie möglich freizugeben, besonders bei großen Ergebnismengen innerhalb von Schleifen.