重复使用带有可选条件的准备语句

时间:2016-12-15 11:22:58

标签: php mysql pdo binding prepared-statement

我在WHERE子句中使用了一个具有各种条件的非常复杂的预处理语句,并且在某一点上我实际上需要具有一个更具体条件的相同语句。创建两个不同的语句是一种糟糕的方法,因为它们共享大部分查询字符串,当我更新一个时,我也必须更新另一个。到目前为止,我尝试使用它:

SELECT columns
FROM tables
WHERE manyConditions AND (specificColumn = ? OR ? = NULL)

在这种情况下,我可以绑定一个任意参数和NULL来呈现特定条件对于不需要它的查询($pdo->execute([/* ... */, -1, null]))无效,同时仍然能够在绑定时specificColumn进行过滤适当的值和非NULL的内容($pdo->execute([/* ... */, 'specific value', true]))。

这是防止代码重复的一种非常脏的方法,它迫使我在大多数情况下绑定另外两个变量。

是否有更优雅的方法来防止代码重复?

1 个答案:

答案 0 :(得分:0)

这是一个深思熟虑的程序员的一个非常好的问题。

我认为没有同样优雅和简单的解决方案。但我可以提供几种方法,你可以决定哪种方法最适合你。

  1. 您可以使用命名占位符并保持启用仿真模式。在这种情况下,您只需要绑定每个变量一次。但是,整体写作将与命名占位符保持一致,您必须重复每个名称三次。
  2. 正如现在删除的答案中所建议的那样,您可以使用条件查询构建,例如

    $sql = "SELECT columns FROM tables WHERE manyConditions";
    $params = [$a,$b,$c];
    if (!empty($d)) {
        $sql .= " AND specificColumn = ?";
        $params[] = $d;
    }
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params)