2011-07-05 13 views
6
procedura

połączeń działa dobrze w terminalu MySQL, ale w PHP, spowodowane Commands out of sync; you can't run this command nowCommands out of sync; you can't run this command nowprocedura przechowywana MySQL spowodowane `Polecenia Spośród sync`

Moja procedura jest

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 
$$ 

gdzie getSimilarity jest funkcją.

W 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; 
} 

Co mam teraz zrobić? Dzięki!

Odpowiedz

1

C.5.2.14. Polecenia niezsynchronizowane Jeśli otrzymasz polecenie Zsynchronizowane Polecenia; nie możesz teraz wykonać tego polecenia w swoim kliencie , wywołujesz funkcje klienta w niewłaściwej kolejności.

To może się zdarzyć, na przykład, jeśli używasz mysql_use_result() i spróbuj wykonanie nowego zapytania przed masz nazwie mysql_free_result(). Może się także zdarzyć, jeśli spróbujesz wykonać dwa zapytania o wartości , które zwrócą dane bez wywołania mysql_use_result() lub mysql_use_result() lub mysql_store_result().

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

EDIT

myślę, że trzeba przepisać procedury getMostSimilar przechowywanej, zamiast korzystania przygotować i wykonać (które uważa się oszukiwanie MySQL) w przypadku korzystania z parametrów w procedura taka jak in this example Myślę, że twój błąd zostanie naprawiony.

HTH

+0

Dzięki za to. Mam googleed to, ale to nie wydaje się być pomocne. – Ovilia

+0

Myślę, że optymalizator mysql interpretuje twoją funkcję getMostSimilar jako rekursywną i chce, żebyś uwolnił, używał lub przechowywał dane, zanim zrobi cokolwiek więcej. – amelvin

+1

Niestety MySQL nie zezwala na zmienne w klauzuli LIMIT, więc po prostu przepisanie procedury, aby wykonać SELECT, nie zadziała – wonk0

12

Wydaje się, że paskudny bug (lub funkcja), która objawia się podczas wywoływania procedury przechowywanej, że zwraca zestaw wyników.. To znaczy. procedura składowana, która kończy się instrukcją select bez klauzuli INTO (patrz przykład poniżej).

Sterownik mysqli (prawdopodobnie) zwraca 2 zestawy wyników. Pierwszy to ten, który powrócił z procedury składowanej, a drugi - pusty, pusty zestaw wyników. Jest to podobne, jak wydano polecenie wielu zapytań. Jednym z rozwiązań tego problemu (który nie łamie zwykłych (na przykład SELECT) zapytań) jest skonsumowanie tego fałszywego zestawu wyników po przepracowaniu legit (pierwszego).

Przykład kodu 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"; 
    } 
} 

Przykład procedura przechowywana:

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; 
0

wiem, że jest późno i nie ma już odpowiedź, ale był już ten sam komunikat dla całego innego powodu, więc zostawię moje rozwiązanie tutaj:

To był naprawdę bardzo głupi błąd. To była tylko literówka w nazwie parametru. Moja funkcja miał parametr o nazwie preferable:

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

w ciele funkcji, byłem przy użyciu parametru preferable z niewłaściwą nazwą:

if prefered = 1 then 
    ... 
end if; 

raz zmieniłem prefered dla preferable zaczął znów działać.

Powiązane problemy