Entwickler verwenden häufig die Funktion Next_Result () , wenn sie PHP für Datenbankoperationen verwenden, insbesondere bei der Verwendung von MySQLI-Funktions-Set-Funktion (Multi_Query). Wenn es jedoch in der Schleife nicht ordnungsgemäß verwendet wird, kann es ausgelöst werden, was dazu führt, dass das Skript nicht normal endet. In diesem Artikel wird die Gründe für dieses Auftreten im Detail analysiert und eine zuverlässige Lösung bereitgestellt.
Angenommen, wir haben einen Code, der Multi_Query verwendet, um mehrere SQL -Anweisungen auszuführen:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "
SELECT * FROM users;
SELECT * FROM orders;
SELECT * FROM products;
";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
// Hier ist der Schlüssel
} while ($mysqli->next_result());
}
In diesem Code möchten wir drei ausgewählte Anweisungen nacheinander ausführen und ihre jeweiligen Ergebnissätze verarbeiten. Der Zweck von Next_Result () besteht darin, das nächste Ergebnissatz vorzubereiten.
Das Problem ist: Wenn das letzte Mal Next_Result () genannt wird, aber store_result () fehlerfrei zurückgibt (weil es keine mehr Ergebnissätze gibt), wird es eine tote Schleife eingeben.
Der Zweck von Next_Result () besteht darin, MySQLI auf das nächste Ergebnisset zu verschieben und einen Booleschen zu zurückzugeben:
Rückgabe wahre bedeutet, dass es mehr Ergebnissätze oder einen erfolgreichen Schalter gibt.
Rückgabe falsche bedeutet, dass es keine mehr Ergebnissätze gibt oder ein Fehler auftritt.
Wenn das letzte Ergebnissatz jedoch ein leeres Ergebnissatz ist (z. B. die letzte Aussage ist ausgewählt , aber kein Ergebnis oder eine nicht -mer -merschende Anweisung wie Update ), gibt Store_Result () falsche zurück, aber next_result () kann immer noch wahr zurückkehren, was zu tun ist, während die Ausführung fortgesetzt wird - es gibt keine Ausstiegsbedingung und die tote Schleife findet statt!
Sie können die more_results () -Methode verwenden, um festzustellen, ob es noch ein Ergebnissatz gibt, der verarbeitet werden kann:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "
SELECT * FROM users;
SELECT * FROM orders;
UPDATE users SET status = 'active' WHERE id = 1;
";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
} else {
// Kein Ergebnissatz,Vielleicht UPDATE、INSERT Warten
if ($mysqli->errno) {
echo "MySQL Fehler:" . $mysqli->error;
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
Wenn Sie die Anzahl der Ergebnissätze nicht vollständig bestimmen können, können Sie eine maximale Anzahl von Schleifen festlegen, um tote Schleifen zu verhindern:
$maxLoops = 10;
$loopCounter = 0;
if ($mysqli->multi_query($sql)) {
do {
if (++$loopCounter > $maxLoops) {
echo "Eine mögliche tote Schleife wurde festgestellt,Den Betrieb abbrechen";
break;
}
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
}
Wenn Sie Next_Result () verwenden, müssen Sie dem Rückgabewert besondere Aufmerksamkeit schenken, dem nicht vollständig vertrauenswürdig sind. Um mit More_Results () zu verwenden, sollten Sie nur dann fortfahren, wenn es tatsächlich das nächste Ergebnissatz gibt. Andernfalls ist es einfach, unter bestimmten SQL-Ausführungspfaden eine tote Schleife zu verursachen, insbesondere wenn es leere Ergebnissätze oder gemischte Ausführung von Nicht-Land-Anweisungen gibt.
Um weitere Best Practices über PHP- und Datenbankvorgänge zu sehen, können Sie besuchen: