【问题标题】:PHP - Live Search using multiple MySQL tablesPHP - 使用多个 MySQL 表进行实时搜索
【发布时间】:2015-01-27 03:36:14
【问题描述】:

我已经搜索了互联网,但我找不到像我的问题一样的东西。我正在尝试构建一个可以从多个表中提取数据的实时搜索功能。它适用于一张桌子,但我希望能够从乐队、用户(专辑等)中提取。

这是我的 PHP 代码:

require ("includes/config/config.php"); 

$search_term = sanitize(htmlentities($_POST['search_term']));

if (!empty($search_term)){

    $search = "(SELECT `band_id`, `band_name` FROM `bands` WHERE `band_name` LIKE '%$search_term%'  LIMIT 0, 5) 
                UNION ALL
                (SELECT `user_id`, `username` FROM `users` WHERE `username` LIKE '%$search_term%'  LIMIT 0, 5)";
    $query = mysqli_query($conn, $search);
    $result = mysqli_num_rows($query);

    while ($row = mysqli_fetch_assoc($query)){
        #$user_id = $row['user_id'];
        #$username = $row['username'];
        $band_id = $row['band_id'];
        $band_name = $row['band_name'];
        $check = mysqli_num_rows($query);



        if ($check != 0){
            echo "<a style='text-decoration: none; color: black;' href='index.php?band=$band_id'><li class='searchResults'>" . ucfirst($band_name) . "</li></a>";
        } else {
            echo "<li class='searchResults'>No Results Found</li>";
        }
    }
}

jQuery:

$("#searchbar").keyup(function(){
    var searchTerm = $(this).val();

    $.post('search.php', { search_term: searchTerm}, function(data){

        $(".searchResults").html(data);
        $("#searchUl").css("display", "block");
    });
});

同样,其他一切都运行良好,但我不知道如何以某种方式查询多个表,因此我可以以不同的方式回显 href(即 index.php?band=$band_id for band 和 index.php?user =用户的$user_id。

【问题讨论】:

    标签: php jquery mysql ajax


    【解决方案1】:

    问题在于,通过UNION ALL,您会丢失记录是乐队还是用户的信息。这会将不同类型的记录放在同一个集合中,并合并列band_iduser_idband_nameusername

    你可以用不同的方式解决这个问题:

    1. 创建两个单独的查询。然后从bands查询中获取所有结果并将它们放入一个数组中,并将来自用户查询的所有结果放入一个不同的数组中。然后,回显两个数组的结果。

    2. 让 MySQL 告诉你每一行的类型。您可以通过像这样更改查询来实现这一点:

      (
          SELECT `band_id` , `band_name` , "band" AS `type`
          FROM `bands`
          WHERE `band_name` LIKE '%$search_term%'
          LIMIT 0 , 5
      )
      UNION ALL (    
          SELECT `user_id` , `username` , "user" AS `type`
          FROM `users`
          WHERE `username` LIKE '%$search_term%'
          LIMIT 0 , 5
      )
      

      您的查询结果现在将有一个名为type 的附加列,其中将包含"band""user"。根据该列的值,您可以回显不同的链接。

      例如,您可以像这样扩展您的代码:

      if($row["type"] === "band") {
          echo "somelink?band_id=" . $row["band_id"];
      } else {
          echo "somelink?user_id=" . $row["band_id"];
      }
      

      请注意,在这两种情况下,您都需要阅读$row["band_id"],因为连接将从查询的第一部分获取列名。所有用户 ID 都将在 band_id 列中。

    【讨论】:

    • 如何在“if 语句”中使用第二个选项或“回显”它?
    • 我最终选择了第一个选项,但最终不得不通过两个不同的 while 循环使其在用户面前显示所有波段结果。显然不是一个好的修复,但是让它工作很好。终有一天会完善。感谢您的帮助。
    • @MitchMullvain 如果使用第二种解决方案,您可以使用$row['type'] 访问类型。
    • @MitchMullvain 我更新了我的答案以包含一些示例代码,您可以如何使用第二种解决方案;我希望这能让它更清楚。
    • 非常感谢您的帮助。它现在工作得很好,你的建议确实减少了代码。非常感谢您的帮助。
    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 2013-05-26
    • 2019-11-16
    • 2017-07-10
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多