基于发布的变量构建MySQL查询

时间:2009-08-07 14:26:02

标签: php mysql

这似乎是一项如此简单的任务,但我很难找到一个我喜欢的解决方案。除了笨重,我找不到任何我会考虑的东西。以下是我正在使用的内容:

有一个搜索表单将变量发布到处理脚本。这些变量是要查询的数据的过滤器。根据用户的权限,可能会有更多或更少的变量进入,具体取决于他们可以访问的过滤器。每个过滤器基本上是指结果来自表格中的字段。每个过滤器的一个选项也是“ANY”,因此不需要WHERE子句。

构建查询字符串的好方法是什么。假设有四个变量:$ firstname,$ lastname,$ age,$ dob。但只有部分用户可以按$ age和$ dob进行过滤。

$query = "SELECT * FROM people";
if(($firstname != 'ANY' && !empty($firstname)) ||
   ($lastname != 'ANY' && !empty($lastname)) ||
   ($age != 'ANY' && !empty($age)) ||
   ($dob != 'ANY' && !empty($dob))) {
    $query .= " WHERE";
}

if($firstname != 'ANY' && !empty($firstname)) {
    $query .= " firstname='$firstname'";
}
if($lastname != 'ANY' && !empty($lastname)) {
    if($firstname != 'ANY' || !empty($firstname)) {
        $query .= " AND";
    }
    $query .= " lastname='$lastname'";
}
...

等等。但这对我来说只是看起来愚蠢,可怕,而且效率低得离谱。我正在使用稍微修改过的MVC模式,那么在搜索模型中为每个可能的过滤器构建方法是否有意义?

3 个答案:

答案 0 :(得分:5)

我会这样做:

$query = "SELECT * FROM people";

$whereClause = " WHERE 1 = 1 ";
if($firstname != 'ANY' && !empty($firstname)) {
    $whereClause .= " AND firstname='$firstname' ";
}
if($lastname != 'ANY' && !empty($lastname)) {
    $whereClause .= " AND lastname='$lastname' ";
}

$query .= $whereClause;

您也可以将所有语句收集到一个数组中,然后转到:

if (count($arr)>0) { 
   $query = "$query 
              WHERE ". implode(" AND ",$arr); 
}

答案 1 :(得分:0)

答案 2 :(得分:0)

这里有一些代码可以提取所有发布的变量并将它们串在一起。

foreach($_POST as $name=>$value){
    $arrFields[] = $name." = '".$value."'";
}
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields);

OR 如果您的字段名称与表名称不同,或者您希望在SQL中区别对待字段,则可以使用开关。

foreach($_POST as $name=>$value){
    switch($name){
        case "firstname":
            $arrFields[] = "fName = '".$value."'";
            break;
        case "lastname":
            $arrFields[] = "lName = '".$value."'";
            break;
        case "age":
            $arrFields[] = "bioAge >= ".$value;
            break;
    }
}
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields);