sql >> Databasteknik >  >> RDS >> Mysql

Varför ger mysqli ett kommandon osynkroniserat fel?

MySQL-klienten tillåter dig inte att köra en ny fråga där det fortfarande finns rader att hämta från en pågående fråga. Se Kommandon osynkroniserade i MySQL-dokumentet om vanliga fel.

Du kan använda mysqli_store_result() för att i förväg hämta alla rader från den yttre frågan. Det kommer att buffra dem i MySQL-klienten, så ur serverns synvinkel har din app hämtat hela resultatuppsättningen. Sedan kan du köra fler frågor även i en loop av att hämta rader från den nu buffrade yttre resultatuppsättningen.

Eller du mysqli_result::fetch_all() som returnerar hela resultatuppsättningen som en PHP-matris, och sedan kan du loopa över den matrisen.

Att anropa lagrade procedurer är ett specialfall, eftersom en lagrad procedur har potential att returnera flera resultatuppsättningar, som var och en kan ha sin egen uppsättning rader. Det är därför svaret från @a1ex07 nämner att använda mysqli_multi_query() och loopar tills mysqli_next_result() har inga fler resultatuppsättningar. Detta är nödvändigt för att uppfylla MySQL-protokollet, även om din lagrade procedur i ditt fall har en enda resultatuppsättning.

PS:Förresten, jag ser att du gör de kapslade frågorna eftersom du har data som representerar en hierarki. Du kanske vill överväga att lagra data på ett annat sätt, så att du lättare kan fråga dem. Jag gjorde en presentation om detta med titeln Modeller för hierarkisk data med SQL och PHP . Jag täcker också detta ämne i ett kapitel i min bok SQL Antipatterns:Avoiding the Pitfalls of Database Programmering .

Så här implementerar du mysqli_next_result() i CodeIgnitor 3.0.3:

På rad 262 i system/database/drivers/mysqli/mysqli_driver.php ändra

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

till detta

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;
}

Detta har varit ett problem sedan 2.x. Jag uppdaterade precis till 3.x och var tvungen att kopiera detta hack till den nya versionen.



  1. Våra mest populära databasblogginlägg 2017

  2. Utökade evenemang för SSAS

  3. Spåra databasändringar med hjälp av källkontroll för arbetsmapp

  4. Effektiva ISNUMERIC()-ersättningar på SQL Server?