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中的持久连接,因为连接状态可能会持久(例如,表左锁、事务左开等),这是一个微妙的错误源。