我正在构建一个基于传入的$_GET
参数动态更改的SQL查询。我只是想知道放入一个'虚拟'约束是否是一个'可接受的'实践,所以在添加新约束(每次)之前,我不必检查SQL字符串是否存在'where'。
例如,'虚拟'约束':
$sql = "select * from users u where u.id != 0";
现在,在我确定是否必须添加更多约束的每个块中,我可以这样做:
if (!empty($uid))
$sql .= " and (u.id = {$uid})";
而不是:
if (!empty($uid)) {
$sql .= strpos($sql, "where") === false ? " where " : " and ";
$sql .= " (u.id = {$uid})";
}
答案 0 :(得分:2)
我已使用该约定(尽管我通常使用WHERE 1=1 AND
。)根据您的RDBMS,使用列可能会影响性能。例如,如果您有一个索引,否则该索引将是除该列之外的覆盖索引。
请确保您了解这种动态SQL的潜在缺陷,但如果这是您最终要做的事情,那么添加额外的内容似乎对我有意义。
答案 1 :(得分:1)
您可以收集条件:
,而不是为每个检查附加到SQL字符串if ($_GET["uid"]) {
$where[] = array("u.id =", $_GET->sql["uid"]);
if ($_GET["photo"]) {
$where[] = array("u.has_photo =", 1);
完成后填写SQL字符串:
foreach ($where as $add) {
$sql .= ...;
}
否则,这是一种可接受的方法。我不会发现大武器并使用完整的ORM查询构建器。
答案 2 :(得分:0)
来自手册
SELECT * FROM table WHERE 1
是的,你可以这样做