一尘不染

SQL的扩展占位符,例如WHERE id IN(??)

sql

赏金更新 :马克(Mark)已经提供了很好的答案。下面将:=改编为:。但是,除了DBIx之外,我还在寻找类似的方案。我只是想与 任何东西 兼容。


我需要就我在参数化SQL语句中为“扩展”占位符选择的语法提出建议。由于构建某些构造(IN子句)困扰着我,因此我决定使用一些语法快捷方式,这些快捷方式会自动扩展为普通的?占位符。
我喜欢他们。但是我想打包分发,并问自己是否容易理解。

基本上,我的新占位符是??and :?(枚举参数)和:&and:,:|and和::(对于命名的占位符),具有以下用例:

-> db("  SELECT * FROM all WHERE id IN (??)  ", [$a, $b, $c, $d, $e])

??扩展到?,?,?,?,?,...依赖于$ args来数我的DB()FUNC。这很清楚,它的语法已经有点标准化了。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接口也可以绑定数组参数,但是不使用特定的占位符。而且我正在寻找可比较的占位符语法。


阅读 151

收藏
2021-03-17

共1个答案

一尘不染

你可能想避免使用:=作为一个占位符,因为它已经有一个使用在例如MySQL的。

例如,请参阅此答案以了解实际用法。

2021-03-17