Start · Sprachen · PHP · Referenz · mysqli_free_result

mysqli_free_result

Funktion

Gibt den Speicher frei, der einem <code>mysqli_result</code>-Objekt zugewiesen wurde.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_free_result(mysqli_result $result): void

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

Typ
void
Beschreibung
Diese Funktion hat keinen 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);
1: Alice 2: Bob 3: Charlie

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();
Anzahl: 42 Anzahl: 158

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