Проблемы 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();
