Signatur
Beschreibung
mysqli_use_result() wird nach mysqli_real_query() aufgerufen, um eine Ergebnismenge zeilenweise direkt vom Server zu lesen, ohne sie vollständig in den PHP-Speicher zu laden. Dies ist besonders bei sehr großen Ergebnismengen sinnvoll, da der Speicherbedarf minimal bleibt.
Im Gegensatz zu mysqli_store_result(), das die gesamte Ergebnismenge auf einmal in den Speicher überträgt (gepuffert), werden bei mysqli_use_result() die Zeilen erst bei jedem mysqli_fetch_*()-Aufruf vom Server gelesen (ungepuffert). Dadurch bleibt die Verbindung zum Server während des gesamten Abrufvorgangs blockiert — es können keine weiteren Abfragen ausgeführt werden, bis alle Zeilen abgerufen wurden oder das Ergebnis mit mysqli_free_result() freigegeben wird.
Funktionen wie mysqli_data_seek() oder mysqli_num_rows() stehen bei ungepufferten Ergebnismengen nicht zur Verfügung. Der Einsatz empfiehlt sich ausschließlich dann, wenn die Datenmenge so groß ist, dass ein vollständiges Laden in den Arbeitsspeicher problematisch wäre.
In der objektorientierten Schreibweise steht die Methode mysqli::use_result() zur Verfügung, die identisch funktioniert.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Verbindungsobjekt. |
Rückgabewert
mysqli_result-Objekt zurück, das die ungepufferte Ergebnismenge repräsentiert. Gibt false zurück, wenn ein Fehler aufgetreten ist oder wenn die Abfrage keine Ergebnismenge erzeugt hat (z. B. bei INSERT- oder UPDATE-Anweisungen).Beispiele
Große Ergebnismenge zeilenweise verarbeiten
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'geheim', 'testdb');
if (!$mysqli) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
// Abfrage ohne sofortiges Speichern der Ergebnismenge
if (mysqli_real_query($mysqli, 'SELECT id, name FROM grosse_tabelle')) {
$result = mysqli_use_result($mysqli);
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
echo $row['id'] . ': ' . $row['name'] . "\n";
}
// Ergebnismenge freigeben, damit die Verbindung wieder nutzbar ist
mysqli_free_result($result);
}
}
mysqli_close($mysqli);
Objektorientierte Verwendung mit mehreren Abfragen (MULTI_QUERY)
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'geheim', 'testdb');
if ($mysqli->connect_error) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$sql = 'SELECT id, name FROM kunden; SELECT id, titel FROM produkte';
if ($mysqli->multi_query($sql)) {
do {
// Ergebnis ungepuffert abrufen
$result = $mysqli->use_result();
if ($result) {
echo "--- Ergebnismenge ---\n";
while ($row = $result->fetch_row()) {
echo implode(', ', $row) . "\n";
}
$result->free();
}
} while ($mysqli->next_result());
}
$mysqli->close();
// Wichtig · Fallstricke
Verbindungsblockierung: Solange nicht alle Zeilen einer ungepufferten Ergebnismenge abgerufen wurden, ist die Datenbankverbindung vollständig blockiert. Jede weitere Abfrage auf derselben Verbindung schlägt fehl. Stellen Sie sicher, dass immer mysqli_free_result() aufgerufen wird, sobald die Ergebnismenge nicht mehr benötigt wird.
Eingeschränkte Funktionen: Bei ungepufferten Ergebnismengen stehen mysqli_data_seek(), mysqli_num_rows() und ähnliche Funktionen, die einen wahlfreien Zugriff erfordern, nicht zur Verfügung. Wenn diese Funktionen benötigt werden, sollte stattdessen mysqli_store_result() verwendet werden.
Kombinierter Einsatz: mysqli_use_result() muss immer nach mysqli_real_query() oder mysqli_multi_query() aufgerufen werden. Nach dem normalen mysqli_query() ist es nicht anwendbar.