Bei der Abfrage von Datenbanken mithilfe von MySQLI -Erweiterungen werden viele Entwickler auf eine verwirrende Frage stoßen: Was ist los? Dieser Artikel hilft Ihnen dabei, gemeinsame Missverständnisse zu sortieren und die Hauptursache des Problems zu finden.
MySQLi_Multi_Query ist eine Methode, die mehrere SQL -Anweisungen gleichzeitig ausführen kann, aber ein boolescher Wert zurückgibt. Das reale Ergebnissatz wird über mysqli_store_result oder mySQLI_USEL_RESULT erhalten.
Beispielcode:
<?php
$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()) {
echo "Aktuelle Ergebnismenge Zeilenzahl: " . $result->num_rows . "<br>";
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
?>
Wenn Sie versuchen, num_rows mit dem Multi_Query -Rückgabewert aufzurufen, erhalten Sie natürlich 0. Stellen Sie sicher, dass Sie das Ergebnis -Set -Objekt richtig erhalten.
Einige Entwickler haben $ stmt = $ mysqli-> vorbereiten (...) und dann direkt $ stmt-> num_rows verwendet, aber Hinweis: Vorbereitung führt keine Abfragen aus, sondern nur die Vorbereitung.
Die Abfrage muss zuerst ausgeführt werden und das Ergebnis muss erzielt werden:
<?php
$stmt = $mysqli->prepare("SELECT * FROM users WHERE age > ?");
$stmt->bind_param("i", $age);
$age = 18;
$stmt->execute();
$result = $stmt->get_result();
echo "Anzahl der Zeilen: " . $result->num_rows;
?>
Wenn Sie ausführen oder get_result überspringen, kann Num_rows keine Möglichkeit haben, darüber zu sprechen.
Standardmäßig verwendet MySQLI gepufferte Abfragen, und Sie können Num_rows direkt verwenden. Wenn Sie jedoch den MySQLI_USE_RESULT -Modus verwenden, wird das Ergebnissatz gestreamt, und MySQL kann die Gesamtzahl der Zeilen nicht berechnen, bevor es durchquert wird.
Beispiel:
<?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->num_rows; // Fehler:此时无法获取Anzahl der Zeilen
Die Lösung besteht darin, den Standardpuffermodus zu verwenden oder die Statistiken selbst durchzusetzen.
Viele Menschen glauben fälschlicherweise, dass num_rows in Einfügen , Aktualisieren und Löschen von Abfragen verwendet werden können. Tatsächlich haben diese Vorgänge keine Ergebnismenge, daher sollten Sie $ mySQLI-> betroffene_Rows verwenden.
<?php
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "受影响的Anzahl der Zeilen: " . $mysqli->affected_rows;
?>
Denken Sie daran: Nur der von der Auswahlabfrage erzeugte Ergebnissatz hat num_rows .
Wenn Sie auf num_rows stoßen, gibt es immer zuerst 0 zurück:
? Haben Sie Multi_Query verwendet, aber das Ergebnissatz nicht erhalten?
? Haben Sie vergessen, nach der Vorbereitung auszuführen und zu get_result ?
? Haben Sie den ungereinten Modus verwendet?
? Hast du den Abfragetyp falsch verstanden?
Indem Sie diese Missverständnisse vermeiden, können Sie MySQLI_Result und Num_Rows richtig verwenden und Umwege vermeiden.