2021.09.30
【PHP応用】PDO⑮ INを使用する場合
PDOの中で、IN演算子を使う場合は、
典型的にはINに入る個数がいくつか不明の場合を想定します。
フォームでいえば、チェックボックスでチェックされているものが典型です。
そのため、プレースホルダーは、"(?,?,?)"のように、
複数個必要で、かつ個数不明のため動的に生成します。
動的に生成するための組み込み関数や構文はないので、
str_repeatを使って文字列の",?"を繰り返して生成します。
最後に、最初の","を取り除き、"()"で挟んであげれば出来上がりです。
// プリペアードステートメントの、プレースホルダ-に埋め込むデータ $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]); }