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

  1. #41
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonsoir tse_jc,

    Merci pour ta requête. Dès que je l'aurai testée, je posterai un message

  2. #42
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonsoir Sabotage,

    De nouveau merci. J'ai réussi à transposer ton code pour rendre "cliquable" la plupart des caractéristiques de mes livres. Mais je bute sur les liens des fonctions et des contributeurs.

    J'ai essayé de faire ce début de 1er code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    while ($data = mysql_fetch_assoc($resultat_contrib)){ 
    	$livre_contributeurs[$data['ID_LIVRE']][] = $data ['ID_CONTRIBUTEUR'];
     
    	if (!isset($tblContributeurs[$data ['ID_CONTRIBUTEUR']])) {
         $tblContributeurs[$data ['ID_CONTRIBUTEUR']] = $data ['PRENOM_CONTRIBUTEUR'] . " " . $data ['NOM_CONTRIBUTEUR'];
      }
    }
    Mais je ne sais pas comment récupérer en plus le NOM_FONCTION comme dans le code original :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ($data = mysql_fetch_assoc($resultat_contrib)){ 
        $livre_contributeurs[$data['ID_LIVRE']][$data ['NOM_FONCTION']][] = $data ['PRENOM_CONTRIBUTEUR'] . " " . $data ['NOM_CONTRIBUTEUR'];
     }

    Dans la continuité de mon 1er code, j'ai fait ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    foreach ($livre_contributeurs[$data['id_livre']] as $contributeur_id) {
    	  echo '<a href="filtres.php?id_categorie='.$contributeur_id.'"><strong>'.$tblContributeurs[$contributeur_id].'</strong></a><br/>';
          }
    Cela m'affiche bien chaque contributeur sous forme de lien mais je n'ai plus le nom de la fonction qui s'affiche et je perds le bénéfice de l'implode qui m'affichait mes contributeurs séparés par des ";".

    Comment adapter mon code pour pouvoir conserver l'affichage des fonctions et des contributeurs tel qu'il existait avant la mise en place des liens ?

    titre1

    auteur [=> fonction "cliquable" avec son id_fonction] : auteur1; auteur2; auteur3 => chaque auteur "cliquable" avec son id_contributeur

    traducteur [=> fonction "cliquable" avec son id_fonction] : traducteur1; traducteur2 => chaque traducteur "cliquable"avec son id_contributeur


    Merci d'avance de toute aide complémentaire

  3. #43
    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
    Pour le groupement c'est la meme modification : on indexe avec l'id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($data = mysql_fetch_assoc($resultat)){ 
        $livre_contributeurs[$data['ID_LIVRE']][$data ['NOM_FONCTION']][$data['ID_CONTRIBUTEUR']] = $data ['PRENOM_CONTRIBUTEUR'] . " " . $data ['NOM_CONTRIBUTEUR'];
    }
    Pour l'affichage ca ne marche pas pareil puisqu'il y a le niveau "fonction" en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach ($livre_contributeurs[$data['id_livre']] as $fonction => $contributeurs) {
     
       foreach($contributeurs as $contributeur_id => $contributeur_nom) {
              echo '<a href="filtres.php?id_contributeur='.$contributeur_id.'"><strong>'.$contributeur_nom.'</strong></a><br/>';
          }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #44
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci Sabotage. En utilisant ton 1er code tel quel et le 2nd de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach ($livre_contributeurs[$data['id_livre']] as $fonction => $contributeurs) {
     
       foreach($contributeurs as $contributeur_id => $contributeur_nom) {
              echo $fonction. ' : ' .'<a href="filtres.php?id_contributeur='.$contributeur_id.'"><strong>'.$contributeur_nom.'</strong></a><br/>';
          }
    }
    J'obtiens l'affichage suivant :

    TITRE 1

    auteur : Douglas Preston
    auteur : Lincoln Child
    traducteur : Jean Colonna
    traducteur : José Finche

    Chaque nom de contributeur est un lien. Mais je souhaiterais aussi que chaque fonction soit également un lien et obtenir un affichage du style (implode ?) :

    auteur : Douglas Preston; Lincoln Child
    traducteur : Jean Colonna; José Finche

    J'utilise la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $selectcontrib = "SELECT L.ID_LIVRE,CB.NOM_CONTRIBUTEUR, CB.PRENOM_CONTRIBUTEUR, F.NOM_FONCTION, CB.ID_CONTRIBUTEUR, F.ID_FONCTION
     
    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
    ";
    Je ne suis pas loin d'arriver à l'affichage tant espéré... merci encore

  5. #45
    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
    Mah non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach ($livre_contributeurs[$data['id_livre']] as $fonction => $contributeurs) {
        echo $fonction. ' : ';
       foreach($contributeurs as $contributeur_id => $contributeur_nom) {
             echo '<a href="filtres.php?id_contributeur='.$contributeur_id.'"><strong>'.$contributeur_nom.'</strong></a>;';
          }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #46
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour Sabotage,

    L'affichage obtenu grâce à ton précieux code est le suivant :

    TITRE 1

    auteur1 : John Hart ; Jeff Hoppel; (chaque contributeur est 1 lien)
    traducteur : Sabine Boulongne ; Martine trahn; (chaque contributeur est 1 lien)

    C'est quasiment l'affichage souhaité...

    1) En effet j'ai cherché en vain à faire de chaque fonction 1 lien (fonction "cliquable" avec son id_fonction) Aurais-tu une idée pour y parvenir ?

    2) Chaque contributeur est séparé par un ;, ce qui est correct. Mais y-a-t-il un moyen d'éviter l'affichage de ce ; à la fin du dernier contributeur ?

    Merci d'avance (encore).

  7. #47
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour tse_jc,

    J'ai testé ta requête en rajoutant quelques ")" ou "," manquants. La requête suivante :

    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
    SELECT titre,sous_titre,isbn,nom_librairie,nom_editeur,t1.genres,t2.contribs,t3.lecteurs,t4.cats
    FROM livre, librairie, editeur, participe, lit, thematise, classifie3,
          (SELECT id_genre,GROUP_CONCAT(DISTINCT nom_genre SEPARATOR '; ') as genres FROM genre) as t1,
          (SELECT contributeurs.id_contributeur,GROUP_CONCAT(DISTINCT nom_contributeur,', ',prenom_contributeur,' : ',nom_fonction SEPARATOR ';') as contribs FROM contributeurs,fonction,participe WHERE participe.id_contributeur=contributeurs.id_contributeur AND participe.id_fonction=fonction.id_fonction) as t2,
          (SELECT id_lecteur,GROUP_CONCAT(DISTINCT nom_lecteur SEPARATOR'; ') as lecteurs FROM lecteur) as t3,
          (SELECT id_categorie,GROUP_CONCAT(DISTINCT nom_categorie SEPARATOR '; ') as cats FROM categorie) as t4
    WHERE livre.id_librairie=librairie.id_librairie 
      AND livre.id_editeur=editeur.id_editeur
      AND thematise.id_genre=t1.id_genre 
      AND thematise.id_livre=livre.id_livre
      AND participe.id_livre=livre.id_livre
      AND lit.id_lecteur=t3.id_lecteur
      AND lit.id_livre=livre.id_livre
      AND classifie3.id_categorie=t4.id_categorie
      AND classifie3.id_livre=livre.id_livre
    GROUP BY livre.id_livre

    ne donne pas le résultat escompté (voir pièce jointe). Le résultat retourne seulement 242 livres alors que ma base en compte 1490. Par ailleurs, à chaque livre, est associée la liste complète des catégories, genres, lecteurs et contributeurs.

    Vois-tu comment modifier la requête pour retourner 1490 résultats avec pour chacun uniquement les catégories, contributeurs ... qui lui correspondent ? Merci d'avance
    Images attachées Images attachées  

  8. #48
    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
    Tu en veux toujours plus.

    On va refaire le meme principe, avec une tableau de correspondance pour les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while ($data = mysql_fetch_assoc($resultat)){ 
        $livre_contributeurs[$data['ID_LIVRE']][$data['ID_FONCTION']][$data['ID_CONTRIBUTEUR']] = $data ['PRENOM_CONTRIBUTEUR'] . " " . $data ['NOM_CONTRIBUTEUR'];
     
    if (!isset($tblFonctions[$data['ID_FONCTION']])) {
        $tblFonctions[$data['ID_FONCTION']] = $data['NOM_FONCTION'];
    }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foreach ($livre_contributeurs[$data['id_livre']] as $fonction_id => $contributeurs) {
     
        echo '<a href="filtres.php?id_fonction='.$fonction_id.'"><strong>'.$tblFonctions[$fonction_id].'</strong></a> : ';
     
       $echo_contrib = "";
       foreach($contributeurs as $contributeur_id => $contributeur_nom) {
             $echo_contrib .=  '<a href="filtres.php?id_contributeur='.$contributeur_id.'"><strong>'.$contributeur_nom.'</strong></a>;';
          }
       // on retire le dernier point-virgule
       echo substr($echo_contrib, 0 , -1);
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #49
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour Sabotage,

    Merci beaucoup pour l'ensemble de ton aide Grâce à toi, j'ai obtenu l'affichage souhaité. Je peux attaquer la transmission des données de page en page.

  10. #50
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour.

    Alors
    1) ma requête ne contenait pas d'erreur de syntaxe (un copier coller sur phpmyadmin ne m'a pas généré d'erreur).
    2) Désolé d'avoir sous estimé la requête car la bonne necessitait un peu plus de travail^^. Voici donc la bonne requête et qui fonctionne.

    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
     
    select livre.titre,livre.sous_titre,livre.isbn,nom_librairie,nom_editeur,t1.genres,t4.lecteurs,t5.cats,t7.participants,thematise.id_livre,lit.id_livre,classifie3.id_livre,participe.id_livre
    from thematise left join livre on thematise.id_livre=livre.id_livre 
                   left join (select t2.id_genre as idg,t2.id_livre, group_concat(distinct nom_genre separator';') as genres from thematise as t2 left join genre on t2.id_genre=genre.id_genre group by t2.id_livre) as t1 on thematise.id_genre=t1.idg,
         lit left join livre as L2 on lit.id_livre=L2.id_livre
             left join (select t3.id_lecteur as idlect,t3.id_livre,group_concat(distinct nom_lecteur separator';') as lecteurs from lit as t3 left join lecteur on t3.id_lecteur=lecteur.id_lecteur group by t3.id_livre) as t4 on lit.id_lecteur=t4.idlect,
         classifie3 left join livre as L3 on classifie3.id_livre=L3.id_livre
                    left join (select t6.id_categorie as idcat,t6.id_livre,group_concat(distinct nom_categorie separator ';') as cats from classifie3 as t6 left join categorie on t6.id_categorie=categorie.id_categorie group by t6.id_livre) as t5 on classifie3.id_categorie=t5.idcat,
         participe left join livre as L4 on participe.id_livre=L4.id_livre
                   left join (select t8.id_contributeur as idcontrib,t8.id_livre,t8.id_fonction as idfonct, group_concat(distinct nom_contributeur,', ',prenom_contributeur,': ',nom_fonction separator';') as participants from participe as t8 left join contributeurs on t8.id_contributeur=contributeurs.id_contributeur left join fonction on t8.id_fonction=fonction.id_fonction group by t8.id_livre) as t7 on participe.id_contributeur=t7.idcontrib,
         livre as L5 left join librairie on L5.id_librairie=librairie.id_librairie,
         livre as L6 left join editeur on L6.id_editeur=editeur.id_editeur    
    where L2.id_livre=livre.id_livre 
    and t4.idlect=lit.id_lecteur
    and t1.idg=thematise.id_genre
    and t5.idcat=classifie3.id_categorie
    and L3.id_livre=livre.id_livre
    and L4.id_livre=livre.id_livre
    and t7.idcontrib=participe.id_contributeur
    and L5.id_livre=livre.id_livre
    and L6.id_livre=livre.id_livre
    Bonne continuation
    PS: Par curiosité si tu peux test la différence de temps de traitement entre les deux méthodes ca m'interesse

  11. #51
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonsoir tse_jc,

    Merci beaucoup pour ta requête. Je l'ai testée à plusieurs reprises dans PhpMyadmin mais celle-ci n'aboutit pas. Au bout de 60/120 secondes, la page d'accueil de PhpMyadmin s'affiche. Vois-tu une explication ? Merci.

    PS : en testant ta 1ere requête, PhpMyadmin m'affichait des erreurs de syntaxe avant que je ne rajoute les , et )...

  12. #52
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonsoir.

    Merci pour ta réponse. Je l'ai testé sur PhpMyAdmin v3.2.2.1 avec le client MySQL v5.1.48 et l'extension PHP mysqli. Je n'ai eu aucun problème. Si tu as les mêmes versions, demande à ton hébergeur.
    Note: J'ai fait un copier/coller de phpmyadmin sur le fofo sur une source codée en UTF8. Vérifie aussi à ce niveau là.

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