带有4个字段

时间:2016-01-21 22:56:02

标签: php mysql sql

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

3 个答案:

答案 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