使用PDO使用Out参数调用存储过程

时间:2012-11-14 16:28:34

标签: 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 //  

以下是我用来调用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调用的,但我似乎无法找到问题所在。我按照the manual中的说明操作,但仍然收到此错误。有谁能建议我做错了什么?任何建议将非常感谢。非常感谢!

3 个答案:

答案 0 :(得分:10)

似乎这里有一个错误,我发现的最佳解决方案是:

http://www.php.net/manual/en/pdo.prepared-statements.php#101993

来自上面链接的评论:

$dbh->query("CALL SomeStoredProcedure($someInParameter1, $someInParameter2, @someOutParameter)"); 
$dbh->query("SELECT @someOutParameter");

// OR, if you want very much to use PDO.Prepare(),
// insert "SELECT @someOutParameter" in your stored procedure and then use:

$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)"); 
$stmt ->execute(array($someInParameter1, $someInParameter2));

另见:https://stackoverflow.com/a/4502524/815386

答案 1 :(得分:5)

您需要指定您的参数是IN / OUT样式,如PHP网站示例:

http://php.net/manual/en/pdo.prepared-statements.php示例#5

<?php

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

// call the stored procedure
$stmt->execute();

print "procedure returned $value\n";

答案 2 :(得分:4)

知道了!只需添加一个

SELECT @outputparam;

在存储过程的末尾,其中@outputparam是存储过程定义中用于param的名称。如果您无法编辑存储过程,则应对SELECT @outputparam执行第二次查询,使用PHP PDO获取输出参数值。

提示:如果您使用已弃用的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