SQL查询构建实践

时间:2010-09-07 14:00:51

标签: php sql

我正在构建一个基于传入的$_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})";
}

3 个答案:

答案 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

是的,你可以这样做