使用 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.movi​​e_' 在第 1 行" 然后尝试用逗号分隔 SEPERATOR,还是必须用空格分隔? 我不知道我试过但它没有发生顺便说一句我是新手 我不在我的电脑前,当我在时,我会用一个完整的工作示例回复你

以上是关于使用 mysql 和 php 显示所有电影列表的主要内容,如果未能解决你的问题,请参考以下文章

带有分层邻接模型MySql和PHP的缩进HTML下拉列表

使用 MySQL、PHP/JavaScript/Ajax/jQuery 的链接下拉列表

PHP & MySQLi - 在下拉列表中显示选定的值两次

如何在php中使用下拉列表显示不同的mysql表

使用 PHP 在多个下拉列表中显示数据库中的数据

使用JS进行多类别过滤?