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
Barbara Streisandoriginal
2024-12-19 19:45:19413parcourir

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

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

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

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

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

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!

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