使用 mysql 和 php 显示所有电影列表
Posted
技术标签:
【中文标题】使用 mysql 和 php 显示所有电影列表【英文标题】:Display all movie list using mysql and php 【发布时间】:2018-06-05 18:19:38 【问题描述】:我有一个数据库
-movie ( movie_id , title , year)
1 , thor , 2017
2 , deadpool,2018
-genre ( genre_id , genre_name )
1 , action
2 , adventure
3 , comedy
-movie_genre ( movie_id , genre_id )
1 , 1
1 , 2
2 , 2
2 , 3
我的php代码是
<?php
$info_query = mysql_query("
SELECT *
FROM movie
, genre
, movie_genre
WHERE movie.movie_id = movie_genre.movie_id
AND genre.genre_id = movie_genre.genre_id
")or die(mysql_error());
$info_count =mysql_num_rows($info_query);
while($info_row = mysql_fetch_array($info_query))
if ($info_count > 0) ?>
<?php echo $info_row['title'] ?>
<?php echo $info_row['genre'] ?>
<?php
?>
输出是
thor action thor adventure
我想要
thor acton adventure
deadpool adventure comedy
【问题讨论】:
我们很久以前就停止使用这个过时、不安全且已弃用的 API。这是为了历史利益吗? 警告:不要使用在 PHP 7 中删除的过时的mysql_query
接口。PDO is not hard to learn 之类的替代品和PHP The Right Way 之类的指南有助于解释最佳实践.这里的参数是 NOT properly escaped 并且在这段代码中有严重的 SQL injection bugs。转义任何和所有用户数据,尤其是来自$_POST
或$_GET
。
【参考方案1】:
<?php
$info_query = mysql_query("
SELECT mv.movie_id, mv.title, gr.genre_name
FROM movie_genre mg
INNER JOIN movie mv ON mg.movie_id = mv.movie_id
INNER JOIN genre gr ON mg.genre_id = gr.genre_id
")or die(mysql_error());
$info_count = mysql_num_rows($info_query);
if ($info_count > 0)
$movies = [];
while ($info_row = mysql_fetch_array($info_query))
if (!isset($movies[$info_row['movie_id']]))
$movies[$info_row['movie_id']] = ['title' => $info_row['title'], 'genres' => []];
$movies[$info_row['movie_id']]['genres'][] = $info_row['genre_name'];
foreach ($movies as $movie_id => $movie )
echo $movie['title'] .' ';
foreach ($movie['genres'] as $genre)
echo $genre . ' ';
echo "\n<br>";
【讨论】:
警告:mysql_*
扩展自 PHP 5.5.0 起已弃用,自 PHP 7.0.0 起已被删除。相反,应该使用mysqli 或PDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。【参考方案2】:
这个查询应该可以工作:
SELECT title,
GROUP_CONCAT(genre_name) AS genre
FROM movie_genre
JOIN movie ON movie.movie_id = movie_genre.movie_id
JOIN genre ON genre.genre_id = movie_genre.genre_id
GROUP BY title
然后在 php 中,如果您愿意,可以将逗号替换为空格,如下所示;
<?php
echo $info_row['title'];
echo str_replace(',',' ',$info_row['genre']);
?>
【讨论】:
看我用GROUP_CONCAT
编辑,应该是你所追求的,一开始在手机上误读了问题
现在它说“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'SEPERATOR ' ' 附近使用的正确语法) FROM movie_genre JOIN movie ON movie。 movie_id =movie_genre.movie_' 在第 1 行"
然后尝试用逗号分隔 SEPERATOR,还是必须用空格分隔?
我不知道我试过但它没有发生顺便说一句我是新手
我不在我的电脑前,当我在时,我会用一个完整的工作示例回复你以上是关于使用 mysql 和 php 显示所有电影列表的主要内容,如果未能解决你的问题,请参考以下文章