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

标签 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 模式,那么在搜索模型中为每个可能的过滤器构建方法是否有意义?

最佳答案

我会这样做:

$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); 
}

关于php - 基于发布的变量构建 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1245023/

相关文章:

php - 我如何在 Joomla 中使 textarea 成为 TinyMCE?

php - 使用 MYSQL 格式化字符串 -- PHP

php - SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法

mysql - 用另一个查询结果更新行

mysql - 选择双重复

MySQL 查询优化 : how to optimize voting calculations?

php - jQuery 没有调用我的函数?

mysql - 在 where 子句中使用 OR 优化 sql 语句

mysql - SQL 执行内连接,但需要根据某些值进行不同的查询

php - 无法解密数据 - openssl_private_decrypt() : key parameter is not a valid private key