0

我想在这个查询中使用事务

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

3 回答 3

2

你可以使用这样的东西:

$questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?";    
$query = "DELETE from `employee_customeraccount` WHERE `id` IN ($questionmarks)";
$st = $db->prepare($query);
于 2013-10-13T18:52:46.723 回答
1

说到你问的“XY问题”,

我可以用不同的方式重写它以便它接受一个吗?包含所有 ID 的参数?

不。

它也没有什么意义 - 多次执行不是必须不惜一切代价追求的事情。

但说到你面临的真正问题,

显然可能有一两个解决方案。虽然,就像所有 XY 询问者一样,您忽略了最重要的细节,但我们只能猜测。比如说,你可以保存所有的 id,然后在循环之后但在提交之前一次删除它们。

或者每次都准备删除。没有大碍。

于 2013-10-13T19:19:25.163 回答
1

使用固定数量的参数,例如 10 in DELETE FROM tbl WHERE id IN (?,?,?,?,?, ?,?,?,?,?)。准备此查询并使用 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 数据库上使用了这种方法,主要是为了避免“查询/语句缓存污染”,这是由于查询/语句具有不同数量的参数而导致的。

于 2013-10-16T05:33:28.453 回答