我已经搜索了互联网,但我找不到类似我的问题。我正在尝试构建一个可以从多个表中提取数据的实时搜索函数。它适用于一张表,但我希望能够从乐队、用户(专辑等)中提取。
这是我的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>";
}
}
}
j查询:
$("#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 表示 band 和 index.php?user=$user_id 对于用户。
问题是,无论记录是乐队还是用户,您都会丢失信息,通过执行UNION ALL
。这会将不同类型的记录放入同一集合中,并合并列band_id
、user_id
和band_name
、username
。
您可以通过不同的方式解决此问题:
-
创建两个单独的查询。然后获取波段查询的所有结果并将它们放入数组中,并将用户查询的所有结果放入不同的数组中。之后,回显两个数组的结果。
-
让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
列中。