Maison >développement back-end >tutoriel php >Comment utiliser correctement la clause IN de PDO avec des tableaux : espaces réservés positionnels ou nommés ?

Comment utiliser correctement la clause IN de PDO avec des tableaux : espaces réservés positionnels ou nommés ?

DDD
DDDoriginal
2024-12-28 01:37:09414parcourir

How to Correctly Use PDO's IN Clause with Arrays: Positional vs. Named Placeholders?

Utilisation de PDO avec un tableau de clauses IN

Lors de l'utilisation de PDO pour des opérations de base de données, l'utilisation de tableaux dans la clause IN est couramment rencontrée. Cependant, des différences apparaissent dans l'approche des espaces réservés positionnels par rapport aux espaces réservés nommés.

Espaces réservés positionnels

Pour les espaces réservés positionnels, l'extrait de code suivant démontre une approche correcte :

$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();
$my_results = $my_result->fetchAll();

Cependant, le code suivant utilisant des espaces réservés nommés produit des résultats :

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

Ce code renverrait uniquement l'élément avec my_value égale au premier élément de $in_array (1).

Solution

PDO gère ces scénarios différemment. Pour résoudre ce problème, créez dynamiquement une chaîne avec des espaces réservés et insérez-la dans la requête tout en liant les valeurs du tableau comme d'habitude. 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);
$data = $stm->fetchAll();

Pour les espaces réservés nommés, une approche plus complexe est nécessaire car vous devez créer une séquence d'espaces réservés nommés, par ex. :id0,:id1,:id2.

// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

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

Cette approche permet de fusionner des tableaux dans n'importe quel ordre, contrairement aux espaces réservés positionnels.

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