我打算使用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中执行存储过程时,当我传入用户id为1时返回用户名test,但是在php中调用该函数时没有任何内容返回到屏幕。我也尝试过打印$ return,但这只返回一个空字符串(正如我在上面的代码中定义的那样)。我尝试过使用这个在线教程,但那里的解决方案似乎不起作用:
http://www.joeyrivera.com/2009/using-mysql-stored-procedures-with-php-mysqlmysqlipdo/
有谁知道我在这里做错了什么以及为什么这个存储过程的返回参数没有打印到屏幕上?
答案 0 :(得分: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中),因此您需要在单独的调用中查询此变量。如果它是对简单选择SP的调用,那么它将返回值作为任何其他select语句。