获取受多次删除影响的行数


Get the number of rows affected by multiple delete

当我在PDO中删除多行时,我如何获得受影响行数的计数?这是我用来删除多行的技术:

$selected = $_POST['checkbox'];
    $N = count($selected);
    for ($i = 0; $i < $N; $i++) {
        $result = $dbh->prepare('DELETE FROM users WHERE id= :id');
        $result->bindParam(':id', $selected[$i], PDO::PARAM_INT);
        $result->execute();
    }

我试过了,但它总是返回1:

$deleted = $result->rowCount();
    if ($deleted) {
        echo $deleted.' was deleted.';
    }

你正在运行一个循环,所以每次调用都删除1;你需要添加一个计数器。

添加:

 $deleted += $result->rowCount();

循环内

,然后在外面:

if ($deleted) {
        echo $deleted.' was deleted.';
    }

如果id字段是唯一的,那么该语句最多只能影响1行。然而,您正在准备一个新语句并在循环中执行它。你应该试着把你删除的次数加起来。

$deleted = 0;
for ($i = 0; $i < $N; $i++) {
    $result = $dbh->prepare('DELETE FROM users WHERE id= :id');
    $result->bindParam(':id', $selected[$i], PDO::PARAM_INT);
    $result->execute();
    $deleted = $deleted + $result->rowCount();
}
echo $deleted.' was deleted.';

这里有一种方法可以在一次删除中完成,而不是运行多次删除。这样,rowCount()将显示删除的实际结果。

$selected = $_POST['checkbox'];
$placeholder = array();
$values = array();
foreach ($selected as $id) {
  $placeholder[] = ":".$id;
  $values[":".$id] = $id;
}

$sql = "Delete FROM users WHERE id IN (".implode(', ',$placeholder).") ";
$result = $dbh->prepare($sql);
$result->execute($values);
$deleted = $result->rowCount();
if ($deleted>0) {
    echo $deleted.' was deleted.';
}