Процедура вызова работает правильно в терминале 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
он снова начал работать.