包含 4 个字段的条件查询


conditional query with 4 fields

>我有一个包含 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