我使用下面的代码根据用户提供的关键字搜索数据库。它似乎在大多数情况下都很好用,但我正在根据位置和关键字进行搜索。这就是我的问题所在。
如果我不输入任何位置并进行搜索,则无论位置如何,它都会返回所有结果,这很好。如果我放入一个不存在的位置和一些关键字,它会返回所有与关键字匹配的结果,并且似乎忽略了该位置。
此外,如果我将关键字留空,并按确实存在的位置进行搜索,它似乎会再次忽略该位置,只返回所有结果。
因此,我设置位置的逻辑似乎不起作用。
$keys = explode(" ",$tag);
$search_sql = "SELECT DISTINCT providers.* FROM providers JOIN provider_tags ON providers.id = provider_tags.provider_Id JOIN tags ON provider_tags.tag_id = tags.id WHERE tags.tag_name LIKE '%$tag%' OR providers.provider_name LIKE '%$tag%' OR providers.provider_contact_name LIKE '%$tag%' OR providers.provider_features LIKE '%$tag%' ";
foreach($keys as $k){
$search_sql .= " OR tags.tag_name LIKE '%$k%' OR providers.provider_name LIKE '%$k%' OR providers.provider_contact_name LIKE '%$k%' OR providers.provider_features LIKE '%$k%' ";
}
$search_sql .= " AND (providers.provider_town LIKE '%{$location}%' OR providers.provider_local_area LIKE '%{$location}%' OR providers.provider_postcode LIKE '%{$location}%')";
echo $search_sql;
$gettags = mysqli_query($con, $search_sql) or die(mysqli_error($con));
您在循环中添加了一组OR
条件,然后为该位置添加了一个大的AND
条件。使用循环的最后一个OR
检查您的AND
条件。如果条件中的任何其他OR
是true
,那么无论AND
条件如何,都会得到一个结果。
编辑:
如果你:,你可能会得到你想要的结果
- 用括号包裹每个
OR
条件 - 将所有
OR
条件包裹在一起
类似于:
$search_sql = "SELECT DISTINCT providers.* FROM providers JOIN provider_tags ON providers.id = provider_tags.provider_Id JOIN tags ON provider_tags.tag_id = tags.id WHERE ( (tags.tag_name LIKE '%$tag%' OR providers.provider_name LIKE '%$tag%' OR providers.provider_contact_name LIKE '%$tag%' OR providers.provider_features LIKE '%$tag%') ";
foreach($keys as $k){
$search_sql .= " OR (tags.tag_name LIKE '%$k%' OR providers.provider_name LIKE '%$k%' OR providers.provider_contact_name LIKE '%$k%' OR providers.provider_features LIKE '%$k%') ";
}
$search_sql .= ") AND (providers.provider_town LIKE '%{$location}%' OR providers.provider_local_area LIKE '%{$location}%' OR providers.provider_postcode LIKE '%{$location}%')";