more_results
Dieser Artikel erklärt die PHP-Funktion mysqli_more_results(), mit der geprüft wird, ob nach einer Multi-Query-Ausführung weitere Ergebnisse vorliegen.
Die Funktion mysqli_more_results() prüft, ob nach dem gleichzeitigen Ausführen mehrerer SQL-Anweisungen mit mysqli_multi_query() noch ein weiteres Ergebnis-Set wartet. Sie ist ein Teil des kleinen Werkzeugkastens, mit dem Sie die Ergebnisse einer Multi-Statement-Abfrage durchlaufen. Dieser Artikel erklärt die Syntax, den Rückgabewert, das zugehörige Schleifenmuster und die häufigen Fallstricke.
Syntax
mysqli_more_results(mysqli $mysql): boolIm objektorientierten Stil lautet dieselbe Methode $mysqli->more_results().
Parameter
$mysql— ein MySQLi-Verbindungsobjekt, das vonmysqli_connect()(odernew mysqli(...)) zurückgegeben wird.
Rückgabewert
mysqli_more_results() gibt true zurück, wenn nach dem letzten Aufruf von mysqli_multi_query() noch ein oder mehrere Ergebnis-Sets verfügbar sind, und false, wenn keine weiteren vorhanden sind. Es rückt nicht zum nächsten Set vor — dafür rufen Sie mysqli_next_result() auf.
Wann wird sie verwendet?
Ein einzelnes mysqli_query() gibt ein Ergebnis-Set zurück, sodass Sie dort mysqli_more_results() nie benötigen. Sie ist nur bei mysqli_multi_query() relevant, das es erlaubt, mehrere durch ; getrennte Anweisungen in einem Roundtrip zu senden — beispielsweise ein Stored-Procedure-Aufruf, der mehrere SELECTs zurückgibt, oder ein Batch-Import-Skript. mysqli_more_results() ist die Schleifenbedingung, die angibt, wann gestoppt werden soll.
Das Standard-Schleifenmuster
Drei Funktionen arbeiten zusammen:
| Funktion | Aufgabe |
|---|---|
mysqli_more_results() | Gibt es noch ein weiteres Ergebnis-Set? |
mysqli_next_result() | Zum nächsten Ergebnis-Set vorrücken. |
mysqli_store_result() | Das aktuelle Ergebnis-Set abrufen, um Zeilen lesen zu können. |
<?php
$mysqli = mysqli_connect("localhost", "user", "pass", "demo");
mysqli_multi_query($mysqli, "SELECT 1 AS n; SELECT 2 AS n; SELECT 3 AS n;");
do {
// Fetch the result set for the current statement.
if ($result = mysqli_store_result($mysqli)) {
$row = mysqli_fetch_assoc($result);
echo "Result: {$row['n']}\n";
mysqli_free_result($result);
}
// Keep going only while another set is queued AND we can advance to it.
} while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
mysqli_close($mysqli);
?>Für die drei obigen Anweisungen gibt dies aus:
Result: 1
Result: 2
Result: 3Die do...while-Schleife (kein einfaches while) ist beabsichtigt: Das erste Ergebnis-Set ist unmittelbar nach mysqli_multi_query() bereits aktuell, daher muss es verarbeitet werden, bevor auf weitere geprüft wird.
Fallstricke
- Immer mit
mysqli_next_result()kombinieren.mysqli_more_results()meldet nur den Zustand; es bewegt den Zeiger nie vorwärts. Der Aufruf in einer Schleife ohnemysqli_next_result()führt zu einer Endlosschleife beim ersten Set. - Jedes Ergebnis-Set freigeben. Rufen Sie
mysqli_free_result()vor dem Vorrücken auf, sonst bleiben zusätzliche Ergebnis-Sets im Speicher. - Eine Anweisung ohne Zeilen (ein
INSERT,UPDATEoder leeresSELECT) lässtmysqli_store_result()falsezurückgeben — das ist normal, kein Fehler. Prüfen Siemysqli_errno($mysqli), wenn Sie beide Fälle unterscheiden müssen.
Den Rückgabewert ohne Datenbank demonstrieren
Sie benötigen keinen laufenden Server, um zu sehen, was die Funktion meldet. Die Logik mit einem kleinen Array nachzubilden, zeigt die Schleife und den booleschen Wert klar:
<?php
$resultSets = ["one", "two", "three"];
$index = 0;
do {
echo "Processing: {$resultSets[$index]}\n";
$index++;
// more_results() is true while another set remains.
$more = $index < count($resultSets);
echo $more ? "more_results -> true\n" : "more_results -> false\n";
} while ($more);
?>Ausgabe:
Processing: one
more_results -> true
Processing: two
more_results -> true
Processing: three
more_results -> falseVerwandte Funktionen
mysqli_multi_query()— führt die mehreren Anweisungen überhaupt erst aus.mysqli_next_result()— rückt zum nächsten Ergebnis-Set vor.mysqli_use_result()— eine Alternative zustore_result(), die Zeilen streamt.- Die MySQLi-Erweiterung im Überblick — wie all diese Funktionen zusammenpassen.
Fazit
mysqli_more_results() ist die „Gibt es noch mehr?"-Prüfung in der Multi-Query-Schleife. Allein tut sie wenig; kombiniert mit mysqli_next_result() und mysqli_store_result() in einer do...while-Schleife ermöglicht sie die saubere Verarbeitung jedes Ergebnis-Sets, das ein einzelner mysqli_multi_query()-Aufruf zurückgibt.