Requete préparée + WHERE IN / OR = la galère
Résolu/Fermé
A voir également:
- Requete préparée + WHERE IN / OR = la galère
- Reboot and select proper boot device or insert boot media in selected boot device and press a key - Forum Windows
- In da place - Forum Mail
- Light in the box problème ✓ - Forum Consommation & Internet
- No such file or directory ✓ - Forum Linux / Unix
- Av in - Forum Audio
2 réponses
jordane45
Messages postés
38138
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 avril 2024
4 649
Modifié le 22 mai 2018 à 11:42
Modifié le 22 mai 2018 à 11:42
Bonjour,
Déjà... n'oublie pas d'activer la gestion des erreurs PDO.
(et de mettre ta requête dans un try/catch )
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
Ensuite, concernant ton IN ... soit je mettrai directement les valeurs dans la chaine sql
Soit j'essaierai de mettre chaque valeur dans un array de data
Déjà... n'oublie pas d'activer la gestion des erreurs PDO.
(et de mettre ta requête dans un try/catch )
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
Ensuite, concernant ton IN ... soit je mettrai directement les valeurs dans la chaine sql
$keywords = explode(',', $tags); $in = join("','", $keywords); $sql = "SELECT tag_id FROM tag_list WHERE tag_name IN ('".$in."')" $req = $DB->query( $sql , NULL);
Soit j'essaierai de mettre chaque valeur dans un array de data
$keywords = explode(',', $tags); $tmpDatas = array(); $datas = array(); $i = 0; foreach($keywords as $D){ $i++; $tmpDatas[] = ':tag'.$i; $datas[':tag'.$i] = $D; } $in = join(',' , $tmpDatas); $sql = "SELECT tag_id FROM tag_list WHERE tag_name IN (".$in.")" $req = $DB->query( $sql , $datas);
Salut jordane,
Tout simplement génial, la deuxième solution marche du tonerre, j'ai bien fait de demander car j'aurais jamais pu trouver ça tout seul !
Par contre j'ai remarqué un truc assez embêtant si il y a un espace entre un tags et une virgule exemple : tag1 , tag2,tag3 seul le premier tag et le troisieme tag seront pris en compte.
Est ce possible d'avoir les saisie :< tag1,tag2,tag3> et <tag1 , tag2 , tag3> correct ?
bonjour le père, bien vu en effet les saisies viennent majoritairement des utilisateurs , c'est pour cette raison que je voulais absolument faire une requete préparé afin d'eviter les injections !
Tout simplement génial, la deuxième solution marche du tonerre, j'ai bien fait de demander car j'aurais jamais pu trouver ça tout seul !
Par contre j'ai remarqué un truc assez embêtant si il y a un espace entre un tags et une virgule exemple : tag1 , tag2,tag3 seul le premier tag et le troisieme tag seront pris en compte.
Est ce possible d'avoir les saisie :< tag1,tag2,tag3> et <tag1 , tag2 , tag3> correct ?
bonjour le père, bien vu en effet les saisies viennent majoritairement des utilisateurs , c'est pour cette raison que je voulais absolument faire une requete préparé afin d'eviter les injections !
jordane45
Messages postés
38138
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 avril 2024
4 649
22 mai 2018 à 13:54
22 mai 2018 à 13:54
Il te suffit de faire des "trim" pour virer les espaces superflus.
foreach($keywords as $D){ $i++; $tmpDatas[] = ':tag'.$i; $datas[':tag'.$i] = trim($D); }
22 mai 2018 à 11:26
La première méthode proposée par Jordane (que je salue au passage) est à proscrire si tes $keywords viennent d'une saisie de l'utilisateur. Les données ne sont pas échappées, que va-t-il se passer si elles contiennent des apostrophes ?
Et pour la seconde méthode, ce serait plus logique d'initialiser $tmpDatas= array(); plutôt qu'une chaîne vide, non ?
22 mai 2018 à 11:42
Oui une erreur de copier/coller de ma part.
Je corrige dans le code initiale.