Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL的扩展占位符,例如,(?)中的何处id_Php_Sql - Fatal编程技术网

Php SQL的扩展占位符,例如,(?)中的何处id

Php SQL的扩展占位符,例如,(?)中的何处id,php,sql,Php,Sql,赏金更新:马克已经给出了一个很好的答案。改编:=改编成:,如下。然而,除了DBIx之外,我仍然在寻找类似的方案。我只是对与任何事物兼容感兴趣 我需要关于我为参数化SQL语句中的“扩展”占位符选择的语法的建议。因为构建一些构造(在子句中)让我感到困扰,所以我决定使用一些语法快捷方式自动扩展到普通的?占位符。 我喜欢它们。但我想把它打包分发,我想问问自己,它们是否容易理解 基本上,我的新占位符是?和:?(枚举参数)和:&和:,和:(用于命名占位符)以及以下用例: -> db(" SELEC

赏金更新:马克已经给出了一个很好的答案。改编:=改编成:,如下。然而,除了DBIx之外,我仍然在寻找类似的方案。我只是对与任何事物兼容感兴趣


我需要关于我为参数化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的冲突较少,并且更常用于表示占位符
  • 占位符很难理解,也很难记住<代码>:&和
    :|
    对我来说似乎是合理的,但是区分
    :?
    是相当困难的
我更改了我的设置,以支持更多的占位符并变得更智能:(自述文件中关于占位符的部分不适用于此类。它仅适用于普通类。)

DB类有两种占位符:多功能的
占位符和关联数组占位符
?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