2012-12-13 43 views
2

我有如下的PHP腳本:MeekroDB錯誤「命令不同步,你無法運行此命令現在」

require_once 'meekrodb.2.1.class.php'; 
DB::$user = 'usr'; 
DB::$password = 'pwd'; 
DB::$dbName = 'db'; 
DB::$encoding = 'utf8'; 

$results = DB::queryFirstField(" 
    CALL getSequence('time_id', %i); // ***** Stored procedure call ***** 
", TENANT_ID); 

DB::insert('timeentry', array(
    'tenant_id' => TENANT_ID, 
    'time_id' => $results, 
    'timestart' => DB::sqleval("now()"), 
    'assig_id' => $assig_id 
)); 

我收到以下錯誤:

QUERY: INSERT INTO timeentry (tenant_id , time_id , timestart , assig_id) VALUES (1, '42', now(), '1')

ERROR: Commands out of sync; you can't run this command now

如果我用SELECT語句替換對存儲過程的調用,一切正常。

$results = DB::queryFirstField(" 
    SELECT 45; // ***** SELECT statement ***** 
"); 

DB::insert('timeentry', array(
    'tenant_id' => TENANT_ID, 
    'time_id' => $results, 
    'timestart' => DB::sqleval("now()"), 
    'assig_id' => $assig_id 
)); 

我還沒有分析MeekroDB庫的內部結構(http://www.meekro.com)。

我試圖在事務中包裝每個語句,但在調用存儲過程之後立即執行COMMIT時出現相同的錯誤。

任何幫助,非常感謝。

回答

2

調用MySQL中的存儲過程會產生多個結果集。也就是說,存儲過程可能有多個SELECT,因此客戶端必須遍歷幾個結果集才能完成CALL的處理。

見的例子在回答這個問題:Retrieving Multiple Result sets with stored procedure in php/mysqli

到從呼叫中的所有結果都完成了,它不被視爲封閉,和MySQL不允許你運行另一個查詢之前,當前的查詢是完全完了。

我不太瞭解MeekroDB庫,但是看了一下在線文檔,我沒有看到任何方式來遍歷多個結果集。所以可能沒有辦法安全地調用存儲過程。我建議您聯繫作者以獲得特定支持:http://www.meekro.com/help.php

+0

感謝比爾爲您的答案,我怎麼知道存儲過程是否得到一個或多個結果集。我已經在MySQL客戶端中執行了它,我只得到一個結果......它可能是一個MeekroDB錯誤。我已經聯繫了作者。我可以執行一個命令(在這個庫之外)爲了關閉掛起的查詢嗎? – supercoco

+1

我設法通過更改庫來關閉連接。謝謝你的幫助。當然,我希望得到這個問題的官方修復。 – supercoco

+1

即使給定的存儲過程只返回一個結果集,調用它也會調用多查詢接口。這可能只是MeekroDB開發人員未預料到的API使用情況。是的,您可以關閉語句,或者您可以調用'while($ pdoStmt-> nextRowset()){}'強制它迭代到結果鏈的末尾。另見http://php.net/manual/en/pdostatement.nextrowset.php –

相關問題