2012-11-14 116 views
11

我一直在使用PDO一段时间,并且正在重构一个项目,以便它使用存储的procs而不是内联SQL。我收到一个我无法解释的错误。我正在使用PHP版本5.3.5和MySQL版本5.0.7。使用PDO使用Out参数调用存储过程

我只是想获得一个基本的存储过程与输出工作。这里是存储过程:

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中的说明进行操作,但仍然出现此错误。任何人都可以提出我可能做错了什么?任何建议将非常感激。非常感谢!

+1

http://stackoverflow.com/a/4502524/815386 –

+1

我已经复制这与MySQL 5.5.28和PHP 5.3.10。另外,你似乎有两个版本的'$ return_value'-另一个没有下划线。这是打算吗?似乎没有在输出上有所作为。 –

回答

8

这似乎有在工作中的错误在这里,我找到了最好的解决办法是这样的:

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

4

您需要指定您的参数是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"; 
+0

感谢您的回复。我的存储过程没有输入/输出参数,它只是一个输出参数,如链接 – TheMethod

+1

页面上的示例#4我的错误。看看这里http://www.danstraw。com/calling-mysql-stored-procedures-from -phps -pdo-output-parameters/2010/12/21 /它可能是一个MySQL错误 – sdespont

+0

似乎固定为MySQL版本5.5.3 +&6.0.8+。你能升级吗? – sdespont

4

明白了!只需在存储过程结束时添加一个

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 
+1

非常感谢您的回答,这个解决方案节省了我的时间 – vietnguyen09

相关问题