поисковый запрос с объединением показывает все строки, когда искомая строка пуста - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть запрос для поиска вакансии в двух таблицах.

Переменные для этого запроса отправляются с формой, которая имеет несколько входов / выборок.Один - это ввод текста для названия вакансии, а другой - раскрывающийся список со всеми категориями, к которым может принадлежать вакансия.

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

Мой запрос:

$functie = $_POST['functie'];
$branche = $_POST['branche'];
$regio = $_POST['regio'];

$search = "
SELECT cnt.title, cnt.alias, cnt.images, cnt.introtext, cnt.catid, cat.title, cat.alias
FROM snm_content cnt
LEFT JOIN snm_categories cat
ON cat.id = cnt.catid
WHERE ('".$functie."' ='' OR cnt.title LIKE '%".$functie."%')
OR ('".$branche."' ='' OR cat.title LIKE '%".$branche."%')
";

Если я повторяю запрос без ввода в текстовом поле, это то, что я получаю:

SELECT cnt.title, cnt.alias, cnt.images, cnt.introtext, cnt.catid, cat.title, cat.alias
FROM snm_content cnt
LEFT JOIN snm_categories cat
ON cat.id = cnt.catid
WHERE ('' ='' OR cnt.title LIKE '%%')
OR ('logistiek' ='' OR cat.title LIKE '%logistiek%')

snm_content - это вакансии, а snm_categories - это категории.

Как показать только вакансии, относящиеся к выбранной категории?

1 Ответ

0 голосов
/ 22 ноября 2018

Обратите внимание, что ваш код открыт для SQL-инъекций связанных атак.Пожалуйста, научитесь использовать Подготовленные операторы

Теперь нам нужно динамически сгенерировать WHERE часть запроса.Мы можем использовать функцию !empty(), чтобы проверить, не является ли значение входного фильтра не пустым, а затем динамически добавить его условие в запрос.

$functie = $_POST['functie'];
$branche = $_POST['branche'];
$regio = $_POST['regio'];

$search = "
SELECT cnt.title, cnt.alias, cnt.images, cnt.introtext, cnt.catid, cat.title, cat.alias
FROM snm_content cnt
LEFT JOIN snm_categories cat
ON cat.id = cnt.catid ";

// Collect all the where conditions in an array
$whr = array();

// check if $functie has some value in input filter
if (!empty($functie)) {
    $whr[] = "cnt.title LIKE '%" . $functie . "%'";
}

// check if $branche has some value in input filter
if (!empty($branche)) {
    $whr[] = "cat.title LIKE '%" . $branche . "%'";
}

$where_sql = '';
// Prepare where part of the SQL
if (!empty($whr)) {

    $where_sql = ' WHERE ' . implode(' OR ', $whr);
}

// Append to the original sql
$search .= $where_sql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...