PHP:如何获取MySql存储过程的输出值?

时间:2018-10-10 09:43:12

标签: php mysql stored-procedures

我尝试使用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 。我在做什么错了?

提前感谢所有有帮助的评论和答案:)祝您愉快!

1 个答案:

答案 0 :(得分:1)

不幸的是,我找不到正确的解决方案来捕获PHP中存储过程的输出。根据{{​​3}},

  

事实证明,这是自2005年以来已经存在了很长时间的错误!

我通过@RyanVincent的评论发现的来源也引用了this StackOverflow answerthis 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());

再次感谢您的所有评论:)我希望该解决方案可以帮助其他人花费数小时来修复其代码。