Maison >développement back-end >tutoriel php >Pourquoi PDO renvoie-t-il des résultats inattendus lors de l'utilisation d'une clause IN avec un tableau d'espaces réservés ?

Pourquoi PDO renvoie-t-il des résultats inattendus lors de l'utilisation d'une clause IN avec un tableau d'espaces réservés ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 08:31:131046parcourir

Why Does PDO Return Unexpected Results When Using an IN Clause with an Array of Placeholders?

Utilisation de PDO avec un tableau de clauses IN [duplicata]

Question :

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));

Réponse :

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!

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