2

我正计划使用 PHP 和 MySQL 开发一个 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/

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

4

1 回答 1

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 语句一样返回值。

于 2013-01-27T21:44:50.103 回答