php - 使用 "AND"表达式构建动态 SQL 而不会混淆嵌套条件?

标签 php sql if-statement dynamic-sql

我对 php 和一般编码还很陌生。

我有一系列条件需要测试它们是否已设置。 它们是 $option1, $option2, $option3

if (isset($option1)){
    if (isset($option2)){
        if (isset($option3)){
            $query = "SELECT *
                               FROM Group
                               WHERE FirstOption = '$option1' AND SecondOption = '$option2' AND ThirdOption = '$option3'";
        }
        else {
            $query = "SELECT *
                               FROM Group
                               WHERE FirstOption = '$option1' AND SecondOption = '$option2";
        }
    }
    else {
        $query = "SELECT *
                           FROM Group
                           WHERE FirstOption = '$option1' AND ThirdOption = '$option3";
    }
}
else {
    // .. snip, much more duplicated code ..
}

所以这里的问题是我需要根据条件是否设置对 mysql 进行唯一查询。但它们彼此之间有很大的关系,我实际上有 7 种选择,所以分支绝对是巨大的!我差点把自己搞糊涂了,三点停了下来。

必须有一种更好的写法 - 谁能帮助我更好地理解?

最佳答案

无需动态 sql 构建。只需使用逻辑。

SELECT *
  FROM Group
 WHERE (FirstOption = '$option1' or '$option1' = '') 
   AND (SecondOption = '$option2' or '$option2' = '')
   AND (ThirdOption = '$option3' or '$option3' = '')

理想情况下,您会使用占位符和准备好的语句,但出于教学目的,以上内容最为清晰。

万一有人好奇 - 对此没有显着的查询开销。任何现代数据库引擎都会将 '$option1' = '' 表达式优化为常量值,仅将其计算为 bool 值一次。

关于php - 使用 "AND"表达式构建动态 SQL 而不会混淆嵌套条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14351617/

相关文章:

python - 如何在 python 中有条件地对列表的元素求和?

php - 需要在 .htaccess 中的 RewriteRule 中隐藏 id

php - 如何解析 xml 以将其插入 mysql 数据库?

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

mysql - 具有最大日期实例的 SQL 查询

javascript - 如何检查函数是否已执行?

php - 值(value)比较未按预期进行

php - 如何跨页面播放背景音乐

c# - 在连接 Sql Server 数据库时,Java 和 C# 有什么区别?

apache - .htaccess - 如何根据环境变量设置自定义 header ?