Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum gibt mysqli einen Commands out of sync error aus?

Der MySQL-Client erlaubt Ihnen nicht, eine neue Abfrage auszuführen, wenn noch Zeilen aus einer laufenden Abfrage abgerufen werden müssen. Siehe Befehle nicht synchron im MySQL-Dokument zu häufigen Fehlern.

Sie können mysqli_store_result() verwenden um alle Zeilen aus der äußeren Abfrage vorab abzurufen. Dadurch werden sie im MySQL-Client gepuffert, sodass Ihre App aus Sicht des Servers die vollständige Ergebnismenge abgerufen hat. Dann können Sie sogar in einer Schleife zum Abrufen von Zeilen aus der jetzt gepufferten äußeren Ergebnismenge weitere Abfragen ausführen.

Oder Sie mysqli_result::fetch_all() die die vollständige Ergebnismenge als PHP-Array zurückgibt, und dann können Sie dieses Array durchlaufen.

Das Aufrufen gespeicherter Prozeduren ist ein Sonderfall, da eine gespeicherte Prozedur das Potenzial hat, mehrere Ergebnismengen zurückzugeben, von denen jede über einen eigenen Satz von Zeilen verfügen kann. Aus diesem Grund erwähnt die Antwort von @a1ex07 die Verwendung von mysqli_multi_query() und Schleife bis mysqli_next_result() hat keine Ergebnismengen mehr. Dies ist notwendig, um das MySQL-Protokoll zu erfüllen, selbst wenn in Ihrem Fall Ihre gespeicherte Prozedur eine einzige Ergebnismenge hat.

PS:Übrigens sehe ich, dass Sie die verschachtelten Abfragen durchführen, weil Sie Daten haben, die eine Hierarchie darstellen. Möglicherweise möchten Sie die Daten anders speichern, damit Sie sie einfacher abfragen können. Ich habe dazu eine Präsentation mit dem Titel Models for Hierarchical Data with SQL and PHP . Ich behandle dieses Thema auch in einem Kapitel meines Buches SQL Antipatterns:Avoiding the Pitfalls of Database Programmierung .

So implementieren Sie mysqli_next_result() in CodeIgnitor 3.0.3:

In Zeile 262 von system/database/drivers/mysqli/mysqli_driver.php ändern

protected function _execute($sql)
{
    return $this->conn_id->query($this->_prep_query($sql));
}

dazu

protected function _execute($sql)
{
    $results = $this->conn_id->query($this->_prep_query($sql));
    @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
    return $results;
}

Dies ist ein Problem seit 2.x. Ich habe gerade auf 3.x aktualisiert und musste diesen Hack auf die neue Version kopieren.