Сохраненная процедура вызывает «Команды не синхронизированы» в следующем запросе

Я выполняю запрос с хранимой процедурой mysql:

$AddProf_qr = mysql_query("call AddStudent('$d_Pass', '$d_Titl', '$d_Firs', '$d_Midd', '$d_Last', '$d_Addr', '$d_City', '$d_Stat', '$d_County', '$d_Zipc', $d_Gend, '$d_Birh', '$d_Phom', '$d_Phoh', '$d_Phoo', '$d_Email', '$d_Webs', '$d_Natn', '$d_Profsn', '$d_Compny', '$d_Desig', $d_ProfAcc)", $this->c_remote) or die ("first call" . mysql_error($this->c_remote)); 

Я должен получить только один результат от вызова: @@ IDENTITY = номер;

 $AP_result = mysql_fetch_array($AddProf_qr); $CurrentSID = $AP_result['@@IDENTITY']; 

который отлично работает. но когда я запускаю еще один запрос на обновление mysql сразу после этого, он дает сообщение об ошибке:

Ошибка: 2014 (CR_COMMANDS_OUT_OF_SYNC) Сообщение: команды не синхронизированы; вы не можете запустить эту команду сейчас

я пробовал вставить:

 mysql_free_result($AddProf_qr); 

но все тот же.

Вызов MySQL выполняется отлично, а остальная часть скрипта выполняется без проблем, описанных выше. но они не работают одновременно. Мое лучшее предположение, вызов делает что-то, что возится с этим.

Ваша хранимая процедура возвращает несколько наборов результатов. Посмотреть это сообщение

Решение?

  • Использовать mysqli_multi_query
  • Прекратите использовать древнюю библиотеку mysql – i в mysqli означает «Improved» – без уважительной причины.

@DMin Да, это сработает, но рано или поздно вы столкнетесь с сервером. Просто сделайте математику, один запрос на страницу, которая делает 3 * количество процедур в базе данных! Просто подумай об этом!

[UPDATE] решение:

 $aCategory = array(); $it=0; $res = $mysqli->multi_query( "call ListCategory();" ); if( $res ) { do { if ($result = $mysqli->store_result()) { while( $row = $result->fetch_row() ) { $aCategory[$it] =$row; $it= $it + 1; } $result->close(); } } while( $mysqli->next_result() ); } foreach($aCategory as $row){ echo . $row[0] . " - " . $row[1] . "<br />"; } 

Просто хотел добавить, что вы готовы вызвать следующую процедуру.

PS: Таким образом, я не мог использовать

 echo $aCategory['category_id'] ; //or echo $aCategory->category_id; //just echo $aCategory[0] 

Посмотрите здесь: http://us3.php.net/manual/en/function.mysql-query.php. В комментариях один парень утверждает, что он заработал, установив флаг подключения в MYSQL_MULTI_RESULTS (131072).

Но было бы гораздо лучше использовать mysqli …

mysql_free_result (client-> Рез);

 while (mysql_more_results(client->conn)) { mysql_next_result(client->conn); } 

Это сделало для меня обаяние 🙂

Наборы результатов, возвращаемые из хранимой процедуры, не могут быть правильно выбраны с помощью mysqli_query (). Функция mysqli_query () объединяет выполнение операторов и выборку первого набора результатов в буферный результирующий набор, если таковой имеется. Тем не менее, есть дополнительные контрольные таблицы хранимых процедур, скрытые от пользователя, которые заставляют mysqli_query () не возвращать ожидаемые конечные наборы пользователей.

Наборы результатов, возвращаемые из хранимой процедуры, выбираются с помощью mysqli_real_query () или mysqli_multi_query (). Обе функции позволяют получать любое количество наборов результатов, возвращаемых оператором, например CALL.

посмотреть официальное руководство