IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Générer une requête avec une condition IN


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut Générer une requête avec une condition IN
    Bonjour,

    Voilà, j'ai besoin de faire une requete utilisant l'opérateur IN avec PDO (drivers mysql), et évidemment, ça ne marche pas...

    prenons un exemple tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // SPDO est mon singleton PDO
    $s = SPDO::getInstance()->prepare('select * from user where id_user in (:lst)');
    $s->bindValue(':lst', '1, 2');
    $s->execute();
    echo'<pre>';print_r($s->fetchAll());echo'</pre>';
    les enregistrements 1 et 2 existent bien dans la BDD... Mais ce code ne retourne que le 1er des 2 enregistrements...

    Question 1) Comment peut-on gérer un IN avec la PDO (sachant qu'en l'occurrence, un select imbriqué ne correspond pas à mon problème) ?

    Question 2) je suppose qu'en faisant une concaténation de la chaine plutôt qu'un bind, je devrait arriver à quelque chose de plus probant (et moins sécure), mais par contre, j'esquiverai le problème sans comprendre le pourquoi du comment...

    J'aurais pu comprendre qu'il renvoie une erreur du fait que PDO se sente obligé de faire un test de type sur la chaine que je bind, j'aurais pu comprendre que ça marche tout court, mais je ne comprend pas comment il en arrive à cette solution intermédiaire...

    Si vous pouviez m'éclairer sur ce point, je vous en serait très reconnaissant.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    Citation Envoyé par comode Voir le message
    Question 2) je suppose qu'en faisant une concaténation de la chaine plutôt qu'un bind, je devrait arriver à quelque chose de plus probant (et moins sécure), mais par contre, j'esquiverai le problème sans comprendre le pourquoi du comment...
    pourquoi ça serait moins sécurisé ? j'utilise cette méthode de concaténation et je n'ai jamais remarqué de problème

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Citation Envoyé par mathieu Voir le message
    pourquoi ça serait moins sécurisé ? j'utilise cette méthode de concaténation et je n'ai jamais remarqué de problème
    rapport au fait que la PDO est réputée protéger contre les injections SQL, ce qui (je suppose) doit se faire par le biais des bindValue/bindParam...

    N'hésite pas à me corriger si je me trompe.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    Citation Envoyé par comode Voir le message
    rapport au fait que la PDO est réputée protéger contre les injections SQL, ce qui (je suppose) doit se faire par le biais des bindValue/bindParam...

    N'hésite pas à me corriger si je me trompe.
    excuse moi je crois que j'ai mal compris ce que tu disais
    dans mon cas je fais ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $s = SPDO::getInstance()->prepare('SELECT * FROM user WHERE id_user IN (:lst1, :lst2, :lst3)');
    $s->bindValue(':lst1', '15');
    $s->bindValue(':lst2', '96');
    $s->bindValue(':lst3', '23');
    $s->execute();

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    ah ok, donc la solution "normale" pour un nombre aléatoire de valeurs serait de concaténer les variables dans une chaines (:val1, :val2 etc...) et de faire une boucle pour l'assignation des valeurs via un bind ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [AC-2007] Incrémenter dans une requête avec une condition
    Par neiluj26 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 02/11/2012, 11h38
  3. Requête avec une fonction right en condition
    Par titi_la_vermine dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/10/2010, 15h21
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. Réponses: 4
    Dernier message: 15/10/2009, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo