Хранимая процедура MySQL вызвала «команды не синхронизированы»

Процедура вызова работает правильно в терминале MySQL, но в PHP вызывается Commands out of sync; you can't run this command nowCommands out of sync; you can't run this command now Commands out of sync; you can't run this command nowCommands out of sync; you can't run this command now

Моя процедура

 delimiter $$ create procedure getMostSimilar (IN vU_ID INT, IN voffset INT, IN vsize INT) BEGIN set @offset = voffset; set @size = vsize; set @uid = vU_ID; prepare SimilarStmt from "SELECT U_ID, getSimilarity(U_ID, ?) AS similar FROM Answer WHERE U_ID != ? GROUP BY U_ID ORDER BY similar DESC LIMIT ?, ?"; execute SimilarStmt using @uid, @uid, @offset, @size; deallocate prepare SimilarStmt; END $$ 

где getSimilarity – это функция.

В PHP:

 function getMostSimilar($U_ID, $offset, $size){ $query = sprintf("CALL getMostSimilar(%s, %s, %s)", $U_ID, $offset, $size); $result = mysql_query($query); print mysql_error(); if (!$result){ return $query; } $ans = array(); $len = 0; while($row = mysql_fetch_assoc($result)){ $ans[$len] = $row; $len++; } return $ans; } 

Что мне теперь делать? Благодаря!

C.5.2.14. Команды не синхронизированы Если вы получаете команды не синхронизированы; вы не можете запустить эту команду сейчас в своем клиентском коде, вы вызываете клиентские функции в неправильном порядке.

Это может произойти, например, если вы используете mysql_use_result () и попытаетесь выполнить новый запрос, прежде чем вы вызовете mysql_free_result (). Это также может произойти, если вы попытаетесь выполнить два запроса, которые возвращают данные, не вызывая mysql_use_result () или mysql_store_result () между ними.

http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html

РЕДАКТИРОВАТЬ

Я думаю, вам нужно переписать хранимая процедура getMostSimilar, вместо того, чтобы использовать prepare и execute (который, я думаю, обманывает mysql), если вы используете параметры в процедуре, как в этом примере, я думаю, ваша ошибка будет исправлена.

НТН

Кажется, что есть неприятная ошибка (или функция), которая проявляется при вызове хранимой процедуры, которая возвращает набор результатов. , Т.е. хранимая процедура, которая заканчивается оператором select без предложения INTO (см. Пример ниже).

Драйвер mysqli (propably) возвращает 2 набора результатов. Первый – тот, который возвращается из хранимой процедуры, а второй – пустой, пустой набор результатов. Это похоже на команду с несколькими запросами. Одно из решений этого (которое не прерывается при обычном (например, SELECT) запросах), заключается в том, чтобы потреблять этот фиктивный результирующий набор после прохождения законного (первого).

Пример php-кода

 function do_query($con, $sql) { if ( !($result = mysqli_query($con, $sql)) ) throw new QueryException(mysqli_error($con)); if ($result === true) return true; while ($row = mysqli_fetch_assoc( $result )) { // process rows } // Hack for procedures returning second dummy result set while(mysqli_more_results($con)) { mysqli_next_result($con); // echo "* DUMMY RS \n"; } } 

Пример хранимой процедуры:

 CREATE PROCEDURE selectStaleHeaders() NOT DETERMINISTIC SELECT TT.* FROM one_pretty_table AS TT LEFT JOIN another AS AN on TT.fk_id = AN.id WHERE TT.id IS NULL; 

Я знаю, что уже поздно, и уже есть ответ, но я получил одно и то же сообщение по совершенно другой причине, поэтому я оставлю свое решение здесь:

на самом деле это была очень глупая ошибка. Это просто опечатка в имени параметра. У моей функции был параметр, названный preferable :

 create function call_client (pereferable int, client_id int) returns int 

в теле функции, я использовал параметр, preferable с неправильным именем:

 if prefered = 1 then ... end if; 

как только я изменил prefered для preferable он снова начал работать.