2016-01-21 2 views
-1

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

Когнитивная предвзятость ?!

Мой код:

$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"; 
+2

См. Http://stackoverflow.com/a/28909923/1491895 – Barmar

ответ

0

Логика должна проверить наличие предыдущего заявления до принятия решения предварять «ИЛИ» в заявлении.

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

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

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

Это помогло! Большое спасибо –

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

Но вы не должны использовать '$ _SESSION' здесь, массив с только полями, которые вам нужны! –

0

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

Вы можете изменить начало заявления, что-то вроде этого:

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

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

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

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

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

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