Maison >développement back-end >tutoriel php >Pourquoi la clause IN de PDO ne fonctionne-t-elle pas avec les paramètres du tableau et comment puis-je y remédier ?

Pourquoi la clause IN de PDO ne fonctionne-t-elle pas avec les paramètres du tableau et comment puis-je y remédier ?

DDD
DDDoriginal
2024-12-26 14:17:09844parcourir

Why Doesn't PDO's IN Clause Work with Array Parameters, and How Can I Fix It?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn