W3docs

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): bool

Im objektorientierten Stil lautet dieselbe Methode $mysqli->more_results().

Parameter

  • $mysql — ein MySQLi-Verbindungsobjekt, das von mysqli_connect() (oder new 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:

FunktionAufgabe
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: 3

Die 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 ohne mysqli_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, UPDATE oder leeres SELECT) lässt mysqli_store_result() false zurückgeben — das ist normal, kein Fehler. Prüfen Sie mysqli_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 -> false

Verwandte Funktionen

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.

Übung

Übung
Was macht mysqli_more_results() in PHP?
Was macht mysqli_more_results() in PHP?
Was this page helpful?