L'AOP n'est pas doué pour ce genre de choses. Vous devez créer une chaîne avec des placeholders de façon dynamique et l'insérer dans la requête, tout en liant les valeurs du tableau de la façon habituelle. Avec des placeholders positionnels, ce serait comme ceci :
$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();
S'il y a d'autres caractères de remplacement dans la requête, vous pouvez utiliser l'approche suivante (le code est tiré de mon site web) Tutoriel PDO ):
Vous pourriez utiliser array_merge()
pour réunir toutes les variables en un seul tableau, en ajoutant vos autres variables sous forme de tableaux, dans l'ordre où elles apparaissent dans votre requête :
$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();
Si vous utilisez des caractères de remplacement nommés, le code sera un peu plus complexe, car vous devrez créer une séquence de caractères de remplacement nommés, par exemple. :id0,:id1,:id2
. Donc le code serait :
// 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();
Heureusement, pour les placeholders nommés, nous n'avons pas à suivre l'ordre strict, nous pouvons donc fusionner nos tableaux dans n'importe quel ordre.