我尝试使用PHP获取MySQL存储过程的输出值。我在StackOverflow上找到了一些类似的问题,但是没有一个帮助。
根据我的研究,我找到了两种方法来实现这一目标,但是到目前为止,它们都没有奏效。无论我如何尝试,都不会捕获该过程的输出。
第一次尝试:
在以下情况下,我将 AAA 设置为变量@name
的默认值,然后将其作为参数传递给存储过程jani()
。在此过程中,我将输入输出变量的值更改为 BBB ,因此我希望将传递的 AAA 更改为 BBB 。然后,我选择变量并尝试显示结果值,但是该值仍为 AAA 。
我的代码:
// DEFINING THE PROCEDURE:
$sql = '
DROP PROCEDURE IF EXISTS jani;
CREATE PROCEDURE jani (
INOUT output VARCHAR(3)
)
BEGIN
SET @output = "BBB";
END';
$oDb->exec($sql);
// DEFINING THE VARIABLE TO CATCH THE OUTPUT:
$sql = 'SET @name = "AAA"';
$do = $oDb->prepare($sql);
$do->execute();
// CALLING THE PROCEDURE AND TRYING TO CATCH THE OUTPUT:
$sql = 'CALL jani(@name)';
$do = $oDb->prepare($sql);
$do->execute();
// SELECTING THE (HOPEFULLY UPDATED) VARIABLE:
$sql = 'SELECT @name name';
$do = $oDb->prepare($sql);
$do->execute();
// DISPLAYING THE RESULT:
var_dump($do->fetchObject());
第二次尝试:
我还遵循了this here之类的教程,但没有成功。消息人士声称$do->bindParam()
应该可以工作,但对我来说没有帮助。变量的值仍然不变。我的代码实现了第二个解决方案:
// DEFINING THE PROCEDURE:
$sql = '
DROP PROCEDURE IF EXISTS jani;
CREATE PROCEDURE jani (
INOUT output VARCHAR(3)
)
BEGIN
SET @output = "BBB";
END';
$oDb->exec($sql);
// SETTING DEFAULT VARIABLE VALUE:
$name = 'AAA';
// CALLING THE PROCEDURE AND BINDING THE VARIABLE TO ITS PARAMETER:
$sql = 'CALL jani(?)';
$do = $oDb->prepare($sql);
$do->bindParam(1, $name, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 3);
$do->execute();
// DISPLAYING THE RESULT (which is still "AAA" unfortunately):
echo $name;
这两种情况都返回未修改的值 AAA 而不是过程输出 BBB 。我在做什么错了?
提前感谢所有有帮助的评论和答案:)祝您愉快!
答案 0 :(得分:1)
不幸的是,我找不到正确的解决方案来捕获PHP中存储过程的输出。根据{{3}},
事实证明,这是自2005年以来已经存在了很长时间的错误!
我通过@RyanVincent的评论发现的来源也引用了this StackOverflow answer和this bug report through 2005-2013。
我仍然需要一个解决方案,因此我决定将stored procedure
转换为stored function
,在这里我可以在调用函数之前使用简单的SELECT
语句轻松捕获输出。这样,将选择可以传递给PHP的返回值。
代码:
// DEFINING THE FUNCTION:
$sql = '
DROP FUNCTION IF EXISTS jani;
CREATE FUNCTION jani ()
RETURNS VARCHAR(3) DETERMINISTIC
BEGIN
RETURN "BBB";
END';
$oDb->exec($sql);
// SELECTING THE RETURN VALUE OF THE FUNCTION:
$sql = 'SELECT jani();';
$do = $oDb->query($sql);
// DISPLAYING THE RESULT:
var_dump($do->fetchAll());
再次感谢您的所有评论:)我希望该解决方案可以帮助其他人花费数小时来修复其代码。