2011-07-05 39 views
6

調用程序工作的很好的MySQL中端,但在PHP,造成Commands out of sync; you can't run this command nowCommands out of sync; you can't run this command nowMySQL的存儲過程引起的`命令了sync`的

我的程序是

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

我現在應該怎麼辦?謝謝!

回答

1

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

編輯

我認爲你需要重寫,而不是使用準備和執行(我認爲是欺騙MySQL的),如果你在使用的參數getMostSimilar存儲過程,像 in this example程序我認爲你的錯誤將被修復。

HTH

+0

謝謝你。我已經使用了這個,但它似乎沒有幫助。 – Ovilia

+0

我認爲mysql優化器正在將您的getMostSimilar函數解釋爲遞歸函數,並希望您在執行任何操作之前釋放,使用或存儲數據返回值。 – amelvin

+1

不幸的是,MySQL不允許在LIMIT子句中使用變量,因此只需重寫該過程來執行SELECT操作將不起作用 – wonk0

12

似乎是調用存儲過程返回結果集時即表現一個討厭的錯誤(或功能)。。即一個以不帶INTO子句的select語句結束的存儲過程(請參見下面的示例)。

mysqli驅動程序(可以)返回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; 
0

我知道已經晚了,並且已經有一個答案,但我得到相同的消息對於一個完全不同的原因,所以我會在這裏留下我的解決方案:

這實際上是一個非常愚蠢的錯誤。這只是參數名稱中的一個錯字。 我的功能有一個名爲preferable參數:在函數體

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

,我所用的參數preferable使用錯誤的名字:

if prefered = 1 then 
    ... 
end if; 

有一次,我爲preferable改變prefered它開始再次合作。