Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо mysqli дава грешка при несинхронизиране на команди?

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 и трябваше да копирам този хак в новата версия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да мигрираме самостоятелен Moodle към мащабируема настройка на клъстерирана база данни

  2. Как да преброите всички редове, когато използвате SELECT с LIMIT в MySQL заявка?

  3. MySQL, актуализирайте множество таблици с една заявка

  4. Изтриване на заявка за изтриване на редове в MySQL

  5. MySQL – Как да генерираме произволно число