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 :

Récupérer un résultat unique et une boucle en même temps [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 16
    Points
    16
    Par défaut Récupérer un résultat unique et une boucle en même temps
    Bonjour,

    J'ai une requête SQL, composée de jointures, qui me retourne trois résultats :

    Goncourt | Le Sermon sur la chute de Rome
    Goncourt | L'Art français de la guerre
    Goncourt | La Carte et le territoire
    Contrairement aux apparences, 'Goncourt' est un champ unique dans une table 'prixlitteraires', et les titres sont dans une table 'titres', je lie les deux par une jointure.

    Je souhaiterais afficher quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <h1>Prix : Goncourt</h1>
    <ul>
    <li>Le Sermon sur la chute de Rome</li>
    <li>L'Art français de la guerre</li>
    <li>La Carte et le territoire</li>
    </ul>
    Pour lister les titres, je passe par une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo '<ul>';
    while($data = $r->fetch())
    {
         echo '<li>' . $data['titre'] . '</li>';
    }
    echo '</ul>';
    Mais comment faire pour "isoler" le champ Goncourt ? En le prenant dans n'importe quelle ligne.

    Si j'utilise current($r->fetch()) ou encore $r->fetchColumn(), ça passe au résultat suivant et dans la liste je n'ai plus que les deux derniers titres (le premier ayant été "épuisé" avec la fonction current() ou fetchColumn()).

    Quelqu'un aurait une solution simple, si possible sans faire de deuxième requête, et sans utiliser fetchAll() ?

    Merci bien d'avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    ne serait-il pas possible d'afficher en dur le champ Goncourt en fonction de son indice dans le tableau de résultat?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $one=$r->fetch();
    print_r($one);
     
    echo $one[indice]['champGoncourt']; //où indice=0,1,2

  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
    Le plus simple reste de reclasser tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while($data = $r->fetch(PDO::FETCH_ASSOC))
    {
       $tbl[$data['prixliterraire'][] =  $data['titre'];
    }
    foreach ($tbl as $prixliterraire => $titres) {
        echo '<h1>Prix : ' . $prixliterraire . '</h1><ul>';
         foreach ($titres as $titre) {
              echo '<li>' . $titre . '</li>';
         }
         echo '</ul>';
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par armel18 Voir le message
    ne serait-il pas possible d'afficher en dur le champ Goncourt en fonction de son indice dans le tableau de résultat?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $one=$r->fetch();
    print_r($one);
     
    echo $one[indice]['champGoncourt']; //où indice=0,1,2
    Merci, j'ai pensé à cette solution, mais comment faire ensuite pour passer $r->fetch() dans la boucle ?

    Car si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $one = $r->fetch();
    echo $one['nom_du_prix'];
     
    while($data = $r->fetch())
    {
     echo $data['titre_du_livre'] . '<br />';
    }
    La première ligne est utilisée pour afficher le nom du prix, et dans la boucle je n'ai que les deux derniers titres qui s'affichent.

    @sabotage : merci mais cela ne me tente pas trop, d'autant que la page sur laquelle je suis n'affichera que ces trois résultats, il s'agit de la page "Goncourt", ce ne sera pas une page qui liste les prix les uns à la suite.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    Citation Envoyé par Nyro Xeo Voir le message
    @sabotage : merci mais cela ne me tente pas trop, d'autant que la page sur laquelle je suis n'affichera que ces trois résultats, il s'agit de la page "Goncourt", ce ne sera pas une page qui liste les prix les uns à la suite.
    Dommage car c'est la solution la plus flexible, elle fonctionnera quelque soit les données que tu veux traiter.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    c'est le seul incovenient avec fetch car pendant que fecth retourne un résultat on ne pas la solliciter pour faire un autre traitement.A la place fetch tu peux mettre fetchAll() vu que t'as que 3 résultats ça n'influe pas beaucoup en terme de consommation mémoire.bref tu verras dans la doc la subtilité entre fetch et fetchAll

    En même la solution proposée par les autres membres me semble adaptés à tous les cas de figures.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Bon eh bien merci à vous !

    En fait en gros, s'il y avait eu un moyen de revenir une ligne en arrière avec PDO, ça aurait été parfait, mais apparemment ce n'est pas possible.

    Créer un deuxième tableau dans un ordre différent à partir d'un premier tableau, c'est certes hyper flexible, mais je trouve que sur le principe c'est assez lourd, d'ailleurs pas que sur le principe si les données extraites de la bdd sont conséquentes.

    Mais surtout je me demandais s'il n'existait pas un moyen "exprès" pour faire ce que je voulais faire.

    Ça doit bien faire 7 ou 8 ans que je n'ai plus fait de PHP. Là je découvre que mysql_* est devenu obsolète et qu'il faut utiliser PDO, donc j'explore un peu la doc. Bref, pour l'instant, je pars sur fetchAll(), et j'arrive à avoir ce que je veux ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $data = $r->fetchAll(PDO::FETCH_ASSOC);
    echo '<h1>Prix : ' . $data[0]['nom_du_prix'] . '</h1>';
    echo '<ul>';
    for($i=0;$i<count($data);$i++)
    {
        echo '<li>' . $data[$i]['titre_du_livre'] . '</li>';
    }
    echo '</ul>';
    Je n'ai plus du tout l'habitude de coder, donc je ne sais pas si ma requête SQL est bien ou pas (retourner le nom du prix dans tous les résultats), ou si j'aurais meilleur temps de faire deux requêtes (l'une où j'extrais les informations du prix, et l'autre la liste). Je ne sais pas quel est l'usage, mais bon je verrai au fur et à mesure que je continue.

    Bref, merci de votre aide.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Le fait d'utiliser la méthode fetchAll() consomme plus de mémoire que la méthode de sabotage car fetchAll() te renverra un tableau avec des sous-tableau reformant chaque ligne de résultat de ta requête,

    donc pour exemple plusieurs catégorie et des produits appartenant au catégorie :
    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
    //fetchAll()
    array(
        array("categorie"=>1
              "produit"=>toto),
        array("categorie"=>1
              "produit"=>tata),
        array("categorie"=>2
              "produit"=>titi)
    )
    //Méthode sabotage
    array(
        "1" => array(
                    array("produit"=>"toto"),
                    array("produit"=>"tata")
        ),
        "2"=> array(
                        array("produit"=>"titi")
        )
    )
    Donc tu évite la répétition de la catégorie.

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

Discussions similaires

  1. Résultats Live d'une boucle FOR
    Par accoustic dans le forum Langage
    Réponses: 7
    Dernier message: 15/01/2008, 13h42
  2. Réponses: 1
    Dernier message: 04/11/2007, 15h03
  3. [MySQL] Affichage de résultats issus d'une boucle sur un switch
    Par Micaunprobzo dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/09/2007, 11h45
  4. Réponses: 4
    Dernier message: 30/05/2007, 11h17
  5. Réponses: 1
    Dernier message: 01/01/2007, 13h17

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