Maison > développement back-end > tutoriel php > Comment puis-je utiliser efficacement la clause IN de PDO avec des tableaux en PHP ?

Comment puis-je utiliser efficacement la clause IN de PDO avec des tableaux en PHP ?

Barbara Streisand
Libérer: 2024-12-19 19:45:19
original
351 Les gens l'ont consulté

How Can I Effectively Use PDO's IN Clause with Arrays in PHP?

PHP - Utilisation de PDO avec un tableau de clauses IN

PDO excelle dans l'exécution d'instructions avec des clauses IN lors de l'utilisation de tableaux pour leurs valeurs, comme illustré dans le code suivant :

$in_array = [1, 2, 3];
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (?)");
$my_result->execute([$in_values]);
$my_results = $my_result->fetchAll();
Copier après la connexion

Cependant, le code suivant présente un comportement inattendu :

$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

Au lieu de cela de renvoyer tous les éléments dont ma_valeur correspond aux valeurs dans $in_array, ce code renvoie uniquement l'élément dont ma_valeur correspond au premier élément de $in_array.

PDO n'est pas équipé pour gérer efficacement de tels scénarios. Pour utiliser des tableaux dans les clauses IN, nous devons générer dynamiquement une chaîne avec des espaces réservés et l'insérer dans la requête. Avec les espaces réservés positionnels, la solution est la suivante :

$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 cas avec plusieurs espaces réservés, envisagez d'utiliser array_merge(). Par exemple :

$arr = [1, 2, 3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();
Copier après la connexion

Dans les scénarios avec des espaces réservés nommés, le processus est plus complexe, car il implique de générer une séquence d'espaces réservés, par exemple :id0, :id1, :id2.

$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 id IN ($in)";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params, $in_params));
$data = $stm->fetchAll();
Copier après la connexion

Heureusement, les espaces réservés nommés ne nécessitent pas d'ordre strict, ce qui permet la fusion de tableaux dans n'importe quel ordre.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal