[英]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.