一尘不染

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

php

我已经使用PDO一段时间了,并且正在重构一个项目,以便它使用存储的proc而不是内联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调用方式存在问题,但是我似乎找不到问题所在。我正在按照手册中的说明进行操作,但仍然出现此错误。有人可以建议我做错了什么吗?任何建议将不胜感激。非常感谢!


阅读 437

收藏
2020-05-29

共1个答案

一尘不染

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

http://www.php.net/manual/zh/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));
2020-05-29