Next_Result () ist eine entscheidende Funktion, wenn die MySQLI-Erweiterung von PHP für Datenbank-Multi-Quer-Operationen verwendet wird. Es wird verwendet, um mehrere Ergebnissätze nach einer gespeicherten Prozedur zu verarbeiten oder mehrere SQL -Anweisungen gleichzeitig zu senden. Viele Entwickler ignorieren jedoch ein Detail, wenn Sie Next_Result () verwenden: Bevor Sie Next_Result () anrufen, kann dies schwerwiegende Probleme verursachen.
Bei der Ausführung mehrerer SQL -Anweisungen mit MySQLI :: Multi_query () kann jede Anweisung eine Ergebnismenge zurückgeben. Sie müssen Store_Result () oder Use_Result () verwenden, um die aktuelle Ergebnismenge zu verarbeiten und dann Next_Result () zum nächsten Ergebnissatz zu verwenden.
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM products;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free(); // Ein sehr wichtiger Schritt
}
} while ($mysqli->next_result());
}
MySQLI :: Next_Result () funktioniert, solange das aktuelle Ergebnissatz gelöscht oder veröffentlicht wurde. Wenn Sie die Schritte store_result () oder free () überspringen, kann Next_Result () möglicherweise nicht korrekt auf die nächste Ergebnismenge verschoben werden, was dazu führt, dass nachfolgende Abfragenergebnisse niemals verarbeitet werden.
Hier sind die häufigsten Fehlermeldungen:
Commands out of sync; you can't run this command now
Dieser Fehler bedeutet, dass Sie in MySQL die falsche Reihenfolge der Operationen haben, z. B. der Versuch, eine neue Abfrage auszuführen oder auf das nächste Ergebnissatz zuzugreifen, bevor die aktuelle Ergebnismenge verarbeitet wird.
Obwohl der Müllsammlungsmechanismus von PHP normalerweise automatisch Ressourcen verarbeiten kann, kann in großen Datenvolumina oder langen Verbindungsszenarien das aktuelle Ergebnissatz nicht manuell kostenlos () zu einem langsamen Speicherwachstum führen, was sich letztendlich auf die Anwendungsleistung auswirkt.
Rufen Sie immer store_result () und free () das aktuelle Ergebnis in der Zeit auf.
Verwenden Sie eine klare Schleifenstruktur, um sicherzustellen, dass jedes Ergebnissatz sauber verarbeitet wird.
Fügen Sie für jeden Schritt Fehlerprüfungen hinzu, um logische Fehler zu vermeiden.
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// Verarbeitungsergebnisse
$result->free();
} else {
if ($mysqli->errno) {
echo "Abfrage fehlgeschlagen: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
Denken Sie bei Verwendung von Multi_query () und Next_Result () unbedingt: Bearbeiten Sie ein Ergebnis, bevor Sie die nächste Anfrage anfordern, die grundlegende Etikette, mit der Sie gut mit der Datenbank interagieren können. Andernfalls können Sie bald viele unerklärliche "Befehle aus der Synchronisierung" im Fehler -Einreichungssystem von gitbox.net sehen.