PDOはそのようなことには向いていません。通常の方法で配列値をバインドしながら、プレースホルダーを使用して文字列を動的に作成し、クエリに挿入する必要があります。位置プレースホルダーを使用すると、次のようになります。
$in = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();
クエリに他のプレースホルダーがある場合は、次のアプローチを使用できます(コードは私のPDOチュートリアルから取得されます ):
array_merge()
を使用できます すべての変数を単一の配列に結合し、クエリに表示される順序で他の変数を配列の形式で追加する関数:
$arr = [1,2,3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();
名前付きプレースホルダーを使用している場合、名前付きプレースホルダーのシーケンスを作成する必要があるため、コードは少し複雑になります。 :id0,:id1,:id2
。したがって、コードは次のようになります。
// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];
$ids = [1,2,3];
$in = "";
$i = 0; // we are using an external counter
// because the actual array keys could be dangerous
foreach ($ids as $item)
{
$key = ":id".$i++;
$in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
$in_params[$key] = $item; // collecting values into a key-value array
}
$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();
幸い、名前付きプレースホルダーの場合、厳密な順序に従う必要がないため、配列を任意の順序でマージできます。