PHP - 使用多个MySQL表进行实时搜索

时间:2015-01-25 13:03:58

标签: php jquery mysql ajax

我已经浏览过互联网,但我找不到类似我的问题。我正在尝试构建一个可以从多个表中提取数据的实时搜索功能。它适用于一个表,但我希望能够从乐队,用户,(专辑等)中拉出来。

这是我的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 for user。

1 个答案:

答案 0 :(得分:1)

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

您可以通过不同方式解决此问题:

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

  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列。