Utilisation de PDO avec un tableau de clauses IN
Lorsque vous utilisez PDO pour exécuter une instruction avec une clause IN qui utilise un tableau pour ses valeurs, vous peut rencontrer un comportement inattendu. Cet article explique pourquoi une approche spécifique ne fonctionne pas et propose des solutions alternatives.
Exemple :
$in_array = 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();
Ce code fonctionne comme prévu. Cependant, si vous essayez d'utiliser des paramètres nommés avec une clause IN, le code suivant ne le fera pas :
$in_array = 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(array(':in_values' => $in_values)); $my_results = $my_result->fetchAll();
Explication :
PDO a des difficultés à gérer les clauses IN avec tableaux. Au lieu de cela, vous devez créer une chaîne avec des espaces réservés et l'insérer dans la requête, en liant les valeurs du tableau de la manière habituelle.
Alternatives :
Utilisation de la position Espaces réservés
Créez dynamiquement une chaîne avec des espaces réservés et insérez-la dans le requête :
$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();
Utilisation d'espaces réservés nommés
Vous pouvez utiliser la fonction array_merge() pour joindre toutes les variables dans un seul tableau, y compris les espaces réservés nommés :
// Other parameters that are going into query $params = ["foo" => "foo", "bar" => "bar"]; $ids = [1, 2, 3]; $in = ""; $i = 0; // Using an external counter because 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();
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!