PHP MySQL PDO存储过程和INOUT参数

PHP MySQL PDO存储过程和INOUT参数,php,stored-procedures,pdo,mysql5,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); $

我正在对多个应用程序共享的数据存储使用一些存储过程,需要调用具有
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)
我们会看到类似的情况

$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)
但是,存在一个bug,阻止它按预期工作

所以我们得到的是

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

然后使用第二个查询

SELECT @problem_param
为了得到你的价值

我的问题是:PDO中这个“局部变量”的范围是什么?如果我的php代码同时运行,我是否为自己设置了竞争条件?

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


因此,不,在php执行上下文中不可能存在竞争条件。

这个解决方案对我很有效:

$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)

谢谢我可以看到与PDO的持久连接的冲突吗?您不会看到“冲突”--变量可能有一个旧值,但您的查询将给它一个新值。也就是说,您应该避免MySQL中的持久连接,因为连接状态可能会持久(例如,表左锁、事务左开等),这是一个微妙的错误源。