Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP - Utilisation de PDO avec un tableau de clauses IN

PDO n'est pas bon avec de telles choses. Vous devez créer dynamiquement une chaîne avec des espaces réservés et l'insérer dans la requête, tout en liant les valeurs du tableau de la manière habituelle. Avec les espaces réservés de position, cela donnerait 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 espaces réservés dans la requête, vous pouvez utiliser l'approche suivante (le code est tiré de mon tutoriel PDO ):

Vous pouvez utiliser array_merge() pour joindre toutes les variables en un seul tableau, en ajoutant vos autres variables sous forme de tableaux, dans l'ordre dans lequel 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 espaces réservés nommés, le code serait un peu plus complexe, car vous devez créer une séquence d'espaces réservés nommés, par ex. :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 espaces réservés nommés, nous n'avons pas à suivre l'ordre strict, nous pouvons donc fusionner nos tableaux dans n'importe quel ordre.