2013-03-16 68 views
0

我有一些正在運行的php/mysql,現在我正在遷移到存儲過程。遷移到存儲過程時出現MySQL「命令不同步」

只要調用任何存儲過程,後續的CALL和SELECT就會失敗,並顯示「命令不同步;現在無法運行此命令」。

非SELECT的現有存儲過程正常工作。

function db_all ($query) 
{ 
    log_sql_read ($query); 
    $result = mysql_query ($query, db_connection()); 

    if (!$result) 
    { 
     log_sql_error ($query); 
     return Array(); 
    } 

    $rows = Array(); 

    while ($row = mysql_fetch_assoc ($result)) 
     array_push ($rows, $row); 

    mysql_free_result ($result); 

    return $rows; 
} 

db_all ("SELECT 1 as `test`"); 
db_all ("SELECT 2 as `test`"); 
db_all ("CALL `$db`.`select_info`($id);"); // RETURNS CORRECT DATA 
db_all ("CALL `$db`.`select_info`($id);"); // ERROR HERE 
db_all ("SELECT 5 as `test`");    // ERROR HERE 

此錯誤是其他地方所解釋不調用mysql_free_result的結果,但我調用此。那麼,怎麼了?

我看到一些引用mysqli的解決方案。現在我需要一個非mysqli的解決方案

+0

請您發佈存儲過程。看起來你在那裏做錯了什麼。 – grahamj42 2013-03-16 18:48:38

+0

這有點複雜,但問題仍然存在於微不足道的存儲過程中。 – spraff 2013-03-16 19:22:31

+0

@spraff問題是SP返回兩個結果集,並且在進行另一次調用之前需要使用它們。查看更新的答案。 – peterm 2013-03-16 19:27:36

回答

1

問題是執行時,存儲過程會給你兩個結果集。一個具有實際結果集,另一個具有執行狀態。在進行另一個返回結果集的調用之前,您需要同時使用它們。

mysqli_*您可以利用mysqli_multi_query,mysqli_store_result,mysqli_next_result來實現。你可以看到如何在mysqlihere中做到這一點。

對於您的情況,您可以在完成獲取結果後關閉連接mysql_*

function db_all ($query) 
{ 
    $link = db_connection();  //Open connection 

    log_sql_read ($query); 
    $result = mysql_query ($query, $link); 

    if (!$result) 
    { 
     log_sql_error ($query); 
     return Array(); 
    } 

    $rows = Array(); 

    while ($row = mysql_fetch_assoc ($result)) 
     array_push ($rows, $row); 

    mysql_free_result ($result); 
    mysql_close($link);   //Close the connection 
    return $rows; 
}