Start · Sprachen · PHP · Referenz · mysqli_stmt_next_result

mysqli_stmt_next_result

Funktion

Wechselt zum nächsten Ergebnis-Set einer Mehrfachabfrage bei einem vorbereiteten Statement.

seit PHP 5.3.0 Kategorie: db

Signatur

mysqli_stmt_next_result(mysqli_stmt $statement): bool

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

Typ
bool
Beschreibung
Gibt 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();
Ergebnis-Set 1: ID: 1, Name: Alice ID: 2, Name: Bob Ergebnis-Set 2: Produkt: Apfel, Preis: 0.99 Produkt: Birne, Preis: 1.49

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();
=== Ergebnis-Set 1 === Wert1 | Wert2 === Ergebnis-Set 2 === WertA | WertB

// 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.