SQL 的扩展占位符,例如id 在哪里 (??)

2023-11-25

赏金更新: 已经从马克那里得到了很好的答案。将 := 改编为 :,如下。然而,除了 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成对分开,逗号。鉴于:&是一个列=:列列表,由ANDs。为了奇偶性我添加了:|。不过, :& 在 UPDATE 命令之外还有其他用例。
但我的问题不是有用性,而是 :, 和 :& 是否容易记住?

 -> db("  SELECT * FROM all WHERE name IN (::)  ", $assoc);

经过一些之后我还添加了::插值:named,:value,:list非常喜欢??扩展到?,?,?。类似的用例,并且为了一致性是明智的。

不管怎样,还有其他人实施过这样的计划吗?不同的占位符?或者为了简单起见,您会推荐哪个?Update:我知道 PHP Oracle OCI 接口也可以绑定数组参数,但不使用特定的占位符。我正在寻找类似的占位符语法。


我喜欢您提案背后的基本思想,但不喜欢占位符的“命名”。我基本上有两个反对意见:

  • 您的占位符以以下任一开头:或与?。您应该选择一种形式,以便可以立即识别占位符。我会选?因为它与 SQL 发生冲突的可能性较小,并且更常用于表示占位符。
  • 占位符很难理解也很难记住。:& and :|对我来说似乎合理,但有区别??, :?and :是相当难的。

我改变了我的DB class支持更多占位符并且更加智能:DB_intelligent.php(自述文件中关于占位符的部分不适用于此类。它仅适用于普通类。)

DB 类有两种占位符: 多功能占位符?占位符和关联数组占位符?x (x may be ,, & or |).

?占位符:该占位符根据参数的类型确定插入类型:

null                => 'NULL'
'string'            => 'string'
array('foo', 'bar') => ('foo','bar')

?x占位符:数组中的每个元素都转换为`field`='value'结构并用分隔符内爆。分隔符由x成分:,用逗号分隔,& by AND and | by OR.

示例代码:

DB::x(
    'UPDATE table SET ?, WHERE value IN ? AND ?&',
    array('foo' => 'bar'),
    array('foo', 'bar'),
    array('hallo' => 'world', 'hi' => 'back')
);

// Results in this query:
// UPDATE table SET `foo`='bar' WHERE value IN ('foo','bar') AND `hallo`='world' AND `hi`='back'

我在设计这个版本的 DB 类时有一些想法:

可能会出现一个明显的想法:为什么不使用? for all数据类型,甚至关联数组。仅添加?& and ?|此外。使用?在关联数组上与使用相同?,在当前的设计中。我没有这样做的原因是安全。您经常希望从某个位置插入数据<select multiple>进入查询(IN ?)。但由于 HTML 允许排列(form[array])表单控件还可以提交具有相同名称的关联数组。因此,我的查询合成器会将其识别为字段 => 值列表。尽管这可能不会损害安全性,但会导致 SQL 错误,这是很糟糕的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 的扩展占位符,例如id 在哪里 (??) 的相关文章

