lub*_*ben 5 php pdo stored-procedures
我刚开始使用PHP PDO和MySQL存储过程,我有如何从过程调用中获取OUT参数的问题.我查看了许多类似的stackoverflow主题,但遗憾的是我无法找到解决问题的方法:|
以下是详细信息:
该过程采用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();
Run Code Online (Sandbox Code Playgroud)
该过程在@o_code参数中返回INT,在@o_message参数中返回STRING.如果从CLI调用它,并且在调用之后我在CLI中编写
select @o_code, @o_message;
Run Code Online (Sandbox Code Playgroud)
一切都很好,就是我能够看到这些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();
Run Code Online (Sandbox Code Playgroud)
但是这些都不会返回任何与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
Run Code Online (Sandbox Code Playgroud)
问题是调用存储过程的第一个查询不被视为已完成和关闭,并且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)
Run Code Online (Sandbox Code Playgroud)