Utilisation de PDO avec un tableau de clauses IN
Lors de l'utilisation de PDO pour des opérations de base de données, l'utilisation de tableaux dans la clause IN est couramment rencontrée. Cependant, des différences apparaissent dans l'approche des espaces réservés positionnels par rapport aux espaces réservés nommés.
Espaces réservés positionnels
Pour les espaces réservés positionnels, l'extrait de code suivant démontre une approche correcte :
$in_array = [1, 2, 3]; $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN ($in_values)"); $my_result->execute(); $my_results = $my_result->fetchAll();
Cependant, le code suivant utilisant des espaces réservés nommés produit des résultats :
$in_array = [1, 2, 3]; $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)"); $my_result->execute([':in_values' => $in_values]); $my_results = $my_result->fetchAll();
Ce code renverrait uniquement l'élément avec my_value égale au premier élément de $in_array (1).
Solution
PDO gère ces scénarios différemment. Pour résoudre ce problème, créez dynamiquement une chaîne avec des espaces réservés et insérez-la dans la requête tout en liant les valeurs du tableau comme d'habitude. Pour les espaces réservés positionnels :
$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();
Pour les espaces réservés nommés, une approche plus complexe est nécessaire car vous devez créer une séquence d'espaces réservés nommés, par ex. :id0,:id1,:id2.
// other parameters that are going into query $params = ["foo" => "foo", "bar" => "bar"]; $ids = [1,2,3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; $in_params[$key] = $item; } $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();
Cette approche permet de fusionner des tableaux dans n'importe quel ordre, contrairement aux espaces réservés positionnels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!