2011-06-21 63 views
5

我剛開始使用PHP PDO和MySQL存儲過程,並且我在如何從過程調用中獲取OUT參數時遇到了問題。我看了很多類似的stackoverflow主題,但不幸的是我找不到解決我的問題的方法:|PHP PDO無法獲得OUT參數值

下面是詳細信息:

該過程需要1個輸入參數,並且具有2個強制輸出參數,並返回在其中產生狀態。

這是我怎麼稱呼它:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 

程序在@o_message參數@o_code參數和返回STRING INT。 如果它是從CLI調用,調用後我在CLI

select @o_code, @o_message; 

萬事OK寫的,這是我能看到這些OUT參數返回的值。 但是我無法從PHP代碼中完成 - 出於某種原因,我總是得到FALSE結果。該程序是正確的工作,但我不能得到它的結果。

我嘗試以下方法得到的值,之後我做出上述呼籲:

$output = $proc->fetch(PDO::FETCH_ASSOC); // also with PDO:FETCH_OBJ 
$output = $mydb->query("select @o_code, @o_message"); 
$output = $mydb->query("select @o_code, @o_message")->fetch(); 
$output = $mydb->query("select @o_code, @o_message")->fetchColumn(); 
$output = $mydb->query("select @o_code, @o_message")->fetchAll(); 

但這些都不返回NULL從或FALSE不同的任何結果。我也嘗試bindParam,但仍然無法使它工作。

謝謝你對這個問題和美好的一天的任何幫助!

----- -----編輯

這裏是我與bindParam,試圖代碼仍然不工作:

$input = 5; 
$proc = $mydb->prepare("CALL proc_name(?, ?, ?)"); 
$proc->bindParam(1, $input, PDO::PARAM_INT); 
$proc->bindParam(2, $code, PDO::PARAM_INT); 
$proc->bindParam(3, $message, PDO::PARAM_STR); 
$proc->execute(); 

var_dump($code, $message); // NULL, NULL 
+0

發現:http://stackoverflow.com/a/32224294/2717254 –

+0

,你指向的問題是一個不同的問題,它不能解決這裏發佈的問題的問題。你可以在下面檢查接受的答案,看看是否應該調用「closeCursor()」函數來正常工作。在另一個問題中你的答案確實有這樣的代碼行,所以我的猜測是它也不起作用。 – middlehut

+1

答案是關於獲取輸出參數值!不涉及closeCursor()調用。我更新了答案,以澄清更好的順便說一句 –

回答

5

的問題是,第一查詢調用存儲過程不被視爲已完成並關閉,並且在完成上一個查詢之前,PDO不會執行另一個查詢。

解決的辦法是增加$proc->closeCursor();

整個工作樣本:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 
$proc->closeCursor(); 

$output = $mydb->query("select @o_code, @o_message")->fetch(PDO::FETCH_ASSOC); 
var_dump($output); // array('@o_code'=>value, 'o_message'=>value)