我有一个包含4个输入字段的表单。这些字段用于查询数据中的表。如果它有内容,我只使用一个字段。如果' auteur'有价值,没有问题。但是当此字段为空时,查询为false,因为查询以' 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";
答案 0 :(得分:0)
在决定在语句中添加“OR”之前,逻辑应检查前面语句是否存在。
if ($foo) $sql = "Select foo, bar, baz from sometable where qux = 1 ";
if ($bar && strlen($foo)) $sql .= "OR ";
if ($bar) $sql .= "quux = 2 ";
答案 1 :(得分:0)
foreach(array_filter($_SESSION) as $k=>$v){$arr[]="(BESC..$k.$v.)";}
$q_article .= implode(' OR ',$arr);
答案 2 :(得分:0)
一个简单的快速修复方法是将一个你知道错误0=1
的测试附加到语句中,然后对于所有实际情况,你可以在每个条件之前附加OR
。
您可以将语句的开头更改为:
$q_article = "SELECT * FROM MASTERBASE_VOLLEDIG
WHERE `STATUS` = 'ART'
AND ( 1=0 " ;
# ^^^
然后你可以附加OR
,而不必检查你是否已经附加了某些东西。如果您还要添加其他内容,则可以随时添加OR
关键字:
$q_article .= " OR BESCHRIJVING LIKE ...
# ^^^
完成追加后,无条件地关闭在声明开头打开的那个paren。
(显然,这不是唯一的方法,可能不是修复它的最佳方法。但编码很容易理解。)
此外,您的代码似乎容易受到SQL注入攻击。我更喜欢使用带有绑定占位符的预准备语句。但如果您使用mysqli_real_escape_string
接口,则缺少该值,SQL文本中包含的值应正确转义,例如mysqli
。