Php SQL的扩展占位符,例如,(?)中的何处id
赏金更新:马克已经给出了一个很好的答案。改编:=改编成:,如下。然而,除了DBIx之外,我仍然在寻找类似的方案。我只是对与任何事物兼容感兴趣Php SQL的扩展占位符,例如,(?)中的何处id,php,sql,Php,Sql,赏金更新:马克已经给出了一个很好的答案。改编:=改编成:,如下。然而,除了DBIx之外,我仍然在寻找类似的方案。我只是对与任何事物兼容感兴趣 我需要关于我为参数化SQL语句中的“扩展”占位符选择的语法的建议。因为构建一些构造(在子句中)让我感到困扰,所以我决定使用一些语法快捷方式自动扩展到普通的?占位符。 我喜欢它们。但我想把它打包分发,我想问问自己,它们是否容易理解 基本上,我的新占位符是?和:?(枚举参数)和:&和:,和:(用于命名占位符)以及以下用例: -> db(" SELEC
我需要关于我为参数化SQL语句中的“扩展”占位符选择的语法的建议。因为构建一些构造(在子句中)让我感到困扰,所以我决定使用一些语法快捷方式自动扩展到普通的?占位符。
我喜欢它们。但我想把它打包分发,我想问问自己,它们是否容易理解 基本上,我的新占位符是
?
和:?
(枚举参数)和:&
和:,
和:
(用于命名占位符)以及以下用例:
-> db(" SELECT * FROM all WHERE id IN (??) ", [$a, $b, $c, $d, $e])
?
根据my 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值。它实际上对插入和???结合使用很有用,有时对in子句也很有用。但在这里,我已经想知道这种新语法是否合理,或者仅仅是一种误称,因为它混合了:和?人物。但不知何故,它似乎很好地匹配了语法模式
-> db(" UPDATE some SET :, WHERE :& AND (:|) ", $row, $keys, $or);
在这里,助记符:,
扩展为name=:name
对的列表,由,
逗号分隔。而:&
是一个列=:列列表,由和
s连接。对于奇偶校验,我添加了:|
。虽然:&在更新命令之外还有其他用例。但是我的问题不是关于有用性,而是如果:,和:&看起来是可以记住的
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
虽然我也添加了:
来插入一个:命名,:值,:列表
,非常像?
扩展到,?,?
。类似的用例,并且对于统一性来说是明智的
不管怎样,还有谁实施过这样的计划吗?不同的占位符?或者为了简单起见,你会推荐哪一种更新:我知道PHP Oracle OCI接口也可以绑定数组参数,但不使用特定的占位符。我正在寻找可比较的占位符语法。非常整洁!我认为占位符很好,只要你能很好地记录它们,并在分发时提供大量的例子。没关系,你发明了自己的占位符;毕竟,有人不得不考虑使用
?
。您可能希望避免使用:=
作为占位符,因为它已经在例如MySQL中
参见示例了解真实世界的用法。我喜欢你提案背后的基本思想,但不喜欢占位符的“命名”。我基本上有两个反对意见:
- 占位符以
或:
开头。您应该选择一个表单,以便可以立即识别占位符。我会选择?
,因为它与SQL的冲突较少,并且更常用于表示占位符?
- 占位符很难理解,也很难记住<代码>:&和
对我来说似乎是合理的,但是区分:|
、?
和:?
是相当困难的:
?
占位符和关联数组占位符?x
(x
可以是,
,和或
)
?
占位符:此占位符根据参数类型确定插入类型:
null => 'NULL'
'string' => 'string'
array('foo', 'bar') => ('foo','bar')
?x
占位符:数组中的每个元素都转换为`field`='value'
结构,并使用分隔符内爆。分隔符由x
组件指定:,
用逗号分隔,和用和和用或分隔
示例代码:
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类时的一些想法:
可能会出现一个明显的想法:为什么不对所有类型的数据使用?
,甚至是关联数组。仅另外添加?&
和?|
。在关联数组上使用?
与在当前设计中使用?,
相同。我没有这样做的原因是安全。通常需要将
中的数据插入查询(中?
)。但是由于HTML允许数组(form[array]
)表单控件也可以提交具有相同名称的关联数组。因此,我的查询合成器会将其识别为字段=>值列表。尽管这可能不会损害安全性,但会导致一个糟糕的SQL错误 如果你愿意花一些时间学习,那么你可以做一些令人惊奇的事情,比如:
$q = Doctrine_Query::create()
->select('u.id')
->from('User u')
->whereIn('u.id', array(1, 3, 4, 5));
echo $q->getSqlQuery();
什么会产生这样的查询:
SELECT
u.id AS u__id
FROM user u
WHERE u.id IN (?,
?,
?,
?)
这个例子取自:我想你对此花了很多心思,但是关于按分组、有和按顺序
子句和子查询呢?自定义格式如何,比如当您需要按日期分组而不包括时间部分时?对于需要额外配置的函数,比如COALESCE或任何使用OVER子句(假设支持)的函数呢?@OMG-Nah对此没有太多考虑。我已经专注于我最常用的用例。而具体的动态SQL还需要手工wo