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
Libérer: 2024-12-28 01:37:09
original
394 Les gens l'ont consulté

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();
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal