Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO调用带Out参数的存储过程_Php_Mysql_Stored Procedures_Pdo_Prepared Statement - Fatal编程技术网

Php 使用PDO调用带Out参数的存储过程

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 // 下面是我

我已经使用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 //  
下面是我用来调用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