随机推荐

  • 清理 HTML 输入

    我正在考虑添加一个富文本编辑器 以允许非程序员更改文本的外观 然而 一个问题是 如果标记不正确 则可能会扭曲所呈现页面的布局 什么是清理 html 的轻量级好方法 您必须在优质和轻量级之间做出选择 推荐的选择是 HTMLPurifier 因
  • 使用 Discord.js 发送消息

    我正在尝试制作一个 Discord 机器人 但我不太理解 Discord js 我的代码如下所示 client on message function message if message content ping client messa
  • 如何在.net中检测麦克风的声音

    我目前有代码来创建位于可用空间中的网络摄像头 并根据我通过按键盘上的按键设置的标志自动向上或向下移动 我希望能够做到这一点 以便如果在麦克风上检测到声音 高于某个阈值 这样它就不会只是拾取噪音 那么该标志就会设置为 true 如果声音停止
  • 如何找出.NET 4中实体框架中的字段最大长度?

    根据this问题是 EF v1 中没有内置方法来计算字段的长度 有没有built in在 NET 4 附带的实体框架中执行此操作的方法 如果是这样 如何实现 EF 4 0 中没有新的方法来访问属性的长度 您仍然需要遍历元数据 如图所示在您引
  • 在 Python 2.6 中使用 unicode_literals 有什么问题吗?

    我们已经让我们的代码库在 Python 2 6 下运行 为了准备 Python 3 0 我们开始添加 from future import unicode literals 进入我们的 py文件 当我们修改它们时 我想知道是否还有其他人这样
  • R Shiny:单击按钮上传文件

    我知道网络上已经有很多材料可以回答我的问题 但似乎没有一个对我有用 我想那是因为我不太了解 Shiny 的响应式编程 因此 我希望创建一个界面 让用户使用以下命令选择文件fileInput只需单击 上传 按钮即可上传 我尝试了来自各个论坛的
  • 在 asp.net 中只能将 ScriptManager 的一个实例添加到页面中

    当我尝试添加用户控件时出现此错误 只能将 ScriptManager 的一个实例添加到页面中 Code ascx
  • web2py数据库中的表示格式

    db define table person Field name format name s 这个格式在这里有什么作用 The format参数用于确定如何显示引用 person 表的其他表中的字段 例如 如果您定义 db define
  • 字符串在 Java 源代码中何时何地初始化/存储?

    这是我的源代码 public class Koray public static void main String args System out println This is a sample program 当我编译它时 我得到了字节
  • 如何在node.js中实现登录验证

    我有这个节点服务器正在运行 var server http createServer function request responsehttp if request method POST var body request on data
  • 如何测试类型是否是匿名的? [复制]

    这个问题在这里已经有答案了 我有以下方法将对象序列化为 HTML 标记 我只想在类型不是匿名的情况下执行此操作 private void MergeTypeDataToTag object typeData if typeData null
  • 从映射驱动器或共享文件夹运行 .NET 程序

    我编写了一个 C Windows 窗体应用程序 用于将一台计算机上的远程文件夹 源 文件夹是映射驱动器 Z folder 中的文件和文件夹与另一台计算机上的另一个远程文件夹 目标 合并文件夹是共享文件夹的 UNC 路径 computerna
  • 为什么我们总是喜欢在SQL语句中使用参数?

    我对数据库工作非常陌生 现在我可以写了SELECT UPDATE DELETE and INSERT命令 但我见过很多论坛 我们更喜欢这样写 SELECT empSalary from employee where salary salar
  • 如何将文件从远程服务器中的目录 A 移动到目录 B?

    我正在使用 JSch 连接到由 GWT 制作的网站中的 SFTP 我读过一个小例子sftpChannel get sftpChannel rename sftpChannel rm 但我没有找到从远程服务器复制文件的解决方案a目录到远程服务
  • 无法在此事件处理程序中执行操作

    我正在尝试从 DataGridView 中删除一行我使用两种类型的指令 A VouchersDGV Rows Clear B If Not DGV Rows RowIndex IsNewRow Then DGV Rows RemoveAt
  • Matlab 中的高效分类

    我有一张尺寸为 RGB 的图像uint8 576 720 3 我想将每个像素分类为一组颜色 我已经使用rgb2lab从RGB空间到LAB空间 然后删除L层 所以现在是double 576 720 2 由AB组成 现在 我想将其分类为我在另一
  • 总线错误排查

    我正在尝试反转字符串 这是我尝试过的代码 include
  • 编写 C++ 版本的代数游戏 24

    我正在尝试编写一个像游戏 24 一样工作的 C 程序 对于那些不知道如何玩的人 基本上你会尝试通过 四个代数运算符找到 4 个数字总计为 24 的任何方法 和括号 举个例子 假设有人输入 2 3 1 5 2 3 5 1 24 由于括号位置的
  • ADB 安装失败并显示 INSTALL_FAILED_TEST_ONLY

    我在将 apk 安装到我的设备时遇到问题 adb install lt apk gt 使用上述命令将返回以下内容 5413 KB s 99747 bytes in 0 017s pkg data local tmp AppClient Te
  • SQL 的扩展占位符,例如id 在哪里 (??)

    赏金更新 已经从马克那里得到了很好的答案 将 改编为 如下 然而 除了 DBIx 之外 我仍在寻找类似的方案 我只是想兼容anything 我需要有关我为参数化 SQL 语句中的 扩展 占位符选择的语法的建议 因为构建一些构造 IN 子句