Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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 PDO加上“;哪里在;询问_Php_Pdo - Fatal编程技术网

Php PDO加上“;哪里在;询问

Php PDO加上“;哪里在;询问,php,pdo,Php,Pdo,我正在修改一些PHP代码以使用PDO访问数据库,但我遇到了一个“WHERE…IN”查询的问题 我正在尝试从数据库中删除一些内容,根据这些内容检查表单上的项目。列表的长度和内容会有所不同,但在本例中,假设是这样的: $idlist = '260,201,221,216,217,169,210,212,213'; 然后查询如下所示: $query = "DELETE from `foo` WHERE `id` IN (:idlist)"; $st = $db->prepare($query)

我正在修改一些PHP代码以使用PDO访问数据库,但我遇到了一个“WHERE…IN”查询的问题

我正在尝试从数据库中删除一些内容,根据这些内容检查表单上的项目。列表的长度和内容会有所不同,但在本例中,假设是这样的:

$idlist = '260,201,221,216,217,169,210,212,213';
然后查询如下所示:

$query = "DELETE from `foo` WHERE `id` IN (:idlist)";
$st = $db->prepare($query);
$st->execute(array(':idlist' => $idlist));
执行此操作时,仅删除第一个ID。(我想它会抛出逗号和后面的所有内容。)

我还尝试将
$idlist
设置为数组,但它不会删除任何内容


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

我将生成$idlist和数组,然后使用foreach在数组中循环以删除特定的项目

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

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` = ?");
$stmt->bindParam(1, $id);

foreach ($idlist as $item){
    $id = $item;
    $stmt->execute();
}

由于不能将值(数字)和控制流逻辑(逗号)与准备好的语句混合在一起,因此每个值需要一个占位符

$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)");

和循环来绑定参数。

这也可能有帮助:


可行的方法,但昂贵!将它保存在一个查询中会更好。实际上,使用一个准备好的语句是很好的。但正如前面提到的,太贵了。很好,谢谢。我是这样使用的:
内爆(',',str_split(str_repeat('?',count($idList)))或:
内爆(“,”,数组填充(0,计数($idList),“?”)(如果计数也必须为0),请参见@NathanLong solution:
提交时,我得到一个名为
$\u POST['foos']
的变量,它是所有复选框值的数组。然后://与数组项一样多的问号;最后一个不需要逗号($\u POST['foos'])-1)。"?"; $query=“从($questionmarks)中删除员工\客户帐户`WHERE
id
$st=$db->prepare($query)//每个问号都用数组$st->execute($\u POST['foos']);`它起作用了!@hakre提到的加->执行(数组_值($idlist));获取数字键,无论$idList来自何处。您不能在问题中添加解决方案。如果您认为这是一个更好的答案,请回答您自己的问题或建议对原始答案进行编辑。@phoneix这是一个很好的建议,但我上一次接触这个问题是在2010年,从那一年起就没有真正使用过PHP。如果您愿意,请随意编辑。
$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();