Bei Verwendung von MySQLI -Erweiterungen für Datenbankvorgänge in PHP müssen wir häufig mySQLI_STMT :: FREE_RESULT () verwenden, um das Ausführungsergebnis zu befreien, um Speicherlecks zu vermeiden. In der tatsächlichen Entwicklung können Sie jedoch auf das Problem von MySQLI_STMT :: FREE_RESULT ERRAGE "NO ERECTION SET" stoßen. Dieser Artikel wird die gemeinsamen Ursachen dieses Problems und seiner Lösungen ausführlich analysieren.
MySQLI_STMT :: FREE_RESULT () ist eine Methode in der MySQLI -Erweiterung, um das Abfrageergebnissatz zu veröffentlichen. Normalerweise kann nach der Ausführung einer ausgewählten Abfrage, wenn das Ergebnissatz nicht mehr benötigt wird, das Aufrufen dieser Methode den Speicher freisetzen und den Ressourcenverbrauch verringern.
Zum Beispiel:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result(); // Ergebnisse speichern
// Die Datenverarbeitung kann zu diesem Zeitpunkt durchgeführt werden...
$stmt->free_result(); // Füllen Sie das Ergebnissatz frei
Der Fehler "No -Ergebnis -Set" tritt normalerweise auf, wenn free_result () aufgerufen wird, das Programm keine Abfrageoperation durchführt oder die Abfrage die Ergebnismenge nicht zurückgibt. Insbesondere bedeutet der Fehler: Die Methode free_result () versucht, eine Ergebnismenge zu befreien, die nicht existiert.
Fehlanpassung vom Abfragetyp :
Wenn eine Abfrage zum Nicht-Auswahltyp ausgeführt wird (z. B. Einfügen, Aktualisieren, Löschen usw.), erzeugen diese Abfragen keine Ergebnismenge, sodass das Aufrufen von Free_Result () diesen Fehler verursacht.
Lösung :
Stellen Sie sicher, dass Free_Result () nur nach der Auswahlabfrage aufgerufen wird.
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$stmt->execute();
// Rufen Sie nicht an free_result(),Weil es keine Ergebnismenge gibt
Store_result () oder bind_result () wird nicht genannt :
Nach der Ausführung der Auswahl der Auswahl wird der Ergebnissatz nur dann generiert, wenn store_result () oder bind_result () aufgerufen wird. Wenn free_result () ohne eine Ergebnismenge aufgerufen wird, wird ein Fehler gemeldet.
Lösung :
Stellen Sie vor dem Aufrufen von Free_Result () sicher, dass store_result () oder bind_result () aufgerufen wurde.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result(); // Stellen Sie sicher, dass das Ergebnissatz gespeichert ist
$stmt->free_result(); // Jetzt sicher anzurufen
Die Abfrage wurde nicht erfolgreich ausgeführt :
Wenn die SQL -Abfrage aus irgendeinem Grund nicht erfolgreich ausgeführt wird (z. B. Syntaxfehler, Verbindungsprobleme usw.), gibt es kein Ergebnis für die Rückgabe und beim Aufrufen von Free_Result () wird ein Fehler gemeldet.
Lösung :
Stellen Sie sicher, dass die SQL -Abfrage erfolgreich ausgeführt wird, und rufen Sie anschließend Free_Result () an. Dieses Problem kann vermieden werden, indem überprüft wird, ob die Abfrage erfolgreich ausgeführt wurde.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
if ($stmt === false) {
die('MySQL prepare failed: ' . $mysqli->error);
}
$stmt->bind_param("i", $userId);
$stmt->execute();
if ($stmt->affected_rows > 0) {
$stmt->store_result();
$stmt->free_result();
}
Aussage im Voraus schließen :
Wenn die Abfrageanweisung im Voraus ( $ stmt-> close () ) vor der Ausführung der Abfrage und des Speicherns der Ergebnisse geschlossen wird, wird das Abfrageergebnis nicht zugänglich sein, und ein Fehler wird beim Aufrufen von FREE_RESULT () auftreten.
Lösung :
Stellen Sie sicher, dass Sie die Anweisung nach Abschluss der Abfrageverarbeitung abschließen.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result(); // 必须先Ergebnisse speichern
$stmt->free_result(); // Dann können die Ergebnisse veröffentlicht werden
$stmt->close(); // Letzte Aussage
Die Abfrage gibt ein leeres Ergebnissatz zurück :
Wenn die Auswahlabfrage keine Ergebnisse zurückgibt (z. B. nicht übereinstimmen Abfragebedingungen), meldet das Aufrufen von Free_Result () normalerweise keinen Fehler, aber in einigen Konfigurationen oder Umgebungen kann inkonsistentes Verhalten auftreten. Obwohl dies nicht die direkte Ursache eines Fehlers ist, kann dies manchmal andere unerwartete Probleme verursachen.
Lösung :
Überprüfen Sie, ob die Abfrage Daten zurückgibt, bevor Sie free_result () aufrufen.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Es gibt Ergebnisse
$stmt->free_result();
} else {
echo "Es wurden keine Ergebnisse gefunden";
}
MySQLI_STMT :: FREE_RESULT ERROR "Keine Ergebnismenge" wird normalerweise durch die Abfrage verursacht, die das Ergebnissatz nicht zurückgibt, oder free_result () wird aufgerufen, ohne store_result () oder bind_result () zu korrekt aufgerufen. Um solche Fehler zu vermeiden, sollten Entwickler auf die folgenden Punkte achten:
Stellen Sie sicher, dass Free_Result () nur nach der Auswahlabfrage aufgerufen wird.
Achten Sie darauf , store_result () oder bind_result () auszuführen, bevor Sie free_result () aufrufen.
Überprüfen Sie, ob die SQL -Abfrage erfolgreich ausgeführt wird.
Füllen Sie alle Vorgänge aus, bevor Sie die Erklärung abschließen.
Durch die oben genannten Methoden und Techniken kann dieser Fehler effektiv vermieden werden und der Datenbankvorgang kann reibungslos gewährleistet werden.