Контекст проблемы
Я относительно новичок в большинстве языков, над которыми я работаю, и постепенно возвращаюсь и улучшаю старый код. Я переписываю старый PHP и заменяю жестко запрограммированные SQL-запросы ( я знаю ) с вызовами хранимых процедур.
Код на моих страницах организован в следующем порядке:
$RESULT_one = $connection->query( ... my first query ... ); $RESULT_two = $connection->query( ... my second query ... ); if(isset($RESULT_one) & isset($RESULT_two)) { // Generate a form using the results from the queries // Loop through $RESULT_one to populate a combo box $RESULT_one->free(); // Loop through $RESULT_two to populate a combo box $RESULT_two->free(); } else { // Display an error to the user rather than displaying the form }
проблема
После замены моего первого запроса и моего второго запроса на CALL
s на хранимые процедуры, я получаю сообщение об ошибке #2014 - Commands out of sync; you can't run this command now
#2014 - Commands out of sync; you can't run this command now
.
Шаги, предпринятые для решения проблемы
Этот плакат с переполнением стека имел аналогичную проблему, и принятый ответ предполагает вызов next_result()
который решает их проблему. Тем не менее , я хочу проверить, что оба вызова в базу данных были успешными, прежде чем генерировать мою форму, я не хочу ее генерировать наполовину.
Я вижу еще один вопрос, когда у искателя была такая же проблема, и кажется, что next_result()
неизбежна, потому что «так работает mysqli» – почему это работает с «сырым» SQL, но не с хранимыми процедурами? В чем разница? Есть ли эффективный способ проверить, что оба запроса были успешными, прежде чем генерировать мою форму? Я хотел бы понять, что происходит и почему происходит изменение поведения.
Я наткнулся на документацию для mysqli_store_result()
которая кажется чем-то потенциально полезной. Я читал комментарии для этой документации, но это совсем не ясно.
Похоже, решение состоит в вызове next_result()
объекта mysqli между вызовами , как я узнал из этого вопроса о переполнении стека.
При вызове нескольких хранимых процедур команда ошибок Commands out of sync; you can't run this command now
Commands out of sync; you can't run this command now
могут произойти, если не предпринимаются шаги по ее предотвращению.
Один из способов – вызвать next_result()
объекта mysqli после каждого вызова хранимой процедуры, как описано здесь .