2012-09-19 43 views
0

我針對多個應用程序共享的數據存儲區使用了一些存儲過程,需要調用具有INOUT參數的存儲過程。PHP MySQL PDO存儲過程和INOUT參數

從技術文檔這樣的工作有點像

$prob_param = null; 
$stmt = $pdo->prepare('CALL obnoxiousStoredProc(:problem_param)'); 
$stmt->bindParam(':problem_param', $prob_param, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11); 
$stmt->execute(); 
echo 'Prob param: ' . var_export($prob_param, true); 

,我們將看到類似

Prob param: int(420) 

還有就是防止這種預期See this answer工作中的錯誤

所以不是我們得到

Syntax error or access violation: 1414 OUT or INOUT argument $parameter_number for routine $procedure_name is not a variable or NEW pseudo-variable 

的解決方法,如答案描述是雙重的,獨立的輸入和輸出參數(我可以讓我的DBA辦)和使用局部變量

eg

$stmt = $pdo->prepare('CALL obnoxiousStoredProc(@problem_param)'); 

,然後使用第二個查詢

SELECT @problem_param 

爲了讓你的價值。

我的問題是:PDO中這個「局部變量」的範圍是什麼?如果我的php代碼正在同時進行,我是否將自己設置爲競賽條件?

回答

1

用戶定義的變量是連接特定的。

請參閱the documentation

所以不,在php執行上下文中不存在競爭條件的可能性。

+0

謝謝!我能否看到與PDO持續連接的衝突? – wmarbut

+0

您不會看到「碰撞」 - 該變量可能具有舊值,但您的查詢無論如何都會給它一個新值。也就是說,您應該避免在MySQL中持久連接,因爲連接狀態可能會持續存在(例如,表格左鎖定,事務處於打開狀態等),這是一個微妙的錯誤來源。 –