Php PDO加上“;哪里在;询问
我正在修改一些PHP代码以使用PDO访问数据库,但我遇到了一个“WHERE…IN”查询的问题 我正在尝试从数据库中删除一些内容,根据这些内容检查表单上的项目。列表的长度和内容会有所不同,但在本例中,假设是这样的: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)
$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)中删除员工\客户帐户`WHEREid
$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();