2010-05-11 10 views
4

Je veux écrire une déclaration MySQL comme:?PHP PDO MySQL (,,

SELECT * FROM someTable WHERE someId IN (value1, value2, value3, ...) 

L'astuce ici est que je ne sais pas à l'avance combien de valeurs, il y aura dans le IN().

Évidemment, je sais que je peux générer la requête sur la route avec des manipulations de cordes, mais puisque cela se déroulera dans une boucle, je me demandais si je pouvais le faire avec un AOP PreparedStatement.

Quelque chose comme :

$query = $PDO->prepare('SELECT * FROM someTable WHERE someId IN (:idList)'); 
$query->bindValue(':idList', implode(',', $idArray)); 

Est-ce possible?

+0

avez-vous essayé? – Jayrox

Répondre

-1
$sql = 'SELECT * FROM someTABLE WHERE someID IN(:ids)'; 
$sth = $PDO->prepare($sql); 
$sth->execute(array(':ids' => implode(',', $idArray))); 

$rows = $sth->fetchAll(); 
+0

Est-ce que cela fonctionne réellement? Cela semble aller à l'encontre de la réponse acceptée. – Greg

6

Ce n'est pas possible comme vous l'essayez. Vous devez avoir un espace réservé séparé pour chaque paramètre que vous voulez passer, tout le reste défierait le but des paramètres (qui sépare le code des données).

$ids = array(2, 4, 6, 8); 

// prepare a string that contains ":id_0,..,:id_n" and include it in the SQL 
$plist = ':id_'.implode(',:id_', array_keys($ids)); 
$sql = "SELECT * FROM someTable WHERE someId IN ($plist)"; 
// prepare & execute the actual statement 
$parms = array_combine(explode(",", $plist), $ids); 
$stmt = $PDO->prepare($sql); 
$rows = $stmt->execute($parms); 

Si vous avez été autorisé à passer dans un tableau de valeurs à un seul paramètre lors de bind, vous serait effectivement autorisé à modifier l'instruction SQL. Ce serait une faille pour l'injection SQL - rien ne pourrait garantir que toutes les valeurs de tableau seraient des entiers innocents, après tout.

+0

En fait, cela semble fonctionner. Faire IN (: idList) –

+0

@nute: Eh bien, si cela fonctionne ... Peut-être que PDO a une fonction spéciale pour cela (je ne sais pas). Je recommande de lire attentivement la documentation sur ce sujet, car il s'agit vraiment d'un point d'entrée potentiel pour l'injection SQL s'il y a moins de paramètres définis que des bits de données que vous avez ajoutés. – Tomalak