赏金更新: 已经从马克那里得到了很好的答案。将 := 改编为 :,如下。然而,除了 DBIx 之外,我仍在寻找类似的方案。我只是想兼容anything.
我需要有关我为参数化 SQL 语句中的“扩展”占位符选择的语法的建议。因为构建一些构造(IN 子句)困扰着我,所以我决定使用一些自动扩展为普通 ? 的语法快捷方式。占位符。
我喜欢他们。但我想将其打包分发,并问自己它们是否容易理解。
基本上我的新占位符是??
and :?
(枚举参数)和:&
and :,
and :|
and ::
(对于命名占位符)具有以下用例:
-> db(" SELECT * FROM all WHERE id IN (??) ", [$a, $b, $c, $d, $e])
The ??
扩展到?,?,?,?,?,...
取决于我的 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
成对分开,
逗号。鉴于:&
是一个列=:列列表,由AND
s。为了奇偶性我添加了:|
。不过, :& 在 UPDATE 命令之外还有其他用例。
但我的问题不是有用性,而是 :, 和 :& 是否容易记住?
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
经过一些之后我还添加了::
插值:named,:value,:list
非常喜欢??
扩展到?,?,?
。类似的用例,并且为了一致性是明智的。
不管怎样,还有其他人实施过这样的计划吗?不同的占位符?或者为了简单起见,您会推荐哪个?Update:我知道 PHP Oracle OCI 接口也可以绑定数组参数,但不使用特定的占位符。我正在寻找类似的占位符语法。