我在WHERE子句中使用了一个具有各种条件的非常复杂的预处理语句,并且在某一点上我实际上需要具有一个更具体条件的相同语句。创建两个不同的语句是一种糟糕的方法,因为它们共享大部分查询字符串,当我更新一个时,我也必须更新另一个。到目前为止,我尝试使用它:
SELECT columns
FROM tables
WHERE manyConditions AND (specificColumn = ? OR ? = NULL)
在这种情况下,我可以绑定一个任意参数和NULL来呈现特定条件对于不需要它的查询($pdo->execute([/* ... */, -1, null])
)无效,同时仍然能够在绑定时specificColumn
进行过滤适当的值和非NULL的内容($pdo->execute([/* ... */, 'specific value', true])
)。
这是防止代码重复的一种非常脏的方法,它迫使我在大多数情况下绑定另外两个变量。
是否有更优雅的方法来防止代码重复?
答案 0 :(得分:0)
这是一个深思熟虑的程序员的一个非常好的问题。
我认为没有同样优雅和简单的解决方案。但我可以提供几种方法,你可以决定哪种方法最适合你。
正如现在删除的答案中所建议的那样,您可以使用条件查询构建,例如
$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)