web-dev-qa-db-fra.com

Sélectionner plusieurs identifiants dans une table

Je veux sélectionner certains identifiants en fonction de la chaîne d'URL, mais avec mon code, il n'affiche que le premier. Si j'écris le manuel, cela fonctionne très bien.

J'ai une URL comme celle-ci http://www.mydomain.com/myfile.php?theurl=1,2,3,4,5 (ids)

Maintenant dans monfichier.php j'ai ma connexion sql et:

$ids = $_GET['theurl']; (and i am getting 1,2,3,4,5)

si j'utilise ceci:

$sql = "select * from info WHERE `id` IN (1,2,3,4,5)";
$slqtwo = mysql_query($sql);
while ($tc = mysql_fetch_assoc($slqtwo)) {
    echo $tc['a_name'];
    echo " - ";
}

J'obtiens les bons résultats. Maintenant, si j'utilise le code ci-dessous, cela ne fonctionne pas:

$sql = "select * from info WHERE `id` IN ('$ids')";
$slqtwo = mysql_query($sql);
while ($tc = mysql_fetch_assoc($slqtwo)) {
    echo $tc['a_name'];
    echo " - ";
}

Aucune suggestion?

13
Irene T.

Lorsque vous interpolez

"select * from info WHERE `id` IN ('$ids')"

avec vos identifiants, vous obtenez:

"select * from info WHERE `id` IN ('1,2,3,4,5')"

... qui traite votre ensemble d'ID comme une chaîne unique au lieu d'un ensemble d'entiers.

Débarrassez-vous des guillemets simples dans la clause IN, comme ceci:

"select * from info WHERE `id` IN ($ids)"

N'oubliez pas non plus que vous devez vérifier attaques par injection SQL. Votre code est actuellement très dangereux et risque de perdre ou d'accéder à de sérieuses données. Considérez ce qui pourrait se produire si quelqu'un appelle votre page Web avec l'URL suivante et que votre code leur permet d'exécuter plusieurs instructions dans une seule requête:

http://www.example.com/myfile.php?theurl=1);delete from info;-- 
36
Jeremy Smyth

Vous pouvez également essayer la fonction FIND_IN_SET ()

$SQL = "select * from info WHERE FIND_IN_SET(`id`, '$ids')"

[~ # ~] ou [~ # ~]

$SQL = "select * from info WHERE `id` IN ($ids)"
3
Saharsh Shah