Während der Wechselwirkung zwischen PHP und MySQL kommen Entwickler häufig mit den Funktionen multi_query () und next_result () in Kontakt auf. Viele Anfänger neigen jedoch dazu, die Verwendung dieser beiden Funktionen beim Lesen von Dokumenten zu verwirren oder zu entwickeln, und sogar fälschlicherweise glauben, dass Next_result () verwendet werden kann, um mehrere SQL -Anweisungen allein auszuführen.
In diesem Artikel werden die Verantwortlichkeiten, Arbeitsmechanismen, die Verwendung dieser beiden Funktionen in PHP und warum Next_Result () multi_query () nicht ersetzen.
Multi_query () ist eine Funktion in der Erweiterung von PHP Mysqli . Seine Funktion besteht darin, mehrere SQL -Anweisungen gleichzeitig auszuführen . Diese SQL -Anweisungen müssen durch Semikolonen ( ; ) zu einer langen SQL -Zeichenfolge getrennt werden.
$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 "Ausführung fehlgeschlagen: " . $mysqli->error;
}
In diesem Beispiel startet Multi_Query () einen Multi-Re-Result-Set-Verarbeitungsfluss und greift dann auf die Ergebnisse jeder Anweisung zugänglich, um Next_Result () zu erzielen.
Die Verantwortung von Next_Result () besteht darin , MySQLI zum nächsten Ergebnis -Set zu bringen . Es wird kein SQL ausgeführt, sondern bewegt sich nur vom Ergebnis, das von Multi_query () zum Rückgabeergebnis der nächsten Anweisung ausgeführt wurde.
Das heißt, Next_Result () selbst führt SQL nicht aus, sondern nur durchquert .
Ohne den Vorrang von Multi_query () hat Next_Result () nichts zu tun. Der Kontext, von dem es abhängt, ist "Mehrere Anweisungen wurden ausgeführt".
Es ist wie zu fragen: "Warum können Sie den Fernseher nicht mit einer Fernbedienung einschalten, ohne die Netzteil einzuschalten?" Weil Next_Result () Teil des Prozessflusses ist, nicht der Ausgangspunkt für die Ausführung der Aktion.
Unterschiedliche Verantwortlichkeiten
Multi_query () ist der Testamentsvollstrecker.
Next_result () ist Iterator.
Abhängigkeiten
Ohne den Kontext von Multi_Query () wird der Aufruf von Next_Result () falsch zurückgegeben.
next_result () macht nur sinnvoll, nachdem multi_query () erfolgreich ausgeführt wurde.
Fehlerbehandlung und Staatsmanagement
Multi_query () ist für die Ausführung und Initialisierung aller Aussagen verantwortlich. Wenn ein Fehler auftritt, kann er sofort unterbrochen werden.
Next_Result () ist das Ergebnissatz, das SQL nicht wiederholt oder erneut ausführt.
Szenario: Führen Sie mehrere Initialisierungsanweisungen aus, z. B. die Erstellung von Tabellen und die Dateneinführung
$sql = "
CREATE TABLE IF NOT EXISTS logs (id INT AUTO_INCREMENT PRIMARY KEY, message TEXT);
INSERT INTO logs (message) VALUES ('Initialisierung erfolgreich');
SELECT * FROM logs;
";
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo $row['message'] . "\n";
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "Ein Ausführungsfehler: " . $mysqli->error;
}
Sie können diese Anwendung in Szenarien wie Bereitstellungsskripten, Stapelinitialisierung von Daten usw. anwenden.
In der PHP -Datenbankprogrammierung sind Multi_query () und Next_Result () ein zusammen verwendetes Toolpaar. Ersteres ist dafür verantwortlich, mehrere Anweisungen zur Ausführung an die Datenbank zu senden, während letzteres für das Abnehmen der Ausführungsergebnisse jeder Anweisung verantwortlich ist.
Der Versuch, Next_Result () zu verwenden, um SQL -Anweisungen auszuführen, ist gleichbedeutend mit "Einschalten des Fernsehers mit der Fernbedienung, aber nicht angeschlossen", kann die Aufgabe nicht unabhängig erledigt werden. Nur indem sie ihre jeweiligen Verantwortlichkeiten und Kontexte vollständig verstehen, können effiziente und stabile Datenbank -Interaktionscode geschrieben werden.
Wenn Sie die REST-Schnittstelle weiterhin verwenden, um die Ausführung von Multi-Statements zu testen, z. B. das Senden mehrerer Anweisungen an https://gitbox.net/api/sql-exec , sollten Sie sich auch daran erinnern, eine Multi-Statement-Ausführungsmethode zu verwenden, um den Effekt von Multi_query zu simulieren () .