带有"WHERE ... IN"查询的PDO

Nat*_*ong 20 php pdo

我正在修改一些PHP代码以使用PDO进行数据库访问,但我遇到了"WHERE ... IN"查询的问题.

我试图从数据库中删除一些东西,根据表格上的哪些项目进行检查.列表的长度和内容会有所不同,但是对于这个例子,想象一下:

$idlist = '260,201,221,216,217,169,210,212,213';
Run Code Online (Sandbox Code Playgroud)

然后查询如下所示:

$query = "DELETE from `foo` WHERE `id` IN (:idlist)";
$st = $db->prepare($query);
$st->execute(array(':idlist' => $idlist));
Run Code Online (Sandbox Code Playgroud)

当我这样做时,只删除第一个ID.(我假设它抛出了逗号和之后的所有内容.)

我也试过制作$idlist一个数组,但它不删除任何东西.

在PDO准备好的声明中使用项目列表的正确方法是什么?

edo*_*ian 31

由于您不能将值(数字)与控制流逻辑(逗号)与预准备语句混合使用,因此每个值需要一个占位符.

$idlist = array('260','201','221','216','217','169','210','212','213');

$questionmarks = str_repeat("?,", count($idlist)-1) . "?";

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` IN ($questionmarks)");
Run Code Online (Sandbox Code Playgroud)

和循环来绑定参数.

  • 或者:`implode(',',array_fill(0,count($ idList),'?'));`(如果count> 0对于答案也是必需的),请参阅[`array_fill`](http: //php.net/array_fill),[`str_repeat`](http://php.net/str_repeat) (8认同)
  • 很好,谢谢.我这样使用它:`implode(',',str_split(str_repeat('?',count($ idList))));` (2认同)

Iva*_* P. 8

这也可能有帮助:

https://phpdelusions.net/pdo#in

$arr = [1,2,3];
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($arr);
$data = $stm->fetchAll();
Run Code Online (Sandbox Code Playgroud)