我想使用此查询的交易
DELETE FROM tbl WHERE id IN(?, ?, ?)
但是ID的数量是可变的。 有时我有2,有时5等。
我能否以不同方式重写它,以便接受包含所有ID的单个?
参数?
代码:
$pdo->beginTransaction();
$st = $pdo->prepare('DELETE FROM tbl WHERE id IN(?, ?, ?)');
foreach( ... ){
$st->execute(array($id1, $id2, $id3));
// but here I may have only 2 IDs to pass, or 5 etc.
}
$pdo->commit();
答案 0 :(得分:2)
您可以使用以下内容:
$questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?";
$query = "DELETE from `employee_customeraccount` WHERE `id` IN ($questionmarks)";
$st = $db->prepare($query);
答案 1 :(得分:1)
说到你提出的“XY问题”,
我能否以不同的方式重写它以便它接受一个?包含所有ID的参数?
没有
其中也没有什么意义 - 多次执行不是必须不惜一切代价追求的。
但是谈到你面临的真正的问题,
显然可能有两个解决方案。虽然像所有XY问题一样,你省略了最重要的细节,但我们只能猜测。比如,您可以保存所有ID,然后在循环之后但在提交之前立即删除所有ID。
或者每次只准备你的删除。没什么大不了的。
答案 2 :(得分:1)
使用固定数量的参数,例如DELETE FROM tbl WHERE id IN (?,?,?,?,?, ?,?,?,?,?)
中的10个参数。准备此查询并使用10个参数的部分重复执行:
for ($offset = 0; $offset < count($yourIdArray); $offset += 10) {
$params = array_slice($yourIdArray, $offset, 10);
if (count($params) < 10)
$params = array_pad($params, 10, $params[0]);
$st->execute(...);
}
最后一组参数只是由一个已经包含在数组中的ID填充(没有副作用)。
(注意:我没有PHP可用,也不是PHP人员。所以请将上面的内容作为伪代码。)
我不确定语句/查询中的分块参数的方法是否适用于Sqlite / PHP,我不希望它具有查询/语句缓存或查询/语句预处理的高成本。我自己在Oracle数据库上使用这种方法主要是为了避免因查询/语句具有不同数量的参数而导致的“查询/语句缓存污染”。