赏金更新 :马克(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命令之外还有其他用例。 但是我的问题不是关于有用性,而是:,和:&似乎可以记住吗?
name=:name
,
AND
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
经过一番,尽管我也添加::了一个:named,:value,:list非常像??扩展到?,?,?。类似的用例,明智的做法是保持一致。
:named,:value,:list
?,?,?
无论如何,还有其他人实施过这样的计划吗?不同的占位符?还是为简单起见,您会推荐哪个? 更新: 我知道PHP Oracle OCI接口也可以绑定数组参数,但是不使用特定的占位符。而且我正在寻找可比较的占位符语法。
你可能想避免使用:=作为一个占位符,因为它已经有一个使用在例如MySQL的。
:=
例如,请参阅此答案以了解实际用法。