Maison >développement back-end >tutoriel php >Comment lier correctement les valeurs d'un tableau à une instruction MySQL IN à l'aide de PDO ?

Comment lier correctement les valeurs d'un tableau à une instruction MySQL IN à l'aide de PDO ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-04 22:27:11591parcourir

How to Properly Bind Array Values to a MySQL IN Statement Using PDO?

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!

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