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 :

PDO : "WHERE ID" appartient à un tableau [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Particulier
    Inscrit en
    Janvier 2013
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Janvier 2013
    Messages : 80
    Points : 49
    Points
    49
    Par défaut PDO : "WHERE ID" appartient à un tableau
    Bonjour !
    J'ai une table similaire à celle-ci :

    Un exemple de base de donnée
    Ainsi qu'un array comme ça :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste = array (1, 3, 4);
    Ma question est simple, je cherche une requête qui puisse me renvoyer les noms (par exemples) de chacune des personnes dont l'ID se trouve dans l'array $liste.
    Pour le moment, voilà ce que j'ai fait :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try
    {
    	$base = new PDO('mysql:host=localhost;dbname=base', 'root', ''); //En local avec WAMP
    	$base->exec("SET CHARACTER SET utf8");
    }
    catch(Exepction $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
     
    $req=$base->prepare('SELECT Nom FROM table WHERE ID = ?');
    $req->execute(
    Et... Voilà où je m'arrête...

    Je vous remercie d'avance de votre aide !
    X260...

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    J'ai pas testé, mais ça devrait marcher.
    Et j'ai essayé de faire des commentaires pour que tu comprennes chaque étape.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    //tu prépares d'abord ton sql
    //tu veux obtenir (1,3,4) en fonction de $liste
    $liste = array (1, 3, 4);
    $sqlIn='(';
    foreach($liste as $id){
    	$sqlIn.=$id.',';
    }
    //tu supprimes la dernière virgule
    $sqlIn=substr($sqlIn,0,-1);
    $sqlIn.=')';
     $sql = 'SELECT nom,id from table where id in '.$sqlIn;
     //là attention, il faut mettre tout ce qui touche à la base dans ton bloc try
      try {
    	$dbh = new PDO('mysql:host=localhost;dbname=base', 'root', '');
    //important pour récupérer les messages d'erreur éventuels
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        $stmt = $dbh->prepare($sql);
        $stmt->execute();
    	//puis tu ranges tout ça dans un tableau PHP
    	$data=array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC) {
    		array_push($data,$row);
        }
    	//pour vérifier si c'est bon
    	echo '<pre>';
    	print_r($data);
    	echo '</pre>';
    	//on ferme la connexion
    	$dbh=NULL;
     
      }
      catch (PDOException $e) {
        print $e->getMessage();
      }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT nom,id from table WHERE id IN (' . implode(',', $liste) . ')';
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre du Club
    Homme Profil pro
    Particulier
    Inscrit en
    Janvier 2013
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Janvier 2013
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Pas de risque d'injection SQL, en faisant comme ça ?

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Non pas de risque tant que $liste n'est pas constituée d'éléments créés par l'utilisateur.

    EDIT : sinon comme $liste est consituée d'entiers tu peux facilement faire préalablement un array_map sur ton tableau pour caster ses éléments en nombre entier avec intval par exemple.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Un peu plus rock&roll en utilisant la préparation de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'SELECT nom,id from table WHERE id IN (' . implode(',', array_fill(0, count($liste), '?') . ')';
    $stmt = $dbh->prepare($sql);
    $stmt->execute($liste);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Homme Profil pro
    Particulier
    Inscrit en
    Janvier 2013
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Janvier 2013
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup à vous !
    Je reprends donc mon code de départ :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $liste = array (1, 3, 4);
     
    try
    {
    	$base = new PDO('mysql:host=localhost;dbname=base', 'root', ''); //En local avec WAMP
    	$base->exec("SET CHARACTER SET utf8");
    }
    catch(Exepction $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
     
    $req=$base->prepare('SELECT Nom FROM table WHERE ID IN (' . implode(',', $liste) . ')');
     
    while($donnees = $requ->fetch())
    {
    	echo $donnees['Nom'] . '<br />';
    }

    Encore merci !
    Résolu.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Bah, au jugé de ton dernier code, tu as mal compris le système. La méthode prepare ne se justifie que si l'on emploie des marqueurs nommés ou des marqueurs de position (avec les '?' comme dans le dernier exemple donné par sabotage). Par ailleurs une méthode prepare est suivie par un execute()...
    Mais si pas de marqueurs alors il n'y a pas lieu de faire une requête préparée (puisque une requête préparée sert à lier des marqueurs à des variables).

  9. #9
    Membre du Club
    Homme Profil pro
    Particulier
    Inscrit en
    Janvier 2013
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Janvier 2013
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Mea culpa, j'ai oublié de modifier ça quand j'ai copier mon code du premier message.
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $liste = array (1, 3, 4);
     
    try
    {
    	$base = new PDO('mysql:host=localhost;dbname=base', 'root', ''); //En local avec WAMP
    	$base->exec("SET CHARACTER SET utf8");
    }
    catch(Exepction $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
     
    $req=$base->query('SELECT Nom FROM table WHERE ID IN (' . implode(',', $liste) . ')');
     
    while($donnees = $requ->fetch())
    {
    	echo $donnees['Nom'] . '<br />';
    }

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Note :
    Se souvenir quand même que ce code ne fonctionne qu'à la condition que ton tableau soit rempli de nombres entiers.

    Pour avoir un code plus générique - notamment qui fonctionne aussi avec des chaines de caractères comme valeurs - tu aurais tout intérêt à utiliser la méthode avec la requête préparée (il manque une parenthèse fermante dans l'exemple plus haut donc je la redonne ci-dessous).

    Et dans tous les cas, penser à vérifier que $liste est un tableau non vide avant de faire la requête sinon ça va buguer. Ou alternativement définir une valeur par défaut choisie pour ne retourner aucun résultat. Dans ton cas on pourrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $liste = is_array($liste) && count($liste) > 0 ? $liste : array(0);
     
    $sql = 'SELECT nom,id from table WHERE id IN (' . implode(',', array_fill(0, count($liste), '?')) . ')';
    $stmt = $dbh->prepare($sql);
    $stmt->execute($liste);
     
    while($donnees = $stmt->fetch())
    {
    	echo $donnees['Nom'] . '<br />';
    }
    En plus de ne plus être limité à un tableau de nombre entiers, l'avantage supplémentaire est aussi que tu n'aurais rien à modifier si $liste était construit avec des données utilisateur.

  11. #11
    Membre du Club
    Homme Profil pro
    Particulier
    Inscrit en
    Janvier 2013
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Janvier 2013
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Euh... J'aurai plutˆot vu un truc comme ça :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if(!empty($liste))
    {
    $sql = 'SELECT nom,id from table WHERE id IN (' . implode(',', array_fill(0, count($liste), '?')) . ')';
    $stmt = $dbh->prepare($sql);
    $stmt->execute($liste);
     
    while($donnees = $stmt->fetch())
    {
    	echo $donnees['Nom'] . '<br />';
    }
    }
    else
    {
    /* Si besoin. */
    }
    Mais oui, je pense bien à vérifier que $liste n'est pas nul (en fait, il est utilisé plus tot dans le code donc...) !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO bindValue] :var sans quote
    Par Orang- dans le forum Langage
    Réponses: 3
    Dernier message: 09/07/2015, 10h15
  2. Variable d'une clause where avec quote
    Par kcizth dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/04/2008, 15h43

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