Поисковый запрос показывает все записи при поиске в двух столбцах, а поисковое слово пусто - PullRequest
0 голосов
/ 11 декабря 2018

У меня проблема с запросом, который я использую.

Есть две вещи для поиска: категория и поисковое слово, поиск категории в столбце категории в моей базе данных, но эта частьзапрос добавляется только в том случае, если выбрана категория, если нет, то в запросе отсутствует вся часть категории.

Затем мое поисковое слово искало в двух столбцах, столбце заголовка и текстовом столбце (называемом introtext).).

Это мой запрос сейчас:

$content = "
SELECT cnt.id as content_id, cnt.title as content_title, cnt.featured, cnt.ordering, cnt.alias as content_alias, cnt.catid, cnt.images, cnt.state, cnt.introtext, cat.id as cat_id, cat.title as cat_title, cat.alias as cat_alias,
MAX(case when f.field_id = 7 then f.value end) as hoofdafbeelding,
MAX(case when f.field_id = 8 then f.value end) as openingstijden,
MAX(case when f.field_id = 9 then f.value end) as straat,
MAX(case when f.field_id = 10 then f.value end) as facebook,
MAX(case when f.field_id = 11 then f.value end) as instagram,
MAX(case when f.field_id = 12 then f.value end) as telefoonnummer,
MAX(case when f.field_id = 13 then f.value end) as website
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id AND cnt.state = 1
LEFT JOIN snm_fields_values f
ON cnt.id = f.item_id
WHERE cnt.title LIKE '%".$conn->real_escape_string($trefwoord)."%' OR
cnt.introtext LIKE '%".$conn->real_escape_string($trefwoord)."%'
".$branchequery."
GROUP BY cnt.id, cnt.title, cnt.featured, cnt.alias, cnt.catid, cnt.images, cnt.state, cnt.introtext, cat.id, cat.title, cat.alias
ORDER BY cnt.ordering";
$contentcon = $conn->query($content);

И, кроме того, у меня есть пара слов if, чтобы увидеть, была ли выбрана категория (филиал).Этот код:

if(!empty($branche)){
  $branchequery = "AND cat.alias LIKE '".$conn->real_escape_string($branche)."'";
}else{
  $branchequery = '';
}
$branchetitel = str_replace('-', ' ', $branche);
if(!empty($trefwoord)){
  $gezocht = 'Je zocht naar: <b class="orange">'.$trefwoord.'</b>';
}else if(empty($trefwoord) AND empty($branche)){
  $gezocht = 'Je hebt geen zoekopdracht ingevoerd.';
  $branchequery = "AND cat.alias LIKE '%.............%'";
}else{
  $gezocht = 'Je zocht naar: <b class="orange">'.ucfirst($branchetitel).'</b>';
}

Точки являются грязным исправлением, поэтому мой запрос не возвращает все строки, когда он пуст.

Но у меня все еще есть эта проблема, когда $trefwoord пуст.

Поэтому, когда я выбираю категорию в форме поиска, но не добавляю поисковое слово ($ trefwoord), я все равно получаю все строки, а не только элементы из этой категории, я получаю их все.

Как я могу это исправить?

Каким-то образом, если я удалю эту строку из моего запроса:

OR
    cnt.introtext LIKE '%".$conn->real_escape_string($trefwoord)."%'

Это работает, но я хотел бы иметь возможность искать как втекст и названия предметов в моей базе данных.Как я могу это сделать?

1 Ответ

0 голосов
/ 11 декабря 2018

Ваша проблема в приоритете оператора в предложении WHERE.В настоящее время, когда $trefwoord пусто, ваше предложение WHERE выглядит следующим образом:

WHERE cnt.title LIKE '%%' OR
      cnt.introtext LIKE '%%' AND 
      cat.alias LIKE 'something'

Это оценивается как

WHERE cnt.title LIKE '%%' OR
      (cnt.introtext LIKE '%%' AND cat.alias LIKE 'something')

, что всегда будет истинным (cnt.title LIKE '%%'всегда будет соответствовать).Вы должны решить эту проблему, используя соответствующие круглые скобки, поэтому предложение WHERE выглядит так:

WHERE (cnt.title LIKE '%%' OR cnt.introtext LIKE '%%') AND 
      cat.alias LIKE 'something'

Итак, в вашем PHP пишите:

WHERE (cnt.title LIKE '%".$conn->real_escape_string($trefwoord)."%' OR
cnt.introtext LIKE '%".$conn->real_escape_string($trefwoord)."%')
".$branchequery."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...