PHP PDO / 从 MySQL 存储过程中检索 OUT 参数

Posted

技术标签:

【中文标题】PHP PDO / 从 MySQL 存储过程中检索 OUT 参数【英文标题】:PHP PDO / Retrieving OUT Parameters from MySQL Stored Procedure 【发布时间】:2013-03-22 08:48:20 【问题描述】:

我需要从 mysql 存储过程中检索 OUT 参数。我找不到任何可以解释这一点的东西(并且对我来说很有意义)。

try 
$dsn = 'mysql:dbname=db_name;host=localhost';
$dbh = new PDO($dsn, 'usr_name', 'password');
 catch (PDOException $e) 
echo 'Connection failed: ' . $e->getMessage();


$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,:newUserOK,:stprComment)");

$stmt->bindParam(':usrEmail', $tmpEmail, PDO::PARAM_STR); 
$stmt->bindParam(':newUserOK', $newUserOK, PDO::PARAM_INT,1); 
$stmt->bindParam(':stprComment', $stprComment, PDO::PARAM_STR,100); 

$stmt->execute();

$outputArray = $dbh->query("select @newUserOK, @stprComment")->fetch(PDO::FETCH_ASSOC);

print "procedure returned [" . $outputArray['@newUserOK'] . $outputArray['@stprComment'] . "]\n";

我在另一个 SO 项上找到了最后两行,但它只返回 NULL 值。

【问题讨论】:

【参考方案1】:

试试这个... 看看有没有用...

try 

    $dsn = 'mysql:dbname=db_name;host=localhost';
    $dbh = new PDO($dsn, 'usr_name', 'password');
 
catch (PDOException $e) 

    echo 'Connection failed: ' . $e->getMessage();



//$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,:newUserOK,:stprComment)");
//changed :newUserOK to @newUserOK
//changed :stprComment to @stprComment
$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,@newUserOK,@stprComment);");

//declare only input parameters.
//good pratice put string length. assuming varchar(100).
$stmt->bindParam(':usrEmail', $tmpEmail, PDO::PARAM_STR,100); 

//dont need these
// $stmt->bindParam(':newUserOK', $newUserOK, PDO::PARAM_INT,1); 
// $stmt->bindParam(':stprComment', $stprComment, PDO::PARAM_STR,100); 

$stmt->execute();

$outputArray = $dbh->query("select @newUserOK, @stprComment;")->fetchAll();

foreach($outputArray as $row)

   "NewUserOk:" .  $row["@newUserOk"] . ", StprComment:" . $row["@stprComment"];


//$outputArray = $dbh->query("select @newUserOK, @stprComment")->fetch(PDO::FETCH_ASSOC);
//print "procedure returned [" . $outputArray['@newUserOK'] . $outputArray['@stprComment'] . "]\n";

【讨论】:

【参考方案2】:

除了使用 MySQL 会话变量,你可以只使用bindParam():

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

php 变量绑定到相应的命名或问号 SQL 语句中的占位符,用于准备 陈述。与 PDOStatement::bindValue() 不同,变量绑定为 一个参考,并且只会在那个时候被评估 PDOStatement::execute() 被调用。

大多数参数是输入参数,即参数 以只读方式用于构建查询。一些司机 支持调用将数据作为输出返回的存储过程 参数,还有一些也作为输入/输出参数发送 数据并更新以接收它。

别忘了使用相应的占位符:

$stmt = $dbh->prepare("CALL superior_main_db.stprNewUser(:usrEmail, :newUserOK, :stprComment)");

执行语句后,您的变量将自动包含您需要的值。

【讨论】:

OP是在问如何使用存储过程,而不是如何绑定参数不是吗? @vascowhite - 请再次阅读问题。他在问如何检索 OUT 参数。 哦,是的,你是对的。他已经说过他不懂手册,所以如果没有示例,这将无济于事。 @vascowhite - 我做了一点修改,现在让我们看看它是否更清晰。 仍然没有得到输出参数的结果。 :-s【参考方案3】:

要检索@newUserOK 和@stprComment 变量,只需在调用存储过程后执行以下查询,如下所示

SELECT @newUserOK, @stprComment

【讨论】:

阿米特,如何在当前代码的上下文中执行上述查询? 同你执行其他查询 $stmt = $dbh->prepare ("SELECT @newUserOK, @stprComment");

以上是关于PHP PDO / 从 MySQL 存储过程中检索 OUT 参数的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySQL PDO 存储过程和 INOUT 参数

使用 PDO 问题从 MySQL 检索图像

事务、存储过程和 PDO

使用 PHP PDO 调用 MySQL 存储过程 [重复]

带有 PHP PDO 的只读副本上的 MySQL 存储过程

php操作MySQL数据库的方法和解析