Bei der Verwendung von PHP -Erweiterung von PHP für Datenbankvorgänge wird die Funktion Next_Result () häufig verwendet, um Abfragen zu verarbeiten, die mehrere Ergebnissätze enthalten (z. B. Multi_query () -Anrufe, die mehrere SQL -Anweisungen ausführen). Entwickler stellen jedoch manchmal fest, dass die Funktion falsch zurückgibt, was dazu führen kann, dass nachfolgende Ergebnissätze nicht verfügbar sind. Was sind die Gründe, warum Next_result () falsch zurückgibt? Wie kann man es beheben und es lösen?
Dieser Artikel wird dieses Problem im Detail analysieren.
MySQLI :: Next_Result () ist eine Methode, mit der zum nächsten Ergebnis -Set mit Multi_query () verwendet wird. Normalerweise müssen bei der Ausführung von Abfragen mit mehreren Statementen sie verwendet werden, um jedes Ergebnis einzeln zu erhalten.
Basisnutzungsbeispiele:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "Query Error: " . $mysqli->error;
}
Der häufigste Grund ist, dass alle Ergebnissätze gelesen wurden . Zu diesem Zeitpunkt wird der Anruf als Next_Result () falsch zurückgegeben und "keine Ergebnisse mehr" angibt.
Lösung: Steuern Sie einfach die Zyklusbeendigungsbedingungen vernünftigerweise, es ist keine zusätzliche Verarbeitung erforderlich.
Wenn eine der von Multi_Query () ausgeführten SQL-Anweisungen fehlschlägt, gibt Next_Result () FALSE zurück, und $ mysqli-> Fehler hat spezifische Fehlerinformationen.
Beispiel:
$sql = "SELECT * FROM valid_table; SELECT * FROM invalid_table;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// Verarbeitungsergebnisse
$result->free();
} else {
if ($mysqli->errno) {
echo "Error: " . $mysqli->error;
break;
}
}
} while ($mysqli->next_result());
}
Wenn der vorherige Ergebnissatz nicht korrekt freigegeben wird oder nicht explizit durch store_result () extrahiert wird, kann dies zu Problemen mit Next_Result () führen, insbesondere in älteren Versionen von PHP oder MySQL.
Vorschlag: Immer $ result-> Free () oder $ mySQLi-> store_result (), auch wenn Sie den Ergebnisinhalt nicht verarbeiten.
Multi_query () unterstützt mehrere Aussagen, unterstützt jedoch keine Anweisungskombinationen aller Typen. Beispielsweise kann die Ausführung bestimmter DDL -Anweisungen (z. B. Erstellen von Verfahren ) im strengen Modus eingeschränkt werden.
Vorschlag: Stellen Sie sicher, dass alle Aussagen legal sind und $ MySQLI-> Fehler bei Bedarf zur Fehlerbehebung verwenden.
Verwenden Sie ERROR_REPORTING (E_ALL) , um alle Fehleranforderungen zu aktivieren.
Überprüfen Sie $ MySQLI-> Errno und $ MySQLI-> Fehler für detaillierte Fehlerinformationen.
Protokollierung: Schreiben Sie jeden weiteren NEXT_RESULT () Rückgabewert und Fehlerausgabe in das Protokoll, um eine einfache Fehlerbehebung zu erhalten.
Verwenden Sie MySQLI_More_Results (), um festzustellen, ob noch ein Ergebnissatz vorhanden ist:
if ($mysqli->more_results()) {
$mysqli->next_result();
}
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders WHERE order_date > '2024-01-01'";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo "Daten: " . implode(", ", $row) . "<br>";
}
$result->free();
} else {
if ($mysqli->errno) {
echo "Fehler: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "Erste Anfrage fehlgeschlagen:" . $mysqli->error;
}