使用 PHP 返回 mysql 存储过程的输出参数

Posted

技术标签:

【中文标题】使用 PHP 返回 mysql 存储过程的输出参数【英文标题】:Returning the output parameter of a mysql stored procedure using PHP 【发布时间】:2013-01-11 05:37:53 【问题描述】:

我正计划使用 phpmysql 开发一个 CMS,它利用 MySQL 存储过程对我的 MySQL 数据库执行准备好的语句查询。自从我用 PHP 开发(回到程序时代)以来已经有很长时间了,所以我将尝试使用 PHP 的新 OOP 结构来实现这个系统。在我这样做之前,我需要处理将我的 MySQL 存储过程的输出参数返回到一个简单的 php 页面的简单问题。这只是一个测试,以便我可以在开发我的第一个 php 类之前获得正确的语法,因此此处发布的初始代码是程序性的。

首先是我的存储过程:

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `text_development`.`get_user`$$
    CREATE PROCEDURE  `text_development`.`get_user`
    (
    IN userId INT,
    OUT user_name VARCHAR(100)
    )
    BEGIN
    SELECT username
    INTO user_name
    FROM user
    WHERE user_id = userId;
    END $$
    DELIMITER ;

然后是我的两个php文件:

    <?php
    //db_config.php
    $mysqli_host = "localhost";
    $mysqli_user = "root"; //I'm not stupid enough to use this in development
    $mysqli_pass = "root"; //before anyone comments about the root usage
    $mysqli_db = "text_development";
    ?>


    <?php
    //index.php
    require('incl/db_config.php');
    $dbConnection = new Mysqli($mysqli_host, $mysqli_user, $mysqli_pass, $mysqli_db) or die(mysql_error());
    print '<h1>Stored Procedure Retrieval Test</h1>';
    $id = 1;
    $return = '';
    $result = $dbConnection->query( 'CALL get_user($id,$return)');
    print $result;
    ?>

我的问题出现在 index.php 页面上。它实际上似乎没有返回任何东西。在 PHPMyAdmin 中执行存储过程时,当我传入 1 的用户 ID 时返回用户名测试,但是在 php.ini 中调用该函数时没有任何内容返回到屏幕。我也尝试过打印 $return ,但这只是返回一个空字符串(正如我在上面的代码中定义的那样)。我试过使用这个在线教程,但那里的解决方案似乎不起作用:

http://www.joeyrivera.com/2009/using-mysql-stored-procedures-with-php-mysqlmysqlipdo/

有谁知道我在这里做错了什么以及为什么这个存储过程的返回参数没有被打印到屏幕上?

【问题讨论】:

也许只是将其转换为函数并简单地进行查询SELECT get_user($id);? 我该怎么做?我知道如何在 PL/SQL 中进行操作,但这是我第一次在 MySQL 中使用存储过程。 【参考方案1】:

首先,你参考了一篇关于 PDO 的教程,但是你使用的是 Mysqli。

第二:转换:

$result = $dbConnection->query( 'CALL get_user($id,$return)');

to(注意双引号和@return`):

$result = $dbConnection->query( "CALL get_user($id,@return)");

然后,稍后,做:

$result = $dbConnection->query( 'SELECT @return');

如果 SP 是一个 SELECT,那么你就是你自己写的。

原因是,SP 没有返回给 PHP 任何东西,它会将值返回到 MySQL 变量 (@return)(scop 在 MySQL 中),因此您需要在单独的调用中查询此变量。如果它是对简单 select SP 的调用,那么它将像任何其他 select 语句一样返回值。

【讨论】:

这会产生以下错误:Catchable fatal error: Object of class mysqli_result could not be convert to string in C:\xampp\htdocs\phptest\index.php on line 8 好吧,我不知道你的库的确切实现。第 8 行是什么,有问题的变量的 vardump 是什么。伙计,你需要调试它...... 你可以在我上面的代码中看到实现。很明显,这是我打印 $result 的打印语句 :-D 好吧,你也应该解决这个问题,错误信息对我来说似乎很清楚,这是你的错误(提示,$result 不是你打印的东西,你需要提取结果)。尝试按照教程进行操作 另外我想你会发现我提到的教程着眼于从贬值的 mysql 接口到 mysqli 到 PDO 的所有连接方式。我尝试以与使用 mysqli_fetch_assoc 在旧数据中查询类似的方式提取变量,但这不起作用。

以上是关于使用 PHP 返回 mysql 存储过程的输出参数的主要内容,如果未能解决你的问题,请参考以下文章

在MySQL中如何创建一个带输出参数为一个表类型的存储过程

mysql中存储过程中的EXISTS和输出参数

PHP MySQL PDO 绑定输入/输出相同参数

MySQL 存储过程参数验证

PHP PDO 无法获取 OUT 参数值

MySql存储过程的作用及语法