PDOの中で、IN演算子を使う場合は、
典型的にはINに入る個数がいくつか不明の場合を想定します。
フォームでいえば、チェックボックスでチェックされているものが典型です。
そのため、プレースホルダーは、"(?,?,?)"のように、
複数個必要で、かつ個数不明のため動的に生成します。
動的に生成するための組み込み関数や構文はないので、
str_repeatを使って文字列の",?"を繰り返して生成します。
最後に、最初の","を取り除き、"()"で挟んであげれば出来上がりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // プリペアードステートメントの、プレースホルダ-に埋め込むデータ $names = array ( 'taro' , 'jiro' , 'saburo' ); // $namesの数だけ、PDOのプレースホルダーが必要 $placeholder_count = count ( $names ); // プレースホルダーは`?, ?, ?`の形式 $placeholders = str_repeat ( ',?' , $placeholder_count ); // 最初の`,`を取り除く $in = substr ( $placeholders , 1); //プリペアードステートメントの準備 $query = sprintf( 'select * from member where name in (%s)' , $in ); $statement = $pdo ->prepare( $query ); // プリペアードステートメントの各プレースホルダーに、$namesの値を最初から順番にセットする for ( $name_i = 0; $name_i < count ( $names ); $name_i ++){ //bindParamのindexは1始まり //PHPの通常の配列のindexに1を足してずれを解消 $param_i = $name_i + 1; // 値を設定 $statement ->bindParam( $param_i , $names [ $name_i ]); } |