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 :

Construction d'un affichage suite à une requête


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 402
    Par défaut Construction d'un affichage suite à une requête
    Bonjour,

    J'ai une base de données avec notamment ces tables :

    - 1 table FONCTION comportant comme champs : id_fonction et nom_fonction
    - 1 table CONTRIBUTEURS comportant comme champs : id_contributeur, nom_contributeur, prenom_contributeur
    - 1 table LIVRE comportant comme champs notamment : id_livre, titre ...
    - 1 table PARTICIPE comportant comme champs : id_contributeur, id_fonction et id_livre

    Suite au conseil avisé de CinePhil, j'utilise la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT L.TITRE AS titre,
        CB.NOM_CONTRIBUTEUR AS contributeurs,
        F.NOM_FONCTION AS fonctions
    FROM LIVRE L
    INNER JOIN PARTICIPE P ON P.ID_LIVRE = L.ID_LIVRE
        INNER JOIN CONTRIBUTEURS CB ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR
        INNER JOIN FONCTION F ON F.ID_FONCTION = P.ID_FONCTION
    ORDER BY L.TITRE, F.NOM_FONCTION, CD.NOM_CONTRIBUTEUR
    En utilisant le code suivant (personnel) :

    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
    foreach($reponse as $row){
     
         $titre = $row['titre'];
    	 $contributeurs = $row['contributeurs'];
    	 $fonctions = $row['fonctions'];
     
    	  // affichage du titre
          echo '<br/><h3>'.$titre.'</h3><br/>';
     
     
    	 // affichage des fonctions : auteur, traducteur 
     
         echo $fonctions . ' ';
     
     
          // affichage des contributeurs : identité de l'auteur, traducteur      
     
          echo $contributeurs . ' ';
          echo '<br />';
     
     
    } 
     
     
     ?>
    L'affichage obtenu est du style :

    [TITRE] / [NOM_CONTRIBUTEUR] / [NOM_FONCTION]
    'MYSERY' / 'KING' / 'Auteur'
    'MYSERY' / 'BACHMAN' / 'Auteur'
    'MYSERY' / 'Breque' / 'Traducteur'

    Ce n'est pas l'affichage escompté. C'est plutôt :

    TITRE : MYSERY
    AUTEUR : KING; BACHMAN
    TRADUCTEUR : BREQUE

    CinePhil m'a déconseillé l'utilisation des GROUP-CONCAT dans ma requête et des explode car très gourmands en ressources...

    CinePhil a écrit : Ton programme PHP doit parcourir le tableau et construire l'affichage à chaque changement de fonction pour un même titre et à chaque titre. ..[] La requête sera beaucoup plus rapide à exécuter sans le groupage sur un grand nombre de lignes et PHP est bien outillé pour parcourir les tableaux de résultat et éventuellement concaténer les chaînes de caractères extraites de ce tableau.
    Pouvez-vous m'aider à construire l'affichage souhaité conformément aux consignes de CinePhil ? Merci d'avance.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Par défaut
    Un truc dans ce style devrait faire ton bonheur (après avoir corrigé les éventuelles erreurs dans ce code non testé)
    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
    foreach($reponse as $row){
     
    $titre = $row['titre'];
    $contributeurs = $row['contributeurs'];
    $fonctions = $row['fonctions'];
     
    // affichage du titre
    echo '<br/><h3>' . "Titre" . '</h3>' . $titre . '<br/>';
    // affichage des fonctions : auteur, traducteur 
    echo '<br/>' . "Fonctions" . $fonctions . '<br/>';
    // affichage des contributeurs : identité de l'auteur, traducteur      
    echo '<br/>' . "Contributeurs" . $contributeurs . '<br/>';
    echo '<br />';
     
    }
    trop tard Sabotage

  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
    Par défaut
    Et toi tu bosses jamais alors ?
    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
     
    $current['titre'] = "";
    $current['fonction'] = "";
     
    foreach($reponse as $row){
     
       // détection du passage d'un titre à un autre
       if ($row['titre'] != $current['titre']) {
          echo '<br/><h3>'.$row['titre'];.'</h3><br/>';
          $current['titre'] = $row['titre'];
          $current['fonction'] = '';
       }
     
       // détection du passage d'une fonction à une autre
       if ($row['fonction'] != $current['fonction']) {
          echo "<br/>" . $fonction . ' : ';
       }
       else {
            echo ', ';
       }
       echo $row['contributeurs']; 
    }	
    ?>
    je suis sur que c'est pas ça la question
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 402
    Par défaut
    Merci pour vos réponses. En testant, il s'avère que c'est sabotage qui répond le mieux à ma problématique

    Avec ce code donc :

    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
    $current['titre'] = "";
    $current['fonction'] = "";
     
     
    foreach($reponse as $row){
     
     $fonctions = $row['fonctions'];
     
       // détection du passage d'un titre à un autre
       if ($row['titre'] != $current['titre']) {
          echo '<br/><h3>'.$row['titre'].'</h3><br/>';
          $current['titre'] = $row['titre'];
          $current['fonction'] = '';
       }
     
       // détection du passage d'une fonction à une autre
       if ($row['fonctions'] != $current['fonction']) {
          echo "<br/>" . $fonctions . ' : ';
       }
       else {
            echo ', ';
       }
       echo $row['contributeurs']; 
    }	
    ?>
    J'obtiens par exemple l'affichage suivant :

    999 - le livre du millénaire des maitres du fantastique

    auteur : Collectif
    auteur : Sarrantonio
    traducteur : Châtelain
    traducteur : Desmond
    traducteur : Doizelet
    traducteur : Leynaud
    traducteur : Malfoy
    traducteur : Peters
    traducteur : Richetin

    Existe-t-il un moyen d'obtenir plutôt :

    999 - le livre du millénaire des maitres du fantastique

    auteur : Collectif; Sarrantonio
    traducteur : Châtelain, Desmond (...)

    Et question subsidiaire : est-il possible de gérer le pluriel des fonctions : auteurs, traducteurs si le livre a plus d'un auteur (ou traducteur) ? Merci d'avance de votre éclairage complémentaire.

  5. #5
    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
    Par défaut
    J'ai oublié une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // détection du passage d'une fonction à une autre
       if ($row['fonctions'] != $current['fonction']) {
          echo "<br/>" . $fonctions . ' : ';
          $current['fonction'] = $row['fonctions'];
       }
    Pour les pluriels, tout est possible.
    Comme avec cette méthode, on ne peut pas savoir a l'avance le nombre d'éléments, il faudrait mémoriser les contributeurs a chaque boucle et ne les afficher qu'au changement de film ou de fonction.
    Bref ca allourdit le tout, la ou un simple auteur(s) peut faire l'affaire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 402
    Par défaut
    Merci cela fonctionne

    Mais en voulant ajouter un lien sur le echo $row['contributeurs']; :

    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
    $current['titre'] = "";
    $current['fonction'] = "";
     
     
    foreach($reponse as $row){
     
     $fonctions = $row['fonctions'];
     $contributeurs = $row['contributeurs'];
     $id_contributeurs =$row['id_contributeurs'];
     
       // détection du passage d'un titre à un autre
       if ($row['titre'] != $current['titre']) {
          echo '<br/><h3>'.$row['titre'].'</h3><br/>';
          $current['titre'] = $row['titre'];
          $current['fonction'] = '';
       }
     
       // détection du passage d'une fonction à une autre
       if ($row['fonctions'] != $current['fonction']) {
          echo "<br/>" . $fonctions . ' : ';
          $current['fonction'] = $row['fonctions'];
       }
     
       else {
            echo ', ';
       }
     
       echo '<a href="filtres.php?id_categorie='.$id_contributeurs.'"><strong>'.$row['contributeurs'].'</strong></a><br/>';
    }	
    ?>
    je perd l'affichage correct :

    999 - le livre du millénaire des maitres du fantastique

    auteur : Collectif
    , Sarrantonio

    traducteur : Châtelain
    , Desmond
    , Doizelet
    , Leynaud
    , Malfoy
    , Peters
    , Richetin

    Je suis preneur d'un dernier coup de pouce puis je mettrai le sujet en résolu. Merci d'avance.

  7. #7
    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
    Par défaut
    Tu as mis un <br/> à la fin de ton lien.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. affichage d'une requête
    Par poula dans le forum Forms
    Réponses: 2
    Dernier message: 18/12/2006, 14h47
  2. Affichage d'une requête
    Par Sorcier157 dans le forum Zend_Db
    Réponses: 6
    Dernier message: 27/10/2006, 10h30
  3. [MySQL] affichage d'une requête
    Par gailup dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 01/06/2006, 10h20
  4. [MySQL] Affichage d'une requête
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 31/01/2006, 10h54
  5. Modifier l'affichage d'une requête
    Par seal dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 14h26

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