2

ID 番号の配列を取り、その ID 番号ですべての行を更新しようとしています。PHP PDO コードは次のとおりです。

private function markAsDelivered($ids) {
  $update = $this->dbh->prepare("
     UPDATE notifications
     SET notified = 1
     WHERE notification_id IN (
        :ids
     )
  ");
  $ids = join(',', $ids);
  Logger::log("Marking the following as delivered: " . $ids, $this->dbh);
  $update->bindParam(":ids", $ids, PDO::PARAM_STR);
  $update->execute();
}

ただし、これを実行すると、複数の ID 番号がログに記録されているにもかかわらず、リストの最初の項目のみが更新されます。これを変更して複数の行を更新するにはどうすればよいですか?

4

1 に答える 1

6

プレースホルダーは、単一のアトミック値のみを表すことができます。これが機能する理由は、mysql が認識する値が '123,456' の形式であるためです。これは整数として解釈されますが、数値以外の部分 (コンマ) が検出されると残りの文字列は破棄されます。

代わりに、次のようなことをしてください

$list = join(',', array_fill(0, count($ids), '?'));
echo $sql = "...where notification_id IN ($list)";
$this->dbh->prepare($sql)->execute(array_values($ids));
于 2012-05-12T02:47:24.110 に答える