Я использую приведенный ниже код для поиска в моей базе данных по ключевым словам, заданным пользователем. Кажется, по большей части работает нормально, но я ищу как по местоположению, так и по ключевым словам. Вот где у меня есть проблемы.
Если я не указываю местоположение и выполняю поиск, он возвращает все результаты независимо от местоположения, что нормально. Если я добавлю местоположение, которое не существует, и некоторые ключевые слова, он возвращает все результаты, соответствующие ключевым словам, и, кажется, игнорирует местоположение.
Также, если я оставляю ключевые слова пустыми и выполняю поиск по существующему местоположению, кажется, что он снова игнорирует местоположение и просто возвращает все результаты.
Так что, казалось бы, моя логика для установки местоположения не работает.
$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
условие для местоположения. Ваш AND
состояние проверяется с последним OR
петли. Если какой-либо из других 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}%')";
Других решений пока нет …