>我有一个包含 4 个输入字段的表单。这些字段用于查询数据集中的表。我只使用有内容的字段。如果"作者"有价值,那就没有问题了。但是当此字段为空时,查询为 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";
在决定在语句前面加上"OR"之前,逻辑应该检查前面语句是否存在。
if ($foo) $sql = "Select foo, bar, baz from sometable where qux = 1 ";
if ($bar && strlen($foo)) $sql .= "OR ";
if ($bar) $sql .= "quux = 2 ";
foreach(array_filter($_SESSION) as $k=>$v){$arr[]="(BESC..$k.$v.)";}
$q_article .= implode(' OR ',$arr);
一个肮脏的快速解决方法是将一个你知道是错误的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
。