PHP MySQL PDO 存储过程和 INOUT 参数

Posted

技术标签:

【中文标题】PHP MySQL PDO 存储过程和 INOUT 参数【英文标题】:PHP MySQL PDO stored procedures and INOUT parameters 【发布时间】:2012-09-12 03:49:07 【问题描述】:

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

例如

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

然后使用第二个查询

SELECT @problem_param

为了获得你的价值。

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

【问题讨论】:

【参考方案1】:

这个解决方案对我有用:

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

【讨论】:

【参考方案2】:

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

见the documentation。

所以不,在 php 执行上下文中不可能出现竞争条件。

【讨论】:

谢谢!我可以看到与 PDO 持久连接的任何冲突吗? 你不会看到“冲突”——变量可能有一个旧值,但你的查询无论如何都会给它一个新值。也就是说,您应该避免在 mysql 中使用持久连接,因为连接状态可能会持续存在(例如,表处于锁定状态、事务处于打开状态等),这是一个微妙的错误来源。

以上是关于PHP MySQL PDO 存储过程和 INOUT 参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 调用 MySQL 存储过程 [重复]

事务、存储过程和 PDO

PHP PDO / 从 MySQL 存储过程中检索 OUT 参数

PHP,PDO 存储过程不返回任何值或未更改值

使用 PDO 从 PHP 调用存储过程到使用 INPUT 参数的 MYSQL Server

PHP PDO:存储过程返回空结果