Developer

【PHP応用】PDO⑮ INを使用する場合
2021.09.30
Lv2

【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]);
}

PHPWEBプログラミング講座 連載目次リンク

PHPWEBプログラミング講座 連載目次