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 参数的主要内容,如果未能解决你的问题,请参考以下文章