我计划使用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;
?>
我的问题出现在索引.php页面。它实际上似乎没有返回任何内容。在 PHPMyAdmin 中执行存储过程时,当我传入用户 ID 1 时会返回用户名测试,但是在 php 中调用函数时不会返回任何内容。我也尝试过打印$return,但这只返回一个空字符串(如我在上面的代码中定义的那样)。我尝试使用此在线教程,但那里的解决方案似乎不起作用:
http://www.joeyrivera.com/2009/using-mysql-stored-procedures-with-php-mysqlmysqlipdo/
有谁知道我在这里做错了什么,为什么这个存储过程的返回参数没有打印到屏幕上?
首先,您参考了有关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
)(sop在MySQL中),因此您需要在单独的调用中查询此变量。如果是对简单选择 SP 的调用,则它将像任何其他 select 语句一样返回值。