PHP MySQL PDO存储过程和INOUT参数

时间:2012-09-19 19:18:52

标签: php stored-procedures pdo mysql5

我对一个由多个应用程序共享的数据存储区使用一些存储过程,并且需要调用具有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做)分开并使用局部变量

e.g。

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

然后使用第二个查询

SELECT @problem_param

获得你的价值。

我的问题是:PDO中这个“局部变量”的范围是什么?如果我的PHP代码同时出现,我是否会为竞争条件做好准备?

2 个答案:

答案 0 :(得分:1)

  

用户定义的变量是特定于连接的。

请参阅the documentation

所以不,在php执行环境中不存在竞争条件的可能性。

答案 1 :(得分:0)

此解决方案对我有用:

$pdo = new PDO(...);
$stmt = $pdo->prepare('CALL obnoxiousStoredProc(@problem_param)');
$stmt->execute();

$stmt2 = $pdo->prepare('SELECT @problem_param');
$stmt2->execute();
$var = $stmt->fetch();

var_dump($var)