Signatur
Beschreibung
mysqli_next_result() wechselt intern zum nächsten Ergebnis-Set, das durch eine vorangegangene mysqli_multi_query()-Anfrage erzeugt wurde. Erst nach diesem Aufruf kann das nächste Ergebnis mit mysqli_store_result() oder mysqli_use_result() abgerufen werden.
Die Funktion wird typischerweise in einer Schleife zusammen mit mysqli_more_results() verwendet: Solange weitere Ergebnisse vorhanden sind, wird mysqli_next_result() aufgerufen, um zum nächsten Set voranzuspringen, bevor es gelesen wird.
Es ist wichtig, alle Ergebnis-Sets zu konsumieren, bevor eine neue Anfrage an den Server gesendet wird. Andernfalls löst PHP einen Fehler aus (Commands out of sync). Diese Funktion stellt dabei sicher, dass der interne Cursor korrekt weitergesetzt wird.
In der objektorientierten Schreibweise steht die Methode als $mysqli->next_result() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive mysqli-Datenbankverbindung, zurückgegeben von mysqli_connect() oder mysqli_init(). |
Rückgabewert
true zurück, wenn das nächste Ergebnis erfolgreich vorbereitet wurde. Gibt false zurück, wenn kein weiteres Ergebnis vorhanden ist oder ein Fehler aufgetreten ist. Mit mysqli_more_results() lässt sich vorab prüfen, ob ein nächstes Ergebnis existiert.Beispiele
Mehrere Ergebnisse aus multi_query verarbeiten
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$sql = "SELECT 'Ergebnis 1' AS info;
SELECT 'Ergebnis 2' AS info;
SELECT 'Ergebnis 3' AS info;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo $row['info'] . PHP_EOL;
}
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo 'Fehler: ' . $mysqli->error;
}
$mysqli->close();
Stored Procedure mit mehreren Ergebnis-Sets
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
// Annahme: Die Prozedur liefert zwei SELECT-Ergebnis-Sets
$sql = "CALL get_user_data(1)";
if (mysqli_multi_query($mysqli, $sql)) {
$i = 1;
do {
if ($result = mysqli_store_result($mysqli)) {
echo "Ergebnis-Set $i:" . PHP_EOL;
while ($row = mysqli_fetch_assoc($result)) {
print_r($row);
}
mysqli_free_result($result);
$i++;
}
// Fehlerhafte/leere Sets (z. B. UPDATE ohne Ergebnis) überspringen
} while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
if (mysqli_errno($mysqli)) {
echo 'Fehler: ' . mysqli_error($mysqli);
}
}
mysqli_close($mysqli);
// Wichtig · Fallstricke
Commands out of sync: Wenn nicht alle Ergebnis-Sets einer multi_query-Anfrage konsumiert werden, bevor eine neue Anfrage gesendet wird, gibt MySQL den Fehler Commands out of sync; you can't run this command now zurück. Stets alle Sets mit der do…while-Schleife vollständig durchlaufen.
Fehlerunterscheidung: mysqli_next_result() gibt sowohl bei fehlendem nächstem Ergebnis als auch bei einem echten Fehler false zurück. Mit mysqli_errno() lässt sich nach der Schleife prüfen, ob ein echter Fehler vorliegt.
Sicherheit: Bei dynamisch zusammengesetzten Multi-Queries unbedingt sämtliche Benutzereingaben mit mysqli_real_escape_string() oder Prepared Statements absichern, da multi_query SQL-Injection durch Einfügen weiterer Statements begünstigt.