Проблемы SELECT после вызова процедуры MySQL на php
После MySQL запроса, в котором происходит обращение к хранимой процедуре из PHP:
CALL procedureName()
следующий за ним запрос не выполняется, а объект mysqli_error возвратит ошибку:
Error «Commands out of sync; you can't run this command now» number «2014» in query: …
Это происходит тогда, когда процедура возвращает результат в виде таблицы, а не единичный результат (число или строка, или boolean).
Если хранимая процедура возвращает таблицу, то помимо таблицы выдаётся также ещё одно значение — результат выполнения самой процедуры. Такое поведение mysql драйвера называется множественный результат. Большинство разработчиков забирает первый и чаще всего единственный результат. В случае же, когда процедура возвращает таблицу, вторичный результат тоже надо вытянуть, иначе буфер результатов останется неочищенным и остальные запросы не пройдут — не смогут туда написать.
Сбросить ненужные результаты, вытащив их из буфера при использования объектов PDO, можно командой closeCursor():
$STH = $DBH->query("CALL procedureName ()"); while($row->fetch()) { #обработка данных } $STH->closeCursor();
При использовании MySQLI объекта, используйте команду store_result():
//$connection — ваш MySQLI объект while($connection->next_result()) { #обработка данных } $connection->store_result();