我已经创建了一个简单的项目来帮助我掌握php和mysql,但是遇到了一个小问题,我有一个有效的解决方案,但是想了解为什么我不能以这种方式成功运行这个代码,生病解释:
我有一个功能,
function fetch_all_movies(){
global $connection;
$query = 'select distinct * FROM `'.TABLE_MOVIE.'` ORDER BY movieName ASC';
$stmt = mysqli_prepare($connection,$query);
mysqli_execute($stmt);
mysqli_stmt_bind_result($stmt,$id,$name,$genre,$date,$year);
while(mysqli_stmt_fetch($stmt)){
$editUrl = "index.php?a=editMovie&movieId=".$id."";
$delUrl = "index.php?a=delMovie&movieId=".$id."";
echo "<tr><td>".$id."</td><td>".$name."</td><td>".$date."</td><td>".get_actors($id)."</td><td><a href=\"".$editUrl."\">Edit</a> | <a href=\"".$delUrl."\">Delete</a></td></tr>";
}
}
这会获取我的数据库中的所有电影,然后我希望得到每部电影的演员数,所以我传入get_actors($ id)函数获取电影ID,然后给我计算多少演员被拍到电影中。
这是函数:
function get_actors($movieId){
global $connection;
$query = 'SELECT DISTINCT COUNT(*) FROM `'.TABLE_ACTORS.'` WHERE movieId = "'.$movieId.'"';
$result = mysqli_query($connection,$query);
$row = mysqli_fetch_array($result);
return $row[0];
}
这些函数在单独调用时都很完美,我只是想了解当我在函数内部传递函数时我得到这个警告:
警告:mysqli_fetch_array()期望 参数1是mysqli_result, 给出的布尔值 /Applications/MAMP/htdocs/movie_db/includes/functions.inc.php 在第287行
任何人都可以帮我理解为什么吗?
非常感谢。答案 0 :(得分:1)
mysqli_query无法运行您的查询:
失败时返回FALSE。对于 成功的SELECT,SHOW,DESCRIBE或 EXPLAIN查询mysqli_query()会 返回一个结果对象。对于其他 成功的查询mysqli_query()会 返回TRUE。
在运行mysqli_fetch_array test $ result之前......类似于:
if ($result !== false)
$row = mysqli_fetch_array($result);
else
return false;
似乎是SQL语句中的变量范围问题。输出SQL应该显示“true”错误。
答案 1 :(得分:0)
如果出现错误,mysqli_query将返回false。您必须以一种简单的方式处理错误:
$result = mysqli_query($connection,$query);
if (!$result) {
die(mysqli_error($connection));
}
$row = mysqli_fetch_array($result);
请注意,终止(通过执行die())通常不是对错误做出反应,记录它,给用户anice错误页面等的好方法。这是alsonogood做法给出低级错误消息toauser,这可能激励用户尝试利用可能的安全问题。
最后一句话:你在写
$query = 'SELECT DISTINCT COUNT(*) FROM `'.TABLE_ACTORS.'` WHERE movieId = "'.$movieId.'"';
你应该正确地逃离那里的movieId。
答案 2 :(得分:0)
您可能希望尝试使用包含函数的类,例如:
class getInfo {
function fetch_all_movies(){
global $connection;
$query = 'select distinct * FROM `'.TABLE_MOVIE.'` ORDER BY movieName ASC';
$stmt = mysqli_prepare($connection,$query);
mysqli_execute($stmt);
mysqli_stmt_bind_result($stmt,$id,$name,$genre,$date,$year);
while(mysqli_stmt_fetch($stmt)){
$editUrl = "index.php?a=editMovie&movieId=".$id."";
$delUrl = "index.php?a=delMovie&movieId=".$id."";
echo "<tr><td>".$id."</td><td>".$name."</td><td>".$date."</td><td>".get_actors($id)."</td><td><a href=\"".$editUrl."\">Edit</a> | <a href=\"".$delUrl."\">Delete</a></td></tr>";
}
}
function get_actors($movieId){
global $connection;
$query = 'SELECT DISTINCT COUNT(*) FROM `'.TABLE_ACTORS.'` WHERE movieId = "'.$movieId.'"';
$result = mysqli_query($connection,$query);
$row = mysqli_fetch_array($result);
return $row[0];
}
}
$showInfo = new getInfo;
//fetch all movies
$showInfo->fetch_all_movies();
//List actors from movie 1
$showInfo->get_actors("1");