условный запрос с 4 полями

-3

У меня есть форма с 4 полями ввода. Эти поля используются для запроса таблицы в базе данных. Я использую только поле, если оно имеет контент. Если "auteur" имеет значение, проблем нет. Но когда это поле пусто, запрос является ложным, потому что запрос начинается с 'OR' после '('

Когнитивное искажение?!

Мой код:

$q_article = "SELECT * FROM MASTERBASE_VOLLEDIG WHERE 
'STATUS' = 'ART' AND ( " ;

if (!empty($_SESSION['auteur'])) $q_article .= " (BESCHRIJVING LIKE ('%".$_SESSION['auteur']."%') or TITEL LIKE ('%".$_SESSION['auteur']."%') or AUTEUR LIKE ('%".$_SESSION['auteur']."%') ) ";

if (!empty($_SESSION['titel'])) $q_article .= " OR (BESCHRIJVING LIKE ('%".$_SESSION['titel']."%') or TITEL LIKE ('%".$_SESSION['titel']."%') or AUTEUR LIKE ('%".$_SESSION['titel']."%') ) ";

if (!empty($_SESSION['trefwoorden'])) $q_article .= " OR (BESCHRIJVING LIKE ('%".$_SESSION['trefwoorden']."%') or TITEL LIKE ('%".$_SESSION['trefwoorden']."%') or AUTEUR LIKE ('%".$_SESSION['trefwoorden']."%') ) ";

if (!empty($_SESSION['uitgever'])) $q_article .= " OR (BESCHRIJVING LIKE ('%".$_SESSION['uitgever']."%') or TITEL LIKE ('%".$_SESSION['uitgever']."%') or AUTEUR LIKE ('%".$_SESSION['uitgever']."%') ) ";

$q_article .= ") ORDER BY BOEKNUMMER desc";
$q_article = "SELECT * FROM MASTERBASE_VOLLEDIG WHERE
'STATUS' = 'ART' AND ( " ;

if (!empty($_SESSION['auteur'])) $q_article .= " (BESCHRIJVING LIKE ('%".$_SESSION['auteur']."%') or TITEL LIKE ('%".$_SESSION['auteur']."%') or AUTEUR LIKE ('%".$_SESSION['auteur']."%') ) ";

if (!empty($_SESSION['titel'])) $q_article .= " OR (BESCHRIJVING LIKE ('%".$_SESSION['titel']."%') or TITEL LIKE ('%".$_SESSION['titel']."%') or AUTEUR LIKE ('%".$_SESSION['titel']."%') ) ";

if (!empty($_SESSION['trefwoorden'])) $q_article .= " OR (BESCHRIJVING LIKE ('%".$_SESSION['trefwoorden']."%') or TITEL LIKE ('%".$_SESSION['trefwoorden']."%') or AUTEUR LIKE ('%".$_SESSION['trefwoorden']."%') ) ";

if (!empty($_SESSION['uitgever'])) $q_article .= " OR (BESCHRIJVING LIKE ('%".$_SESSION['uitgever']."%') or TITEL LIKE ('%".$_SESSION['uitgever']."%') or AUTEUR LIKE ('%".$_SESSION['uitgever']."%') ) ";

$q_article .= ") ORDER BY BOEKNUMMER desc";

спросил(а) 2016-01-22T01:56:00+03:00 4 года, 1 месяц назад
0
76

Логика должна проверить наличие предыдущего утверждения, прежде чем принять решение о добавлении "ИЛИ" в оператор.

if ($foo) $sql = "Select foo, bar, baz from sometable where qux = 1 ";

if ($bar && strlen($foo)) $sql .= "OR ";

if ($bar) $sql .= "quux = 2 ";

ответил(а) 2016-01-22T02:02:00+03:00 4 года, 1 месяц назад
34

Грязное быстрое исправление должно было бы добавить тест, который, как вы знаете, будет ложным 0=1 для инструкции, а затем для всех ваших реальных условий вы можете добавить OR перед каждым условием.

Вы можете изменить начало выражения так:

$q_article = "SELECT * FROM MASTERBASE_VOLLEDIG 
WHERE 'STATUS' = 'ART'
AND ( 1=0 " ;
# ^^^

И тогда вы можете добавить OR без проверки того, что вы уже что-то добавили или нет. Если у вас есть что-то еще для добавления, вы всегда можете OR ключевое слово OR:


  $q_article .= " OR BESCHRIJVING LIKE ...
# ^^^

После того, как вы закончите добавление, просто безоговорочно закройте этот паз, который был открыт в начале инструкции.

(Очевидно, что это не единственный способ и, вероятно, не лучший способ его исправить, но кодирование легко и понятно).

Кроме того, ваш код, похоже, уязвим для SQL Injection. Я предпочел бы использовать подготовленные заявления со связующими заполнителями. Но при отсутствии этих значений значения, содержащиеся в тексте SQL, должны быть надлежащим образом экранированы, например, с помощью mysqli_real_escape_string если вы используете интерфейс mysqli.

ответил(а) 2016-01-22T02:13:00+03:00 4 года, 1 месяц назад
35

foreach(array_filter($_SESSION) as $k=>$v){$arr[]="(BESC..$k.$v.)";}
$q_article .= implode(' OR ',$arr);

ответил(а) 2016-01-22T02:03:00+03:00 4 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема