Start · Sprachen · PHP · Referenz · mysqli_store_result

mysqli_store_result

Funktion

Überträgt die komplette Ergebnismenge der letzten ausgeführten Abfrage vom Server in den PHP-Speicher und gibt ein <code>mysqli_result</code>-Objekt zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_store_result(mysqli $mysql, int $mode = 0): mysqli_result|false

Beschreibung

mysqli_store_result() liest die gesamte Ergebnismenge einer zuvor mit mysqli_real_query() oder mysqli_multi_query() ausgeführten Abfrage vom MySQL-Server und puffert sie vollständig im Arbeitsspeicher des PHP-Prozesses. Dadurch kann die Verbindung sofort für weitere Abfragen genutzt werden, während die Ergebnisse unabhängig weiterverarbeitet werden.

Die Funktion ist besonders bei Multi-Statements (mehrere durch Semikolon getrennte SQL-Befehle) unverzichtbar: Nach jedem mysqli_next_result()-Aufruf muss mysqli_store_result() aufgerufen werden, um die Ergebnismenge des nächsten Statements zu übertragen. Liefert ein Statement keine Ergebnismenge (z. B. INSERT oder UPDATE), gibt die Funktion false zurück – dies ist kein Fehler, sofern mysqli_errno() ebenfalls 0 liefert.

Im Gegensatz zu mysqli_use_result(), das die Zeilen einzeln vom Server liest (unbuffered), sind bei mysqli_store_result() alle Zeilen sofort verfügbar, was Operationen wie mysqli_num_rows() und mehrmaliges Durchlaufen der Ergebnismenge erlaubt. Der Nachteil ist ein höherer Speicherverbrauch bei großen Ergebnismengen.

Als optionaler $mode-Parameter kann MYSQLI_STORE_RESULT_COPY_DATA übergeben werden, um die Daten explizit zu kopieren statt per Referenz zu halten – dies kann in Szenarien mit sehr vielen Zeilen den Gesamtspeicherbedarf senken.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Eine aktive MySQL-Verbindung, die von mysqli_connect() oder mysqli_init() zurückgegeben wurde.
$mode int 0 Optionales Flag. Derzeit wird nur MYSQLI_STORE_RESULT_COPY_DATA unterstützt, das die zurückgegebenen Daten explizit kopiert statt sie intern per Referenz zu referenzieren.

Rückgabewert

Typ
mysqli_result|false
Beschreibung
Gibt ein mysqli_result-Objekt mit der gepufferten Ergebnismenge zurück. Bei einem Fehler oder wenn das Statement keine Ergebnismenge liefert (z. B. INSERT/UPDATE/DELETE), wird false zurückgegeben. Ein false-Rückgabewert ist kein Fehler, wenn mysqli_errno() 0 zurückgibt.

Beispiele

Einfaches gepuffertes Ergebnis abrufen

<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
if (!$mysqli) {
    die('Verbindungsfehler: ' . mysqli_connect_error());
}

// Abfrage ausführen (ohne automatisches Puffern)
mysqli_real_query($mysqli, "SELECT id, name FROM kunden LIMIT 5");

// Ergebnismenge komplett vom Server holen
$result = mysqli_store_result($mysqli);
if ($result === false) {
    die('Fehler: ' . mysqli_error($mysqli));
}

echo 'Anzahl Zeilen: ' . mysqli_num_rows($result) . PHP_EOL;

while ($zeile = mysqli_fetch_assoc($result)) {
    echo $zeile['id'] . ': ' . $zeile['name'] . PHP_EOL;
}

mysqli_free_result($result);
mysqli_close($mysqli);
Anzahl Zeilen: 5 1: Max Mustermann 2: Erika Musterfrau ...

Mehrere Statements mit mysqli_multi_query verarbeiten

<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
if (!$mysqli) {
    die('Verbindungsfehler: ' . mysqli_connect_error());
}

$sql = "SELECT id, name FROM kunden LIMIT 3;
        SELECT COUNT(*) AS anzahl FROM bestellungen;";

if (!mysqli_multi_query($mysqli, $sql)) {
    die('Abfragefehler: ' . mysqli_error($mysqli));
}

$statement = 1;
do {
    // Ergebnismenge des aktuellen Statements puffern
    $result = mysqli_store_result($mysqli);

    if ($result) {
        echo "--- Statement $statement ---" . PHP_EOL;
        while ($zeile = mysqli_fetch_assoc($result)) {
            echo implode(', ', $zeile) . PHP_EOL;
        }
        mysqli_free_result($result);
    } elseif (mysqli_errno($mysqli) !== 0) {
        echo 'Fehler bei Statement ' . $statement . ': ' . mysqli_error($mysqli) . PHP_EOL;
    }

    $statement++;
} while (mysqli_next_result($mysqli));

mysqli_close($mysqli);
--- Statement 1 --- 1, Max Mustermann 2, Erika Musterfrau 3, Hans Beispiel --- Statement 2 --- 42

// Wichtig · Fallstricke

Speicherverbrauch: Da mysqli_store_result() die gesamte Ergebnismenge in den PHP-Arbeitsspeicher lädt, kann sie bei sehr großen Ergebnismengen zu Speicherproblemen führen. In solchen Fällen sollte mysqli_use_result() in Betracht gezogen werden, das die Zeilen einzeln liest – allerdings auf Kosten der Flexibilität (kein mysqli_num_rows(), kein mehrmaliges Durchlaufen).

Unterschied zu OOP-Schreibweise: Im objektorientierten Stil entspricht diese Funktion dem Aufruf $mysqli->store_result(). Beide Varianten sind funktional identisch.

Ressourcen freigeben: Nach der Verarbeitung sollte die Ergebnismenge mit mysqli_free_result() freigegeben werden, um Speicher zurückzugeben.