MySQL клиентът не ви позволява да изпълните нова заявка, където все още има редове за извличане от заявка в процес на изпълнение. Вижте Командите не са синхронизирани в MySQL документа за често срещани грешки.
Можете да използвате mysqli_store_result()
за предварително извличане на всички редове от външната заявка. Това ще ги буферира в MySQL клиента, така че от гледна точка на сървъра вашето приложение е извлечело пълния набор от резултати. След това можете да изпълнявате повече заявки дори в цикъл от извличане на редове от сега буферирания външен резултатен набор.
Или вие mysqli_result::fetch_all()код>
който връща пълния набор от резултати като PHP масив и след това можете да преминете през този масив.
Извикването на съхранени процедури е специален случай, тъй като съхранената процедура има потенциал за връщане на множество набори от резултати, всеки от които може да има свой собствен набор от редове. Ето защо отговорът от @a1ex07 споменава използването на mysqli_multi_query()
и се повтаря до mysqli_next_result()
няма повече набори от резултати. Това е необходимо, за да се удовлетвори MySQL протокола, дори ако във вашия случай вашата съхранена процедура има единичен набор от резултати.
PS:Между другото, виждам, че правите вложените заявки, защото имате данни, представляващи йерархия. Може да искате да помислите за съхраняване на данните по различен начин, за да можете да ги потърсите по-лесно. Направих презентация за това, озаглавена Модели за йерархични данни с SQL и PHP . Също така разглеждам тази тема в една глава от книгата си SQL Antipatterns:Избягване на клопките на базата данни Програмиране .
Ето как да приложите mysqli_next_result()
в CodeIgnitor 3.0.3:
На ред 262 от system/database/drivers/mysqli/mysqli_driver.php
промяна
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
към това
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;
}
Това е проблем от 2.x. Току-що актуализирах до 3.x и трябваше да копирам този хак в новата версия.