我很想知道是否可以使用pdo将值数组绑定到占位符。这里的用例试图传递一个值数组,以便与 IN()
条件。
我希望能够做到这样:
<?php
$ids=array(1,2,3,7,8,9);
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN(:an_array)'
);
$stmt->bindParam('an_array',$ids);
$stmt->execute();
?>
让pdo绑定并引用数组中的所有值。
目前我正在做:
<?php
$ids = array(1,2,3,7,8,9);
$db = new PDO(...);
foreach($ids as &$val)
$val=$db->quote($val); //iterate through array and quote
$in = implode(',',$ids); //create comma separated list
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN('.$in.')'
);
$stmt->execute();
?>
这当然可以,但只是想知道是否有一个内置的解决方案,我错过了?
21条答案
按热度按时间5gfr0r5j16#
查看pdo:predefined常量没有pdo::param\u数组,正如pdostatement->bindparam中列出的那样
bool pdostatement::bindparam(mixed$参数,mixed&$variable[,int$数据类型[,int$长度[,mixed$驱动程序选项]])
所以我认为这是不可能实现的。
qnakjoqk17#
我也意识到这个线程是旧的,但我有一个独特的问题,在转换即将被弃用的mysql驱动程序到pdo驱动程序时,我不得不做一个函数,可以动态地从同一个param数组构建普通参数和ins。所以我很快就做了这个:
它仍然未经测试,但逻辑似乎存在。
希望它能帮助同一职位的人,
编辑:经过测试我发现:
pdo不喜欢他们名字里的“.”(如果你问我这有点愚蠢)
bindparam是错误的函数,bindvalue是正确的函数。
代码已编辑为工作版本。
w6lpcovy18#
关于施奈尔密码的一点编辑
3npbholx19#
据我所知,不可能将数组绑定到pdo语句中。
但存在两种常见的解决方案:
使用位置占位符(?,?,?)或命名占位符(:id1,:id2,:id3)
$where=内爆(',',数组填充(0,count($ids),'?');
引用前面的数组
$where=array\u map(数组($db,'quote'),$ids);
两种选择都是好的和安全的。我更喜欢第二个,因为它比较短,如果需要,我可以转储参数。使用占位符,您必须绑定值,最终您的sql代码将是相同的。
最后一个对我来说很重要的问题是避免错误“绑定变量的数量与令牌的数量不匹配”
这是使用位置占位符的一个很好的例子,只是因为它对传入的参数有内部控制。
yh2wf1be20#
我扩展了pdo,做了一些类似于stefs建议的事情,从长远来看对我来说更容易:
你可以这样使用它:
m1m5dgzv21#
以下是我的解决方案:
注意数组值的使用。这可以解决关键的订购问题。
我正在合并ID数组,然后删除重复项。我有点像:
这是失败的。