使用可变数量的参数删除

时间:2013-10-13 18:49:44

标签: php sqlite pdo transactions

我想使用此查询的交易

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();

3 个答案:

答案 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数据库上使用这种方法主要是为了避免因查询/语句具有不同数量的参数而导致的“查询/语句缓存污染”。