Signatur
Beschreibung
mysqli_stmt_store_result() liest alle Ergebniszeilen einer ausgeführten vorbereiteten Anweisung (mysqli_stmt) vom Datenbankserver in den Arbeitsspeicher des PHP-Prozesses. Erst danach können Funktionen wie mysqli_stmt_num_rows() oder mysqli_stmt_data_seek() zuverlässig verwendet werden, da diese eine vollständige, gecachte Ergebnismenge voraussetzen.
Ohne diesen Aufruf streamt PHP die Ergebniszeilen direkt vom Server, was bei großen Datenmengen speichereffizienter ist, aber weder den wahlfreien Zugriff auf Zeilen noch die genaue Zeilenanzahl im Voraus erlaubt. Der Aufruf von mysqli_stmt_store_result() ist daher ein bewusstes Trade-off zwischen Speicherbedarf und Funktionsumfang.
Die Funktion muss nach mysqli_stmt_execute() und vor mysqli_stmt_bind_result() bzw. mysqli_stmt_fetch() aufgerufen werden, wenn die gecachten Fähigkeiten benötigt werden. Sie gibt true bei Erfolg und false bei einem Fehler zurück.
Im objektorientierten Stil steht die Methode mysqli_stmt::store_result() zur Verfügung und verhält sich identisch.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Anweisungs-Objekt, das von mysqli_stmt_init() oder mysqli_prepare() zurückgegeben wurde und bereits erfolgreich ausgeführt worden sein muss. |
Rückgabewert
true zurück, wenn die Ergebnismenge erfolgreich gepuffert wurde, oder false bei einem Fehler (z. B. wenn keine Ergebnismenge vorhanden ist oder die Anweisung noch nicht ausgeführt wurde).Beispiele
Zeilenanzahl nach dem Puffern ermitteln
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$stmt = $mysqli->prepare('SELECT id, name FROM users WHERE active = ?');
$active = 1;
$stmt->bind_param('i', $active);
$stmt->execute();
// Ergebnismenge puffern, damit num_rows funktioniert
$stmt->store_result();
echo 'Gefundene Zeilen: ' . $stmt->num_rows . PHP_EOL;
$stmt->bind_result($id, $name);
while ($stmt->fetch()) {
echo $id . ': ' . $name . PHP_EOL;
}
$stmt->free_result();
$stmt->close();
$mysqli->close();
Wahlfreier Zugriff auf Zeilen mit data_seek
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$stmt = $mysqli->prepare('SELECT id, name FROM products ORDER BY id');
$stmt->execute();
// Ohne store_result würde data_seek nicht funktionieren
mysqli_stmt_store_result($stmt);
$stmt->bind_result($id, $name);
// Direkt zur dritten Zeile (Index 2) springen
$stmt->data_seek(2);
$stmt->fetch();
echo 'Dritter Eintrag: ' . $id . ' - ' . $name . PHP_EOL;
// Zurück zur ersten Zeile
$stmt->data_seek(0);
$stmt->fetch();
echo 'Erster Eintrag: ' . $id . ' - ' . $name . PHP_EOL;
$stmt->free_result();
$stmt->close();
$mysqli->close();
// Wichtig · Fallstricke
Speicherverbrauch: Da alle Zeilen in den PHP-Arbeitsspeicher geladen werden, kann bei sehr großen Ergebnismengen der Speicherbedarf erheblich ansteigen. In solchen Fällen sollte auf store_result() verzichtet und die Daten gestreamt werden, sofern num_rows und data_seek nicht benötigt werden.
Ressourcen freigeben: Nach der Verarbeitung sollte mysqli_stmt_free_result() aufgerufen werden, um den belegten Speicher explizit freizugeben, bevor die nächste Abfrage ausgeführt wird.
Kein Effekt bei nicht-SELECT-Anweisungen: Bei INSERT, UPDATE oder DELETE gibt die Funktion false zurück, da keine Ergebnismenge vorhanden ist. Prüfe daher den Rückgabewert oder setze store_result() nur bei SELECT-Anweisungen ein.