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