2011-07-05 26 views
6

コール手順は、右のMySQL端末にすべての作品sync`のうち `コマンドを引き起こしたが、PHPで、私の手順はgetSimilarityが関数であるMySQLのストアドプロシージャは

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

あるCommands out of sync; you can't run this command nowCommands out of sync; you can't run this command now

を引き起こしました。 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()または を呼び出します。

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

EDIT

私はあなたの代わりにあなたがでパラメータを使用している場合(私はMySQLをだましていると考えている)の準備と実行使用するのでは、getMostSimilarストアドプロシージャを書き直す必要があると思いますプロシージャのような in this exampleあなたのエラーは修正されると思います。

HTHは

+0

ありがとうございます。私はこれをgoogledしましたが、それは役に立つとは思われません。 – Ovilia

+0

私はmysqlオプティマイザがあなたのgetMostSimilar関数を再帰的なものとして解釈していると思っています。 – amelvin

+1

残念ながら、MySQLはLIMIT句に変数を許可しないので、SELECTを実行するプロシージャを書き換えるだけでは機能しません – wonk0

12

が結果セットを返すストアドプロシージャを呼び出すときに明らかにされて嫌なバグ(または機能)があるようです。。私。 INTO句のないselect文で終了するストアド・プロシージャ(下の例を参照)。

mysqliドライバ(propably)は2つの結果セットを返します。最初はストアドプロシージャから返されたもので、2番目はダミーの空の結果セットです。複数のクエリコマンドが発行されたようなものです。これに対する1つの解決法(通常の(例えば、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

、私はそれが遅れているとの回答が既に存在している知っているが、私はまったく違う理由で同じメッセージを得ていましただから私はここに私の解決策を残す:

それは実際には非常にばかげたエラーだった。それは単にパラメータ名のタイプミスです。My機能がpreferableというパラメータいた :私はそれが再び仕事を始めpreferableためpreferedを変更したら

if prefered = 1 then 
    ... 
end if; 

:関数本体に

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

を、私は間違った名前を持つパラメータpreferableを使用していました。

関連する問題