2011-06-21 59 views
5

我刚开始使用PHP PDO和MySQL存储过程,并且我在如何从过程调用中获取OUT参数时遇到了问题。我看了很多类似的stackoverflow主题,但不幸的是我找不到解决我的问题的方法:|PHP PDO无法获得OUT参数值

下面是详细信息:

该过程需要1个输入参数,并且具有2个强制输出参数,并返回在其中产生状态。

这是我怎么称呼它:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 

程序在@o_message参数@o_code参数和返回STRING INT。 如果它是从CLI调用,调用后我在CLI

select @o_code, @o_message; 

万事OK写的,这是我能看到这些OUT参数返回的值。 但是我无法从PHP代码中完成 - 出于某种原因,我总是得到FALSE结果。该程序是正确的工作,但我不能得到它的结果。

我尝试以下方法得到的值,之后我做出上述呼吁:

$output = $proc->fetch(PDO::FETCH_ASSOC); // also with PDO:FETCH_OBJ 
$output = $mydb->query("select @o_code, @o_message"); 
$output = $mydb->query("select @o_code, @o_message")->fetch(); 
$output = $mydb->query("select @o_code, @o_message")->fetchColumn(); 
$output = $mydb->query("select @o_code, @o_message")->fetchAll(); 

但这些都不返回NULL从或FALSE不同的任何结果。我也尝试bindParam,但仍然无法使它工作。

谢谢你对这个问题和美好的一天的任何帮助!

----- -----编辑

这里是我与bindParam,试图代码仍然不工作:

$input = 5; 
$proc = $mydb->prepare("CALL proc_name(?, ?, ?)"); 
$proc->bindParam(1, $input, PDO::PARAM_INT); 
$proc->bindParam(2, $code, PDO::PARAM_INT); 
$proc->bindParam(3, $message, PDO::PARAM_STR); 
$proc->execute(); 

var_dump($code, $message); // NULL, NULL 
+0

发现:http://stackoverflow.com/a/32224294/2717254 –

+0

,你指向的问题是一个不同的问题,它不能解决这里发布的问题的问题。你可以在下面检查接受的答案,看看是否应该调用“closeCursor()”函数来正常工作。在另一个问题中你的答案确实有这样的代码行,所以我的猜测是它也不起作用。 – middlehut

+1

答案是关于获取输出参数值!不涉及closeCursor()调用。我更新了答案,以澄清更好的顺便说一句 –

回答

5

的问题是,第一查询调用存储过程不被视为已完成并关闭,并且在完成上一个查询之前,PDO不会执行另一个查询。

解决的办法是增加$proc->closeCursor();

整个工作样本:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 
$proc->closeCursor(); 

$output = $mydb->query("select @o_code, @o_message")->fetch(PDO::FETCH_ASSOC); 
var_dump($output); // array('@o_code'=>value, 'o_message'=>value)