Php 使用PDO调用带Out参数的存储过程
我已经使用PDO有一段时间了,现在正在重构一个项目,以便它使用存储过程而不是内联SQL。我得到了一个无法解释的错误。我使用的是PHP版本5.3.5和MySQL版本5.0.7 我只是想得到一个基本的存储过程,它的输出可以正常工作。以下是存储的进程:Php 使用PDO调用带Out参数的存储过程,php,mysql,stored-procedures,pdo,prepared-statement,Php,Mysql,Stored Procedures,Pdo,Prepared Statement,我已经使用PDO有一段时间了,现在正在重构一个项目,以便它使用存储过程而不是内联SQL。我得到了一个无法解释的错误。我使用的是PHP版本5.3.5和MySQL版本5.0.7 我只是想得到一个基本的存储过程,它的输出可以正常工作。以下是存储的进程: DELIMITER // CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100)) BEGIN SET var1 = 'This is a test'; END // 下面是我
DELIMITER //
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))
BEGIN
SET var1 = 'This is a test';
END //
下面是我用来调用proc的代码,$db是PDO的一个实例:
$stmt = $db->prepare("CALL proc_OUT(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// call the stored procedure
$stmt->execute();
echo $returnvalue;
简单对吧?但是,它会导致以下错误:
exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger
如果我像这样直接调用proc:
CALL proc_OUT(@res);
SELECT @res;
它按预期工作,这让我相信PHP如何调用它存在问题,但我似乎找不到问题所在。我正在按照中的说明进行操作,但仍然出现此错误。有人能告诉我我做错了什么吗?如有任何建议,将不胜感激。多谢 这里似乎存在一个bug,我找到的最佳解决方案是: 从上面链接的评论中:
另请参见:您需要指定您的参数为IN/OUT样式,如PHP网站示例: 例5
明白了!只需添加一个
SELECT @outputparam;
在存储过程的末尾,其中@outputparam是存储过程定义中用于参数的名称。如果无法编辑存储过程,则应使用PHP PDO对SELECT@outputparam执行第二次查询,以获取输出参数值
提示:如果使用不推荐使用的DBLib连接到SQL Server,并且按照建议修改了存储过程,则还需要调整语法以在调用PHP脚本中获取输出参数值:
$out = 0;
$sth = $db->prepare("DECLARE @myout INT; EXECUTE mysp :firstparam, :secondparam, @myout OUTPUT;"); // the DECLARE trick is needed with DBLib
$sth->bindParam(':firstparam', $firstparam, PDO::PARAM_INT);
$sth->execute();
$sth->bindColumn(1, $out, PDO::PARAM_INT);
$sth->fetch(PDO::FETCH_BOUND);
var_dump($out); // works
我已经用mysql 5.5.28和PHP5.3.10复制了这一点。另外,您似乎有两个版本的$return\u value
——另一个没有下划线。这是有意的吗?似乎对输出没有影响。感谢您的回复。我的存储过程没有in/out参数,它只是一个out参数,如您链接的页面上的示例4所示。看看这里,它可能是一个MySQL错误,对于MySQL版本5.5.3+&6.0.8+,似乎已经修复。你能升级吗?这里对SQL注入没有威胁吗?可能,代码只是一个示例,不能按原样使用;第二个例子应该是安全的。
SELECT @outputparam;
$out = 0;
$sth = $db->prepare("DECLARE @myout INT; EXECUTE mysp :firstparam, :secondparam, @myout OUTPUT;"); // the DECLARE trick is needed with DBLib
$sth->bindParam(':firstparam', $firstparam, PDO::PARAM_INT);
$sth->execute();
$sth->bindColumn(1, $out, PDO::PARAM_INT);
$sth->fetch(PDO::FETCH_BOUND);
var_dump($out); // works