【发布时间】:2011-04-11 09:54:36
【问题描述】:
赏金更新:已经从 Mark 那里得到了很好的回答。将 := 改编为 :, 下面。但是,我仍在寻找除 DBIx 之外的类似方案。我只是对兼容任何东西感兴趣。
我需要有关我为参数化 SQL 语句中的“扩展”占位符选择的语法的建议。因为构建一些结构(IN 子句)让我很烦,所以我决定使用一些自动扩展为普通的语法快捷方式?占位符。
我喜欢他们。但我想把它打包分发,我问自己它们是否容易理解。
基本上我的新占位符是?? 和:?(枚举参数)和:& 和:, 和:| 和::(用于命名占位符),具有以下用例:
-> db(" SELECT * FROM all WHERE id IN (??) ", [$a, $b, $c, $d, $e])
?? 扩展为 ?,?,?,?,?,...,具体取决于我的 db() 函数的 $args 数量。这个很清楚,它的语法已经有点标准化了。 Perls DBIx::Simple 也使用它。所以我很确定这是一个可以接受的想法。
-> db(" SELECT :? FROM any WHERE id>0 ", ["title", "frog", "id"]);
// Note: not actually parameterized attr, needs cleanup regex
承认吧。我只是喜欢笑脸。基本上,这个 :? 占位符将关联的 $args 扩展为普通的列名。实际上,它会丢弃任何 $args 值。它实际上对于与 ?? 结合使用的 INSERT 非常有用,有时对于 IN 子句也很有用。但是在这里我已经想知道这种新语法是否合理,或者不仅仅是一个误称,因为它混合了 : 和 ?人物。但不知何故,它似乎与语法方案很好地匹配。
-> db(" UPDATE some SET :, WHERE :& AND (:|) ", $row, $keys, $or);
这里的助记符 :, 扩展为由 , 逗号分隔的 name=:name 对列表。而:& 是由ANDs 加入的column=:column 列表。为了平价,我添加了:|。不过 :& 有 UPDATE 命令之外的其他用例。
但我的问题不是关于有用性,而是如果 :, 和 :& 似乎可以记住?
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
虽然我还添加了:: 来插入:named,:value,:list,但很像?? 扩展为?,?,?。类似的用例,并且具有一致性。
无论如何,还有其他人实施过这样的计划吗?不同的占位符?或者为了简单起见,您会推荐哪个? 更新: 我知道 PHP Oracle OCI 接口也可以绑定数组参数,但不使用特定的占位符。我正在寻找类似的占位符语法。
【问题讨论】:
-
我认为您对此进行了很多思考,但是
GROUP BY、HAVING和ORDER BY子句和子查询呢?自定义格式怎么样,比如当您需要按日期分组而不包括时间部分时?那些需要额外配置的函数,比如 COALESCE 或任何使用 OVER 子句的函数(假设支持)? -
@OMG Nah,并没有考虑太多。我专注于我最常见的用例。而具体的动态SQL还是需要人工操作的。尤其是表情。但例如:?可用于 ORDER 和 GROUP BY 子句。对于一些结构,我已经有了 {TOKEN} 支持(本质上又是 SQL 连接)。
-
@stereofrog:确实。尽管后端目标不同,但我更关心在 SQL 中抛出数组。占位符方法具有可比性。