Signatur
Beschreibung
mysqli_stmt_next_result() wird verwendet, wenn ein vorbereitetes Statement (mysqli_stmt) mehrere Ergebnis-Sets zurückliefert – beispielsweise bei der Ausführung einer gespeicherten Prozedur (Stored Procedure), die mehrere SELECT-Anweisungen enthält. Die Funktion bewegt den internen Zeiger auf das nächste verfügbare Ergebnis-Set.
Bevor mysqli_stmt_next_result() aufgerufen werden kann, muss das aktuelle Ergebnis-Set vollständig verarbeitet worden sein. Dazu wird in der Regel mysqli_stmt_free_result() aufgerufen oder alle Zeilen des aktuellen Ergebnisses wurden per mysqli_stmt_fetch() abgerufen.
Die Funktion gibt true zurück, wenn ein weiteres Ergebnis-Set vorhanden ist, und false, wenn keine weiteren Ergebnisse verfügbar sind oder ein Fehler aufgetreten ist. Um zwischen diesen beiden Fällen zu unterscheiden, kann mysqli_stmt_errno() geprüft werden.
Diese Funktion ist das vorbereitete Pendant zur prozeduralen Funktion mysqli_next_result(), die bei einfachen Abfragen über mysqli_multi_query() eingesetzt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Statement-Objekt, das durch mysqli_stmt_init() oder mysqli_prepare() erzeugt wurde. |
Rückgabewert
true zurück, wenn ein weiteres Ergebnis-Set verfügbar ist, andernfalls false. Im Fehlerfall wird ebenfalls false zurückgegeben; dann liefert mysqli_stmt_errno() einen Fehlercode ungleich null.Beispiele
Mehrere Ergebnis-Sets einer Stored Procedure verarbeiten
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Stored Procedure, die zwei SELECT-Abfragen enthält
$stmt = $mysqli->prepare('CALL get_multiple_results()');
$stmt->execute();
// Erstes Ergebnis-Set verarbeiten
$stmt->bind_result($id, $name);
echo "Ergebnis-Set 1:\n";
while ($stmt->fetch()) {
echo "ID: $id, Name: $name\n";
}
$stmt->free_result();
// Zum nächsten Ergebnis-Set wechseln
if (mysqli_stmt_next_result($stmt)) {
$stmt->bind_result($product, $price);
echo "Ergebnis-Set 2:\n";
while ($stmt->fetch()) {
echo "Produkt: $product, Preis: $price\n";
}
$stmt->free_result();
}
$stmt->close();
$mysqli->close();
Alle Ergebnis-Sets mit einer Schleife durchlaufen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$stmt = $mysqli->prepare('CALL get_all_datasets()');
$stmt->execute();
$resultIndex = 1;
do {
$stmt->bind_result($col1, $col2);
echo "=== Ergebnis-Set $resultIndex ===\n";
while ($stmt->fetch()) {
echo "$col1 | $col2\n";
}
$stmt->free_result();
$resultIndex++;
} while (mysqli_stmt_next_result($stmt));
// Fehlerprüfung
if ($stmt->errno) {
echo 'Fehler beim Wechseln des Ergebnis-Sets: ' . $stmt->error . "\n";
}
$stmt->close();
$mysqli->close();
// Wichtig · Fallstricke
Reihenfolge der Verarbeitung: Das aktuelle Ergebnis-Set muss vollständig abgerufen (mysqli_stmt_fetch()) oder explizit freigegeben (mysqli_stmt_free_result()) worden sein, bevor mysqli_stmt_next_result() aufgerufen wird. Andernfalls kann es zu unerwarteten Fehlern kommen.
Fehlerunterscheidung: Da die Funktion sowohl bei kein weiteres Ergebnis als auch bei einem echten Fehler false zurückgibt, sollte nach einem false-Rückgabewert immer mysqli_stmt_errno() geprüft werden, um echte Fehler von einem normalen Ende der Ergebnis-Sets zu unterscheiden.
Verfügbarkeit: Diese Funktion ist nur relevant, wenn der MySQL-Server Stored Procedures oder Mehrfachabfragen mit mehreren Result-Sets unterstützt. Für einfache Statements ohne mehrere Result-Sets ist sie nicht notwendig.