Start · Sprachen · PHP · Referenz · mysqli_more_results

mysqli_more_results

Funktion

Prüft, ob nach einer Mehrfachabfrage noch weitere Ergebnismengen vorhanden sind.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_more_results(mysqli $mysql): bool

Beschreibung

mysqli_more_results() wird in Kombination mit mysqli_multi_query() eingesetzt, um festzustellen, ob nach dem Abrufen einer Ergebnismenge noch weitere Ergebnismengen aus einer Mehrfachabfrage vorliegen. Die Funktion gibt true zurück, solange weitere Ergebnisse verfügbar sind, und false, sobald alle Ergebnisse verarbeitet wurden.

Typischerweise wird mysqli_more_results() als Schleifenbedingung verwendet: Zuerst ruft man die aktuelle Ergebnismenge mit mysqli_store_result() oder mysqli_use_result() ab, verarbeitet sie und wechselt dann mit mysqli_next_result() zur nächsten Ergebnismenge — solange mysqli_more_results() noch true liefert.

Diese Funktion ist besonders nützlich, wenn mehrere SQL-Anweisungen in einem einzigen Aufruf von mysqli_multi_query() ausgeführt werden, etwa bei der Ausführung von Stored Procedures, die mehrere Resultsets zurückgeben, oder beim Batchverarbeiten mehrerer SELECT-Abfragen.

In der objektorientierten Variante steht die Methode $mysqli->more_results() zur Verfügung.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Ein gültiges mysqli-Verbindungsobjekt, das von mysqli_connect() oder mysqli_init() zurückgegeben wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn noch weitere Ergebnismengen aus einer Mehrfachabfrage vorhanden sind, andernfalls false.

Beispiele

Mehrfachabfrage mit allen Ergebnissen verarbeiten

<?php
$mysqli = new mysqli('localhost', 'benutzer', 'geheim', 'testdb');

if ($mysqli->connect_errno) {
    die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}

$sql = "SELECT id, name FROM kunden LIMIT 3;
        SELECT id, titel FROM produkte LIMIT 3;";

if ($mysqli->multi_query($sql)) {
    do {
        // Aktuelle Ergebnismenge abrufen
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                print_r($row);
            }
            $result->free();
        }

        // Trennlinie zwischen den Ergebnismengen
        if ($mysqli->more_results()) {
            echo "--- Nächste Ergebnismenge ---\n";
        }
    } while ($mysqli->next_result());
} else {
    echo 'Fehler bei Mehrfachabfrage: ' . $mysqli->error;
}

$mysqli->close();
Array ( [id] => 1 [name] => Max Mustermann ) ... --- Nächste Ergebnismenge --- Array ( [id] => 1 [titel] => Produkt A ) ...

Prozedurale Variante mit mysqli_more_results

<?php
$link = mysqli_connect('localhost', 'benutzer', 'geheim', 'testdb');

if (!$link) {
    die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}

$sql = "SELECT COUNT(*) AS anzahl FROM kunden;
        SELECT COUNT(*) AS anzahl FROM produkte;";

if (mysqli_multi_query($link, $sql)) {
    $i = 1;
    do {
        if ($result = mysqli_store_result($link)) {
            $row = mysqli_fetch_assoc($result);
            echo "Abfrage $i: Anzahl = " . $row['anzahl'] . "\n";
            mysqli_free_result($result);
            $i++;
        }
    } while (mysqli_more_results($link) && mysqli_next_result($link));
}

mysqli_close($link);
Abfrage 1: Anzahl = 42 Abfrage 2: Anzahl = 158

// Wichtig · Fallstricke

Sicherheitshinweis: mysqli_multi_query() und damit auch mysqli_more_results() erlauben die Ausführung mehrerer SQL-Anweisungen. Werden Benutzereingaben in die Abfragen eingebaut, entsteht ein erhöhtes SQL-Injection-Risiko. Verwende niemals unvalidierte Benutzereingaben direkt in Mehrfachabfragen — setze stattdessen auf Prepared Statements oder strikte Eingabevalidierung.

Fehlerbehandlung: Wenn mysqli_next_result() auf einen Fehler in einer Teilabfrage trifft, bricht die Schleife möglicherweise vorzeitig ab. Prüfe nach der Schleife $mysqli->errno und $mysqli->error, um sicherzustellen, dass alle Abfragen erfolgreich waren.

Ressourcenverwaltung: Nicht abgerufene Ergebnismengen blockieren die Verbindung für weitere Abfragen. Stelle sicher, dass alle Ergebnisse mit store_result() / free() vollständig verarbeitet werden.