Valeurs de liaison PDO pour l'instruction MySQL IN
Lorsque vous travaillez avec PDO, la liaison d'un tableau de valeurs à une instruction MySQL IN peut entraîner des erreurs inattendues. comportement. Par défaut, PDO traitera les valeurs liées comme une seule chaîne, ce qui entraînera une requête qui utilise l'instruction IN sur la chaîne entière plutôt que sur les valeurs individuelles.
Problème :
Pour illustrer le problème, considérons le code suivant :
// Array of values $values = array(1, 2, 3, 4, 5, 6, 7, 8); // Database-safe variable $products = implode(',', $values); // PDO statement $stmt = $conn->prepare("SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (:products)"); // Bind the values $stmt->bindParam(':products', $products);
Dans ce cas, la requête résultante sera be :
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN ('1,2,3,4,5,6,7,8')
Cette requête traitera effectivement la chaîne entière comme une seule condition, ce qui n'est pas le comportement prévu.
Solution :
Pour résoudre ce problème, plusieurs options sont disponibles :
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE find_in_set(cast(products.id as char), :products)
Cette approche nécessite de convertir les valeurs en un type de caractère, ce qui peut avoir un impact sur les performances des grands ensembles de données.
Remarques supplémentaires :
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!