Aktueller Standort: Startseite> Neueste Artikel> MySQLi_Result Anrufe fetch_* öfters verursachen, dass das Ergebnis "gefressen" wird? Was ist los

MySQLi_Result Anrufe fetch_* öfters verursachen, dass das Ergebnis "gefressen" wird? Was ist los

M66 2025-05-18

Bei der Entwicklung mithilfe der MySQL -Datenbank ist MySQLI_Result eine häufig verwendete Klasse, die eine Kapselung von Abfrageergebnissen liefert, mit der Entwickler Daten in dem Ergebnis extrahieren können, das durch eine Reihe von Fetch_* -Methoden festgelegt wird. Viele Entwickler stoßen jedoch auf ein Problem bei der Verwendung dieser Methoden: Nach mehreren Aufrufen der Fetch_* -Methode scheinen die Abfrageergebnisse "zu verschwinden" und können nicht erneut zugegriffen werden. Was ist los? Lassen Sie uns einen tieferen Blick darauf werfen.

1. Das grundlegende Konzept von MySQLI_Result

Nachdem die MySQL -Abfrage ausgeführt wurde, wird die zurückgegebene Ergebnismenge in ein MySQLi_Result -Objekt eingekapselt. In PHP können wir Datenzeile per Leitung lesen, indem wir verschiedene Fetch_* -Methoden aufrufen, wie z. B.:

  • fetch_assoc () : Gibt die Ergebniszeile im assoziativen Array zurück.

  • Fetch_row () : Gibt die Ergebniszeile in der Indizierung des Arrays zurück.

  • fetch_object () : Gibt die Ergebniszeile als Objekt zurück.

Zum Beispiel:

 $conn = new mysqli("localhost", "user", "password", "database");
$query = "SELECT * FROM users";
$result = $conn->query($query);

Zu diesem Zeitpunkt ist das $ result -Objekt ein MySQLI_Result , mit dem die obige Fetch_* -Methode aufgerufen werden kann.

2. Warum verursachen mehrere Anrufe zum Fetch_* das Ergebnis auf "verschwinden"?

Wenn das Objekt mySQLi_Result die Methode fetch_* aufruft, liest es tatsächlich die Datenzeile für Zeile. Wenn Sie die Fetch_* -Methode aufrufen, wird der Zeiger auf die Ergebnismenge voranschreitet. Dies bedeutet, dass jedes Mal, wenn Fetch_* aufgerufen wird, eine Datenreihe verbraucht und die Position des Zeigers aktualisiert wird. Wenn Sie die Fetch_* -Methode mehrmals aufrufen, wird die Zeile für Zeile gelesen, bis keine Daten mehr zu lesen sind.

Zum Beispiel:

 while ($row = $result->fetch_assoc()) {
    // Verarbeitungsdaten
}

while ($row = $result->fetch_assoc()) {
    // Hier werden keine Daten erhalten,Weil die vorherige Abfrage das Ergebnissatz vollständig konsumiert hat
}

Wie oben gezeigt, liest die erste während der Schleife alle Daten und verbraucht das gesamte Ergebnissatz. Wenn die zweite während der Schleife versucht, die Daten erneut zu erhalten, wurde das Ergebnissatz "gefressen" und kann daher die Daten nicht erhalten.

3. Wie kann man diese Situation vermeiden?

Um dies zu vermeiden, können wir die folgenden Methoden annehmen:

3.1 Verwenden Sie die Methode mysqli_data_seek ()

Wenn Sie das Ergebnissatz neu übertrieben müssen, können Sie die Methode mySQLI_DATA_SEEK () verwenden, um den Datenzeiger zurückzusetzen. Zum Beispiel:

 $result = $conn->query("SELECT * FROM users");

while ($row = $result->fetch_assoc()) {
    // Lesen Sie zum ersten Mal Daten
}

// Reset -Ergebnis -Set -Zeiger zurücksetzen
$result->data_seek(0);

while ($row = $result->fetch_assoc()) {
    // Lesen Sie zum zweiten Mal Daten
}

Durch Aufrufen von Data_seek (0) können Sie den Datenzeiger auf den Beginn des Ergebnissatzes zurücksetzen und so die Daten erneut lesen.

3.2 Verwenden von MySQLI_Fetch_all () -Methoden

Wenn Sie alle Daten gleichzeitig abrufen möchten, können Sie die Methode mySQLI_Fetch_all () verwenden, mit der alle Daten gleichzeitig in ein Array extrahiert werden, ohne es für Zeile wie Fetch_* zu lesen. Zum Beispiel:

 $result = $conn->query("SELECT * FROM users");
$rows = $result->fetch_all(MYSQLI_ASSOC);

// Sie können es mehrmals verwenden $rows Daten in Array
foreach ($rows as $row) {
    // Verarbeitungsdaten
}

Dieser Ansatz vermeidet die Situation, in der die Ergebnismenge für die Zeile gelesen wird und die Ergebnismenge verbraucht, sodass Sie die Ergebnisdaten an mehreren Stellen verwenden können.

3.3 Die Lagenabfrage führt zum Speicher

Wenn Ihre Abfrageergebnisse gering sind, können Sie die Daten auch in einem Array speichern und die Daten im Array wiederverwenden. Zum Beispiel:

 $result = $conn->query("SELECT * FROM users");
$data = [];

while ($row = $result->fetch_assoc()) {
    $data[] = $row;
}

// Sie können es mehrmals verwenden $data Array
foreach ($data as $row) {
    // Verarbeitungsdaten
}

Diese Methode vermeidet auch eine wiederholte Abfrage der Datenbank und vermeidet auch das Problem, dass das Ergebnis "gefressen" wird.

4. Zusammenfassung

Wenn Sie die Fetch_* -Methode mehrmals aufrufen, wird die Ergebnismenge für Zeile gelesen und konsumiert. Wenn Sie das Ergebnissatz mehrmals durchqueren möchten, unter Verwendung von MySQLI_DATA_SEEK () , um den Ergebnisssatzzeiger zurückzusetzen, oder mit MySQLI_Fetch_all () , um alle Daten auf einmal zu erhalten, ist dies eine gute Wahl. Mit diesen Methoden können Sie die während der Entwicklung aufgetretenen Probleme "Ergebnissätze werden" vermeiden und sicherstellen, dass die Daten korrekt gelesen werden.