【问题标题】:How to display the datas from two tables using search query?如何使用搜索查询显示两个表中的数据?
【发布时间】:2019-08-09 05:40:32
【问题描述】:

我需要根据结果显示特定的数据。 我有两张表 movies_info => 有所有电影信息和 tv_shows_info => 有电视节目信息。我有搜索框,如果我输入搜索,它应该从表中搜索并显示数据,但结果中的条件如果它有 movie_id,它应该显示电影详细信息,如果结果有 tv_show_id 它应该显示电视节目详细信息。

到目前为止,我已经使用基本搜索从一个表中获取数据,并且我尝试使用两个但它不起作用。

<?php
// sql query for retrieving data from database
        $sql_query = "SELECT * FROM `movies_info`";
        $result = mysqli_query($connection, $sql_query);

 // SQL Query for filter
        if(isset($_POST['search_button']))
        {
            $value_to_search = $_POST['value_to_search'];

            // search in all table columns
            // using concat mysql function

            $search_query = "SELECT * FROM `movies_info` WHERE CONCAT(`movie_name`, `movie_original_name`, `release_year`, `movie_genre`, `movie_country`, `movie_stars`, `movie_director`) LIKE '%".$value_to_search."%'";

            //$search_query = "SELECT * FROM `movies_info`,`tv_shows_info` WHERE CONCAT(`movie_name`, `release_year`, `movie_genre`, `movie_country`, `tv_show_name`) LIKE '%".$value_to_search."%' GROUP BY `movie_id`";

            //$search_query = "SELECT * FROM `movies_info` UNION ALL `tv_shows_info` WHERE CONCAT(`movie_name`, `release_year`, `movie_genre`, `movie_country`, `tv_show_name`) LIKE '%".$value_to_search."%'";
            //$search_query2 = "SELECT * FROM `tv_shows_info` WHERE CONCAT(`tv_show_name`, `tv_show_start_year`, `tv_show_end_year`, `tv_show_genre`, `tv_show_country`) LIKE '%".$value_to_search."%'";
            //$search_query .= $search_query2;
            $search_result = filterTable($search_query);

        }

        else {
            $search_query = "SELECT * FROM `movies_info`";
            $search_result = filterTable($search_query);        
                //echo 'No Search Results Found';
        }

    ?>  

<!-- /w3l-medile-movies-grids -->
    <div class="general-agileits-w3l">
        <div class="w3l-medile-movies-grids">

                <!-- /movie-browse-agile -->

                      <div class="movie-browse-agile">
                         <!--/browse-agile-w3ls -->
                        <div class="browse-agile-w3ls general-w3ls">
                                <div class="tittle-head">
                                    <h4 class="latest-text">Search Results for : "<?php echo $value_to_search ?>"</h4>
                                    <div class="container">
                                        <div class="agileits-single-top">
                                            <ol class="breadcrumb">

                                              <li><a href="index.php">Home</a></li>
                                              <li class="active" style="text-transform:Capitalize;">Search Results </li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                     <div class="container">
                                    <div class="browse-inner">

                                        <?php

                                            echo $search_result;

                                            $rowcount = mysqli_num_rows($search_result);

                                            for($i=1;$i<=$rowcount;$i++){
                                            $row=mysqli_fetch_array($search_result);


                                        ?>

                               <div class="col-md-2 w3l-movie-gride-agile">
                                         <a href="movie.php?movie_id=<?php echo $row['movie_id']; ?>" class="hvr-shutter-out-horizontal"><img src="<?php echo $row['movie_image']; ?>" title="<?php echo $row['movie_name']; ?>" alt=" " />
                                         <div class="w3l-action-icon"><i class="fa fa-play-circle" aria-hidden="true"></i></div>
                                    </a>
                                      <div class="mid-1">
                                        <div class="w3l-movie-text">
                                            <h6><a href="movie.php?movie_id=<?php echo $row['movie_id']; ?>"><?php echo $row['movie_name']; ?></a></h6>                         
                                        </div>
                                        <div class="mid-2">

                                            <p><?php echo $row['release_year']; ?></p>
                                            <div class="block-stars">
                                                <ul class="w3l-ratings">

                                                         <li> 
                                                          <span>IMDB <i class="fa fa-star" aria-hidden="true"></i> <?php echo $row['movie_rating']; ?> </span>
                                                         </li>

                                                </ul>
                                            </div>
                                            <div class="clearfix"></div>
                                        </div>

                                    </div>
                                    <div class="ribben two">
                                        <p>NEW</p>
                                    </div>  
                                                </div> <?php } ?>
                                </div>

到目前为止,我可以从一张表中获取值。

我的确切需要是它可以是电影或电视节目,但我应该从两个表中获取数据,如果它是电影,它应该显示一些特定的信息,如果那是一个电视节目,它应该显示一些其他信息。

【问题讨论】:

  • 为什么不将结果放入两个不同的变量中,并检查它们是否为空,以形成一个表格,首先是电影,然后是电视节目。 – 丹麦哈希米——我只尝试过这种方法,@danishhashmi
  • 工作代码,但它只显示movies_info表数据(SELECT movie_name,movie_original_name,release_year,universal_release_date,movie_genre,movie_country,movie_stars,movie_director 作为类型 FROM movies_info WHERE movie_name LIKE '%the%' OR movie_original_name LIKE '%the%') UNION (SELECT tv_show_name,tv_show_original_name,tv_show_start_year,tv_show_end_year,tv_show_genre,tv_show_country,tv_show_stars,tv_show_director 作为类型 FROM tv_shows_info WHERE tv_show_name LIKE '%the%' OR tv_show_original_name LIKE '%the%');这个查询将给出完美的输出
  • 该查询在 PHPmyAdmin 中运行良好,但运行 PHP 显示以下内容,
    解析错误:语法错误,我遇到此问题时出现意外的 'movie_name' (T_STRING) @Priyank

标签: php search mysqli union


【解决方案1】:

首先,您需要使用准备好的语句,即使您在 MySQL 中使用 LIKE 函数也可以使用。然后,您需要在列名之间添加空格,以防止值像“星球大战星球大战”一样混合在一起。当用户搜索“ss”时,这将导致像“星球大战”这样的电影不准确。

$search_result = array(); 
$search_query = "SELECT * FROM `movies_info` WHERE CONCAT(`movie_name`,' ', `movie_original_name`,' ',`release_year`,' ',`movie_genre`,' ',`movie_country`,' ',`movie_stars`,' ',`movie_director`) LIKE CONCAT('%',?,'%')";
if($stmt = $db->prepare($search_query)){
        $stmt->bind_param('ii',$_SESSION['iidn_reference'],$o['parent_ref_id']);
        if($stmt and $stmt->execute()){
            $result = $stmt->get_result();
            while($row = $result->fetch_array(MYSQLI_ASSOC)){
                $search_result[] = $row;
            }
        }
}

之后,您可以将这些表与 MySQL UNION 组合,但我强烈建议您只搜索这两个表并为表名取别名以匹配。

SELECT 'movie' as `type`, `movie_id` as `id`, `movie_name` as `name`...
SELECT 'show' as `type`, `show_id` as `id`, `show_name` as `name`...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多