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