$sql = 'DELETE FROM tablename WHERE ';
  $j=count($_POST['chk']);
    for ($i=0; $i < $j; $i++) { if ($i === 0 ) { $sql .= ' id=? '; }else{ $sql .= ' OR id=? '; } } $sth = $dbh -> prepare($sql);
  
    $i=1;
    foreach ($_POST['chk'] as $chk) {
      $id = (int)$chk;
      $sth -> bindValue($i, $id, PDO::PARAM_INT);
      $i++;
    }
   
    $sth -> execute(); 
 

SQLのexecute()をループの中に書くべきではない。
複数のバインドを行ってから一回のexecuteを実行するべき

 


INSERTの場合

$colum_name = array("sei","mei","sei_kn","mei_kn","ybn","pref","city","addr","tel","mail");
$key_array = array('姓','名','セイ','メイ','〒','都道府県','市町村','以降の住所','TEL','メール');
$cname='';$cvalues='';
foreach ($colum_name as $v) {
$cname .= $v .',';
$cvalues .= ':' . $v .',' ;
}
$cname= rtrim($cname,',') ;
$cvalues = rtrim($cvalues,',');
//$sql="INSERT INTO kokyak( $cname ) VALUES (?,?,?,?,?,?,?,?,?,?) ";
$sql="INSERT INTO kokyak( $cname ) VALUES ( $cvalues ) ";
echo $sql .PHP_EOL;
$sth = $dbh->prepare($sql);
$dbh->beginTransaction();//トランザクション処理を開始 
try {
// bindValueは値をバインドします。
// bindParamは変数をバインドします。評価は実行時です。
foreach ($colum_name as $k => $v) {
$sth->bindValue(":$v", "{$post_hash[$key_array[$k]]}", PDO::PARAM_STR);

}
$sth->execute();