Die NEXT_RESULT () -Funktion spielt eine entscheidende Rolle bei der Behandlung von Multi-Statement-Abfragen mithilfe von PHP und MySQLs MySQLi- Erweiterung. Sie ermöglichen es Ihnen, mehrere Ergebnissätze nach Abfolge abzurufen. Manchmal können Sie jedoch auf verschiedene unerwartete Probleme stoßen, wenn Sie Ergebnissätze wechseln, z. B. "Befehle aus der Synchronisierung; Sie können diesen Befehl jetzt nicht ausführen". In diesem Artikel werden Probleme im Zusammenhang mit der NEXT_RESULT () -Funktion durch Protokollierung gefunden und behoben.
Mit MySQLI :: Multi_Query () können Sie mehrere SQL -Anweisungen in einer Abfrage senden, während Next_result () verwendet wird, um diese Ergebnissätze wiederum zu durchqueren. Zum Beispiel:
$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 {
error_log("Query failed: " . $mysqli->error);
}
Wenn Next_Result () nicht korrekt aufgerufen wird oder in der Mitte ein Fehler auftritt, wird dies eine Ausnahme vom Verbindungszustand verursacht.
Fehlermeldung: "Befehle außerhalb der Synchronisierung; Sie können diesen Befehl jetzt nicht ausführen."
Abfragen unterbrochen, das Ergebnis ist unvollständig
Die nächste SQL kann nicht weiter ausführen
Die meisten dieser Probleme hängen mit der Tatsache zusammen, dass das Ergebnis nicht vollständig verarbeitet wird, oder der Anruf von Next_Result () wird nicht aufgerufen.
Um Probleme zu beheben, können wir das Protokoll bei jedem Schritt protokollieren und den Anrufprozess und den Status verfolgen. Es wird empfohlen, ERROR_LOG () zum Schreiben in Protokolldateien zu verwenden:
function log_step($message) {
$logFile = '/var/log/php_next_result_debug.log';
error_log(date("[Y-m-d H:i:s] ") . $message . PHP_EOL, 3, $logFile);
}
In Kombination mit dem obigen Abfragebeispiel fügen wir die Protokollausgabe hinzu:
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
log_step("Multi-query started.");
do {
if ($result = $mysqli->store_result()) {
log_step("Result set retrieved.");
while ($row = $result->fetch_assoc()) {
log_step("Row: " . json_encode($row));
}
$result->free();
} elseif ($mysqli->errno) {
log_step("Error during store_result: " . $mysqli->error);
}
log_step("Calling next_result()...");
} while ($mysqli->next_result());
log_step("All result sets processed.");
} else {
log_step("Multi-query failed: " . $mysqli->error);
}
Wenn eine detailliertere Verfolgung erforderlich ist, können SQL -Inhalt, Ausführungszeit und Statuscode an jedem SQL -Ausführungspunkt aufgezeichnet werden. Darüber hinaus können Protokolle visuell zentral verwaltet werden, indem sie sie an Elch-, Graylog- oder selbstgebaute Protokollierungsplattformen senden.
log_step("SQL Executed: " . $sql . " on https://gitbox.net/db-query-monitor");
Verarbeiten Sie immer alle Ergebnissätze und rufen Sie Next_Result () an.
Verwenden Sie Protokolle, um jeden Schlüsselschritt für eine einfache Nach-Temption aufzuzeichnen.
Ignorieren Sie nicht MySQLI :: ERROR UND MYSQLI :: Errno, wenn eine Ausnahme auftritt.
Es kann eine einheitliche Multi-Quer-Ausführungsfunktion mit integrierter Protokolllogik für eine einfache Wiederverwendung zusammenfassen.