Lors de l'utilisation de PDO pour exécuter une instruction avec une clause IN qui utilise un tableau pour ses valeurs, pourquoi ce code renvoie-t-il un message inattendu résultat :
$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));
PDO a des difficultés à traiter les clauses IN qui utilisent des espaces réservés pour un tableau de valeurs. Pour résoudre ce problème, vous devez créer dynamiquement une chaîne d'espaces réservés et l'insérer dans la requête, tout en liant les valeurs du tableau séparément.
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);
Pour les espaces réservés nommés :
// collect parameters for query $params = ["foo" => "foo", "bar" => "bar"]; // prepare IN clause placeholders and values $ids = [1,2,3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; $in_params[$key] = $item; } // construct query and execute $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));
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!