【问题标题】:Reuse prepared statement with optional condition使用可选条件重用准备好的语句
【发布时间】:2016-12-15 11:22:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请留下一些建设性的反馈,说明您为什么不赞成这个问题 - 也许有什么可以改进的?
  • 不要因为投反对票而难过我有同样的经历,但我从来没有得到任何答案......
  • 反对者至少可以发表评论

标签: php mysql pdo binding prepared-statement


【解决方案1】:

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

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

  1. 您可以使用命名占位符并保持模拟模式处于打开状态。在这种情况下,您只需将每个变量绑定一次。但是,整体书写方式与命名占位符相同,您必须将每个名称重复 3 次。
  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)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2020-08-20
    • 2015-10-06
    • 2013-10-26
    • 2017-05-23
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多