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

时间:2013-04-01 09:18:06

标签: php mysql stored-procedures pdo

我需要从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值。

3 个答案:

答案 0 :(得分:2)

试试这个...... 看看是否有效...

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";

答案 1 :(得分:1)

除了使用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)");

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

答案 2 :(得分:0)

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

SELECT @newUserOK, @stprComment