繁体   English   中英

SQL查询构建实践

[英]SQL query building practices

我正在建立一个SQL查询,该查询根据传入的$_GET参数进行动态更改。 我只是想知道放置“虚拟”约束是否是“可接受”的做法,因此在添加新约束之前(每次),我不必检查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})";
}

我使用了该约定(尽管我通常使用WHERE 1=1 AND 。)根据您的RDBMS,使用列可能会影响性能。 例如,如果您有一个索引,否则该列将是覆盖索引。

请确保您了解这种动态SQL的潜在陷阱,但是如果最终您要这样做,那么对我来说,增加一点点似乎是有意义的。

您可以收集条件,而不是为每个检查附加到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查询生成器。

从手册

SELECT * FROM table WHERE 1

所以是的,你可以做到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM