Signatur
Beschreibung
mysqli_free_result() gibt den Speicher frei, der intern für ein mysqli_result-Objekt reserviert wurde. Diese Funktion sollte aufgerufen werden, sobald die Ergebnismenge einer Datenbankabfrage nicht mehr benötigt wird, um Speicherressourcen frühzeitig freizugeben – insbesondere bei großen Ergebnismengen oder vielen aufeinanderfolgenden Abfragen.
In der objektorientierten Schreibweise steht die äquivalente Methode $result->free() zur Verfügung (Aliase: $result->free_result() und $result->close()). In der prozeduralen Schreibweise wird mysqli_free_result($result) verwendet.
PHP gibt zwar am Ende eines Skripts alle Ressourcen automatisch frei, es ist jedoch guter Stil und für langlebige Prozesse (z. B. CLI-Skripte, Loops mit vielen Abfragen) wichtig, den Speicher explizit freizugeben, um übermäßigen Speicherverbrauch zu vermeiden.
Nach dem Aufruf ist das übergebene mysqli_result-Objekt nicht mehr verwendbar. Jeder weitere Zugriff auf die Ergebnismenge führt zu einem Fehler.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | mysqli_result | Das mysqli_result-Objekt, dessen Speicher freigegeben werden soll. Wird typischerweise von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben. |
Rückgabewert
Beispiele
Prozeduraler Stil: Speicher nach Abfrage freigeben
<?php
$link = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
if (!$link) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$result = mysqli_query($link, 'SELECT id, name FROM benutzer LIMIT 10');
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
// Speicher freigeben, sobald die Ergebnismenge nicht mehr benötigt wird
mysqli_free_result($result);
}
mysqli_close($link);
Objektorientierter Stil: free() in einer Schleife mit mehreren Abfragen
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$abfragen = [
'SELECT COUNT(*) AS anz FROM benutzer',
'SELECT COUNT(*) AS anz FROM produkte',
];
foreach ($abfragen as $sql) {
$result = $mysqli->query($sql);
if ($result) {
$row = $result->fetch_assoc();
echo 'Anzahl: ' . $row['anz'] . PHP_EOL;
// Explizit freigeben, bevor die nächste Abfrage ausgeführt wird
$result->free();
}
}
$mysqli->close();
// Wichtig · Fallstricke
Aliase: In der objektorientierten Schreibweise sind $result->free(), $result->free_result() und $result->close() identisch mit mysqli_free_result() – sie tun dasselbe.
Unbuffered Results: Bei Verwendung von mysqli_use_result() (unbuffered) muss mysqli_free_result() aufgerufen werden, bevor eine weitere Abfrage auf derselben Verbindung ausgeführt werden kann, da sonst ein Fehler auftritt.
Kein Doppel-Free: Nach dem Aufruf von mysqli_free_result() darf das $result-Objekt nicht erneut verwendet werden. Ein erneuter Aufruf auf demselben Objekt führt zu einem Fehler.