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
- Or - Guide
- Navigation in private - Guide
- Aux in ✓ - Forum Enceintes / HiFi
- Comment dissocier google photo de la galerie - Forum Xiaomi
- Deco in paris avis - Forum Consommation & Internet
2 réponses
jordane45
Messages postés
38424
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 février 2025
4 734
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
38424
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 février 2025
4 734
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.