PDO excelle dans l'exécution d'instructions avec des clauses IN lors de l'utilisation de tableaux pour leurs valeurs, comme illustré dans le code suivant :
$in_array = [1, 2, 3]; $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (?)"); $my_result->execute([$in_values]); $my_results = $my_result->fetchAll();
Cependant, le code suivant présente un comportement inattendu :
$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();
Au lieu de cela de renvoyer tous les éléments dont ma_valeur correspond aux valeurs dans $in_array, ce code renvoie uniquement l'élément dont ma_valeur correspond au premier élément de $in_array.
PDO n'est pas équipé pour gérer efficacement de tels scénarios. Pour utiliser des tableaux dans les clauses IN, nous devons générer dynamiquement une chaîne avec des espaces réservés et l'insérer dans la requête. Avec les espaces réservés positionnels, la solution est la suivante :
$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 cas avec plusieurs espaces réservés, envisagez d'utiliser array_merge(). Par exemple :
$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();
Dans les scénarios avec des espaces réservés nommés, le processus est plus complexe, car il implique de générer une séquence d'espaces réservés, par exemple :id0, :id1, :id2.
$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 id IN ($in)"; $stm = $db->prepare($sql); $stm->execute(array_merge($params, $in_params)); $data = $stm->fetchAll();
Heureusement, les espaces réservés nommés ne nécessitent pas d'ordre strict, ce qui permet la fusion de tableaux dans n'importe quel ordre.
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!