2016-01-21 61 views
-1

我有一个有4个输入字段的表单。这些字段用于查询数据中的表格。如果有内容,我只使用一个字段。如果'导演'具有价值,那就没有问题。但是,当该字段为空的查询是假的,因为该查询后开始“或”的“(”有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注入攻击。我宁愿使用带有绑定占位符的预处理语句。但是如果没有,SQL文本中包含的值应该正确转义,例如,如果使用的是mysqli接口,则使用mysqli_real_escape_string