2009-11-04 3 views
2

Existe-t-il un moyen de sélectionner plusieurs valeurs avec des instructions préparées dans (My-) SQL?Plusieurs valeurs dans where avec les instructions SQL préparées?

Je suis en train de sélectionner quelques lignes d'une table avec le mot-clé IN, quelque chose comme:

SELECT * 
    FROM table 
where id IN (1, 2, 3) 

Le « 1, 2, 3 » devrait être adopté en tant que paramètre de l'instruction . Est-ce possible avec PHP/PDO ou dois-je concaténer les valeurs et les insérer directement dans la déclaration (j'ai un mauvais pressentiment à cause des injections).

+0

Je pense que la réponse est ici: [stackoverflow.com/MySQL Instructions préparées avec une liste de variables de taille variable] (http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable- size-variable-list) – manji

Répondre

1

Si vous avez un tableau de « quelque chose » qui vient de l'utilisateur, vous pouvez créer une liste des espaces réservés avec array_fill, générer une chaîne comme "?, ?, ?, ..." en appelant implode sur le tableau. Vous pouvez également vous assurer que tout ce qui est dans le tableau est un nombre entier (en utilisant intval, par exemple) et l'utiliser directement pour créer la requête.

-1

Essayez vous passer dans la liste en tant que chaîne aconcatenated et le faire (pas très performant, mais il devrait fonctionner: Je crois avoir vu une réponse de Joel Spolsky en utilisant quelque part cette technique):

SELECT * FROM table where concat('|',id,'|') like '%|1|2|3|%' 
+0

Je suis tenté de voter -1 ... :( –

+0

-1 Une idée épouvantable Aucune recommandation de Joel Que faire si vos valeurs | 1 | 2 | 3 | sont dynamiques? –

+0

now I ' Je l'ai trouvé - il a eu 28 upvotes pour ça! http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause/337817#337817 – davek

0

Je passe dans un tableau d'entiers, puis faites String.Join pour les rassembler dans votre instruction préparée. Vous ne pouvez rien injecter dans un nombre entier!

Questions connexes