Valeurs de liaison PDO pour l'instruction MySQL IN
Vous êtes confronté à un problème lorsque vous utilisez PDO pour lier un tableau de valeurs à un MySQL IN déclaration. Votre objectif est d'exécuter la requête comme suit :
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (1,2,3,4,5,6,7,8)
Cependant, PDO convertit les valeurs liées en une chaîne séparée par des virgules, ce qui entraîne la requête erronée suivante :
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN ('1,2,3,4,5,6,7,8')
Vous avez essayé d'utiliser une fonction personnalisée pour diviser la chaîne séparée par des virgules dans la requête elle-même, mais ce n'est pas une solution optimale. solution.
Solution 1 : Construire la requête manuellement
Comme suggéré dans une question précédente, vous pouvez construire manuellement la requête en concaténant les espaces réservés pour chaque valeur de la clause IN. Par exemple :
$products = array(1,2,3,4,5,6,7,8); $placeholders = array_fill(0, count($products), '?'); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (" . implode(',', $placeholders) . ")"; $stmt = $pdo->prepare($sql); $stmt->execute($products);
Solution 2 : Utilisation de find_in_set()
Vous pouvez utiliser la fonction find_in_set() pour faire correspondre une valeur à une chaîne séparée par des virgules. Cependant, cette approche peut présenter des problèmes de performances avec des ensembles de données volumineux, car elle nécessite de convertir chaque valeur du tableau en un type de caractère.
$products = array(1,2,3,4,5,6,7,8); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE find_in_set(cast(products.id as char), '" . implode(',', $products) . "') > 0"; $stmt = $pdo->prepare($sql); $stmt->execute();
Solution 3 : Création d'une fonction définie par l'utilisateur
La meilleure solution est de créer une fonction définie par l'utilisateur (UDF) qui divise la chaîne séparée par des virgules. Il s'agit d'une solution relativement complexe, mais elle offre les meilleures performances pour les clauses IN avec des listes de taille variable.
Reportez-vous au lien fourni pour obtenir des instructions sur la création de l'UDF.
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!