使用不按预期执行的表单中的多个变量进行查询

时间:2014-05-01 20:36:37

标签: php mysql

这是我要问的页面:

http://rdavidbeales.com/archiveprototype/advancedsearch.php

通过使用从建设性批评到原始帖子的术语进行一些搜索,我得到了忽略NULL变量的查询。

现在唯一的问题是我不能在AND变量的定义中包含$where语句,因为如果只选择了一个字段,那么我会得到一个无意义{{1}的错误声明。

  • 那么如何在必要时编辑新代码以包含AND

使用此链接Possible to have PHP MYSQL query ignore empty variable in WHERE clause?我已经提供了以下代码:

AND

以下是使用$anf = $_POST["artistnameform"]; $df = $_POST["decadeform"]; $stf = $_POST["subjecttermform"]; $ptf = $_POST["phototitleform"]; $where = "WHERE"; if(!empty($ptf)){ $where .= " P.PhotoTitle='$ptf '"; } if(!empty($anf)){ $where .= " PE.idPeople = '$anf '"; } if(!empty($stf)){ $where .= " S.idSubjectTerm = '$stf '"; } if(!empty($df)){ $where .= " P.PhotoCreatedDate LIKE CONCAT ('%', '$df ', '%')"; } 的查询:

$where

1 个答案:

答案 0 :(得分:1)

使用一系列条件,然后在

之间将它们与' AND '连接起来
$wheres = array();

if(!empty($ptf)){
    $wheres[] = " P.PhotoTitle='$ptf '";
}
if(!empty($anf)){
    $wheres[] = " PE.idPeople = '$anf '";
}
if(!empty($stf)){
    $wheres[] = " S.idSubjectTerm = '$stf '";
}
if(!empty($df)){
    $wheres[] = " P.PhotoCreatedDate LIKE '%{$df} %')";
}

$where = implode(' AND ', $wheres);

我也摆脱了你的CONCAT功能,因为它是多余的。

此外:

  1. 检查每个值后是否确实需要该空格。我想你不会。
  2. 在MySQL中使用专门的DateTime函数,而不是LIKE。如果编入索引,搜索时间值可以很快,但这样的LIKE运算符会杀死所有性能。
  3. 该脚本容易受到SQL注入攻击。转义引号,或者更好的是,在MySQLi或PDO中使用参数化查询。
  4. 不要使用mysql_...个功能。它们已被弃用,将来会被删除。
  5. 在编写带有多个表的SQL查询时,总是在字段前加上表名或别名。遵循这个简单的规则,您将来会避免很多错误。