Valeurs de liaison pour l'instruction MySQL IN à l'aide de PDO
Dans PDO, la liaison des paramètres aux instructions IN peut être délicate. Lorsque vous utilisez un tableau de valeurs pour la clause IN, il est essentiel de garantir que les valeurs sont traitées comme des entités distinctes.
Le problème
L'exemple fourni démontre un problème commun Piège : lier une chaîne de valeurs séparées par des virgules à la clause IN. Cela entraîne l'exécution de l'instruction comme si les valeurs étaient une chaîne unique, et non des valeurs individuelles.
Solutions possibles
Il existe plusieurs façons de résoudre ce problème :
1. Construire manuellement la chaîne de requête
Comme suggéré dans la question en double, vous pouvez construire manuellement la chaîne de requête avec les valeurs individuelles incluses dans la clause IN. Cette approche offre de la flexibilité, mais elle n'est réalisable que pour les petits tableaux statiques.
2. Utilisez la fonction find_in_set()
La fonction find_in_set() peut être utilisée pour rechercher une valeur dans une liste séparée par des virgules. Cela vous permet de lier la liste sous forme de chaîne et d'utiliser find_in_set() pour vérifier les valeurs individuelles. Cependant, cette approche peut avoir des implications en termes de performances pour les grands ensembles de données.
3. Créer une fonction définie par l'utilisateur
Une fonction personnalisée définie par l'utilisateur peut être créée pour diviser la chaîne séparée par des virgules en valeurs individuelles. Cette fonction peut ensuite être utilisée dans le cadre de la clause IN. Cette méthode fournit la solution la plus efficace et la plus flexible.
Exemple d'utilisation d'une fonction définie par l'utilisateur
// Create a UDF to split a comma-separated string CREATE FUNCTION split_ids(s VARCHAR(255)) RETURNS VARCHAR(255) BEGIN DECLARE t VARCHAR(255); DECLARE pos INT DEFAULT 1; DECLARE delim CHAR(1) DEFAULT ','; SET t = ''; WHILE pos > 0 DO SET pos = INSTR(s, delim); IF pos > 0 THEN SET t = CONCAT(t, SUBSTRING(s, 1, pos - 1)); SET s = SUBSTRING(s, pos + 1); END IF; END WHILE; SET t = CONCAT(t, s); RETURN t; END; // Example query using the UDF $products = implode(',', $values); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products.id IN (split_ids(:products))"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':products', $products);
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!