Signatur
Beschreibung
mysqli_stmt_more_results() wird verwendet, wenn ein vorbereitetes Statement im Rahmen einer Mehrfachabfrage (Multi-Query) ausgeführt wurde und man prüfen möchte, ob nach der aktuellen Ergebnismenge noch weitere vorhanden sind. Die Funktion gibt true zurück, solange weitere Ergebnismengen anstehen, andernfalls false.
Typischerweise wird diese Funktion in einer Schleife zusammen mit mysqli_stmt_next_result() eingesetzt, um alle Ergebnisse einer Mehrfachabfrage nacheinander zu verarbeiten. Dies ist nützlich, wenn gespeicherte Prozeduren oder mehrere SELECT-Anweisungen in einem einzigen Statement ausgeführt werden.
Bevor die nächste Ergebnismenge abgerufen werden kann, muss die aktuelle vollständig verarbeitet oder verworfen werden. Ein typisches Muster ist: Ergebnis holen, verarbeiten, mit mysqli_stmt_more_results() prüfen ob weitere vorhanden sind, und dann mit mysqli_stmt_next_result() zur nächsten wechseln.
Die Funktion steht sowohl im prozeduralen Stil (mysqli_stmt_more_results($stmt)) als auch im objektorientierten Stil ($stmt->more_results()) zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Ein mysqli_stmt-Objekt, das durch mysqli_prepare() erzeugt und bereits ausgeführt wurde. |
Rückgabewert
true zurück, wenn weitere Ergebnismengen aus der Mehrfachabfrage vorhanden sind, andernfalls false.Beispiele
Mehrere Ergebnismengen mit vorbereiteten Statements verarbeiten
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Mehrfachabfrage als Stored Procedure oder direkt
// Hinweis: mysqli_stmt_more_results() funktioniert bei Stored Procedures
$stmt = $mysqli->prepare('CALL hole_mehrere_ergebnisse()');
$stmt->execute();
do {
// Ergebnis an Variablen binden
$result = $stmt->get_result();
if ($result) {
while ($row = $result->fetch_assoc()) {
echo $row['name'] . PHP_EOL;
}
$result->free();
}
} while ($stmt->more_results() && $stmt->next_result());
$stmt->close();
$mysqli->close();
Prozeduraler Stil mit Fehlerbehandlung
<?php
$link = mysqli_connect('localhost', 'benutzer', 'passwort', 'datenbank');
if (!$link) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$stmt = mysqli_prepare($link, 'CALL get_users_and_orders()');
mysqli_stmt_execute($stmt);
do {
$result = mysqli_stmt_get_result($stmt);
if ($result) {
echo 'Neue Ergebnismenge:' . PHP_EOL;
while ($row = mysqli_fetch_assoc($result)) {
echo ' - ' . implode(', ', $row) . PHP_EOL;
}
mysqli_free_result($result);
}
} while (mysqli_stmt_more_results($stmt) && mysqli_stmt_next_result($stmt));
mysqli_stmt_close($stmt);
mysqli_close($link);
// Wichtig · Fallstricke
Wichtig: mysqli_stmt_more_results() ist nur dann sinnvoll einsetzbar, wenn das Statement tatsächlich mehrere Ergebnismengen erzeugt, beispielsweise beim Aufruf von Stored Procedures. Bei einfachen Einzelabfragen ist der Einsatz nicht erforderlich.
Werden nicht alle Ergebnismengen abgeholt, kann die Verbindung in einem inkonsistenten Zustand bleiben. Es ist daher wichtig, die Schleife vollständig zu durchlaufen oder die Verbindung danach zu schließen.
Die Funktion mysqli_stmt_get_result(), die in der Regel zusammen mit mysqli_stmt_more_results() verwendet wird, erfordert den mysqlnd-Treiber. Ohne diesen Treiber muss stattdessen mit mysqli_stmt_bind_result() gearbeitet werden.