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 du code HTML en fonction des données MySQL via PHP [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Générer du code HTML en fonction des données MySQL via PHP
    Bonjour à tous!

    Je suis ravi de poster ici mon premier message sur un forum de développement. Je me présente rapidement, je suis étudiant en Physique-Chimie et j'étudie l'informatique et le Webdesign pour le plaisir. En général, je préfère chercher la solution à mes problèmes tout seul car je trouve ça bien plus gratifiant et bien plus efficace pour apprendre et retenir les informations sur le long terme.
    Mais là je craque, j'ai beau tourner le problème dans tous les sens je n'arrive pas à trouver la solution.

    Je m'explique.

    Je souhaite concevoir un site dynamique présentant un label de musique: une page générique pour chaque artiste qui va chercher les informations dans une BDD MySQL. J'ai trois tables dans ma BDD:

    artiste ('artiste' (index FULLTEXT), 'nomArtiste', 'sourceImgArtiste', 'infos')
    album ('artiste' (index FULLTEXT), 'album' (index FULLTEXT), 'nomAlbum', 'sourceImgAlbum')
    morceau ('artiste' (index FULLTEXT), 'album' (index FULLTEXT), 'morceau' (index FULLTEXT), 'nomMorceau', 'sourceMorceau')

    Mon problème est celui-ci:

    Chaque artiste a réalisé un nombre d'album différent et chaque album possède un nombre de morceaux différents. Je ne sais pas comment jongler entre:

    -jonctions de tables lors des requêtes MySQL
    -boucles PHP

    Il faut savoir qu'en arrivant sur le site, un lien pointe vers chaque artiste en transmettant via un GET la variable url "?artiste=nomDeLartiste" de telle sorte que le nomDeLartiste soit égal à l'index FULLTEXT artiste.

    Voilà le résultat que je souhaiterais obtenir par exemple pour 3 albums tel que:

    -L'album1 contient 3 morceau
    -L'album2 en contient 2
    -L'album3 en contient 3

    de tel sorte que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div id="corps">
                <?php
                    include 'PHP/tete.php';
                    include 'PHP/ventre.php';
                ?>
    </div>
    avec tete.php: (il me semble que ce morceau est correct mais je le mets quand même)
    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
     
    <?php
        require_once 'PHP/login.php';  // C'est juste le fichier de connexion et celle-ci ce fait en PDO
     
        $req = $db->prepare('SELECT sourceImgArtiste, nomArtiste FROM artiste WHERE artiste = ?');
        $req->execute(array($_GET['artiste']));
     
        while ($donnees = $req->fetch())
        {
    ?>
    <div id="tete">
        <h1><?php echo $donnees['nomArtiste']; ?></h1>
        <img id="artist" src="<?php echo $donnees['artistImg']; ?>">
    </div>
     
    <?php
        }
     
        $req->closeCursor();
    ?>
    et le ventre.php (le véritable problème): j'aimerais qu'il affiche le code HTML ci-dessous au vu de l'exemple.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <div id="ventre">
             <div id="album">
                    <div id="album1">
                        <div id="albumInfos">
                            <h2>nomAlbum1</h2>
                            <img id="imgAlbum1" src="img/album1.png">
                        </div>
     
                        <h3>Morceau1</h3>
                        <h3>Morceau2</h3>
                        <h3>Morceau3</h3>
                    </div>
     
                    <div id="album2">
                        <div id="albumInfos">
                            <h2>nomAlbum2</h2>
                            <img id="imgAlbum2" src="img/album2.png">
                        </div>
     
                        <h3>Morceau1</h3>
                        <h3>Morceau2</h3>
                    </div>
     
                    <div id="album3">
                        <div id="albumInfos">
                            <h2>nomAlbum3</h2>
                            <img id="imgAlbum3" src="img/album3.png">
                        </div>
     
                        <h3>Morceau1</h3>
                        <h3>Morceau2</h3>
                        <h3>Morceau3</h3>
                    </div>
             </div>
     
             <div id="infos">
                     <h4>Infos</h4>
                        <div id="contenu">
                            <p>
                                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce quis dapibus enim. Nam eget convallis nulla. Vestibulum ultrices quam nisi, vel dignissim ligula condimentum a. Aliquam condimentum risus vitae molestie molestie. Sed at nulla ac risus tincidunt tempus quis sit amet tortor. Nulla ultricies ut massa id suscipit. Nam pharetra mi ac efficitur dictum. Fusce in posuere quam, et vulputate augue. Aenean congue sem non justo porta auctor. Donec varius elementum ligula, sed porta ligula sollicitudin et. Sed viverra cursus scelerisque. Sed quis magna nec augue porttitor finibus. Nunc ac libero ut elit maximus lacinia vitae pulvinar nibh. Proin placerat arcu in justo accumsan consequat. Praesent ultricies arcu eu dictum dapibus. Etiam id elit tristique, molestie libero quis, ornare nisl.
                            </p>
                        </div>
              </div>
    </div>
    Je ne sais pas si j'ai été assez clair, j'espère que oui. Dans le cas contraire, n'hésitez pas à me demander plus d'informations !
    Je vous remercie en tout cas de l'attention que vous accorderez à mon problème.

    En vous souhaitant une bonne soirée!

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Il y a déjà un problème de conception de la base de données.
    Si un morceau est attaché à un seul album et un album attaché à un seul artiste, alors le champ "artiste" est en trop dans la table "morceau".

    Ensuite concernant la 2e partie de l'affichage qui vous pose problème, il faudrait commencer par faire la base de tout recherche de problème dans le code, c'est à dire afficher le contenu des différentes variables au fur et à mesure du code afin de voir à quel moment elles ne contiennent pas ce qui était attendu.
    et si cela ne vous aide pas à résoudre le problème vous même, montrez nous le résultat de cet affichage

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonsoir Mathieu, merci de votre réponse rapide! J'ai d'ors et déjà supprimé la colonne superflue, merci. Pour le reste...

    Je connais bien cette technique et je m'en suis servi plusieurs fois lors de la conception de mon player audio en javascript via la fonction consolelog.
    Là c'est différent, je ne comprends pas la logique de mon problème: en fait je ne sais pas quelle stratégie adopter.

    J'ai essayé de compter le nombre d'entrées relatives à un album afin de créer les <div id="albumX"> correspondant; mais du coup j'ai un problème pour le nombre de morceau... Voilà les essais que je suis entrain de réaliser, sachant que les echos en commentaire affichent le bon nombre:

    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
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
        require_once 'PHP/login.php';
     
        $nbAlbumReq = $bdd->prepare('SELECT COUNT(*) AS nombreAlbum FROM album WHERE artiste = ?');
        $nbAlbumReq->execute(array($_GET['artiste']));
        $nbAlbum = $nbAlbumReq->fetch();
     
        //echo $nbAlbum['nombreAlbum'];
     
        $nbMorceauReq = $bdd->prepare('SELECT COUNT(*) AS nombreMorceau FROM morceau WHERE album = ?');
        $nbMorceauReq->execute(array(/*Ici je ne sais pas comment faire pour que cette variable change*/);
        $nbMorceau = $nbMorceauReq->fetch();
     
        //echo $nbMorceau['nombreMorceau'];
     
     
        //Je sais qu'ici il faut faire une requete SQL avec jointure mais je ne sais pas comment la rédiger de manière générique pour chaque artiste...
     
        while ($donnees = $req->fetch())  // et ca ce serait le fetch correspondant à la requete que je n'arrive pas à me figurer.
        {
    ?>
    <div id="ventre">
        <?php
            for ($i=1;$i<=$nbAlbum['nombreAlbum'];i++) {
     
            }
        <div id="album1">
            <div id="infos album1">
                <h2>Album1</h2>
                <img id="srcImAlbum">
            </div>
        </div>
     
        <div id="info">
            <h4>Infos</h4>
            <div id="contenu">
                <p>
                         Lorem ipsum
                </p> 
            </div>
        </div>
    En gros je ne sais pas vraiment où je vais même si j'ai quelques intuitions..

    EDIT: je sais bien que le code que j'ai publié est incomplet et faux, il est juste là pour vous imager ma façon de penser le problème afin que vous puissiez me dire si la logique est bonne ou non.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    pour faire cela, vous pouvez utiliser une boucle imbriquée dans une autre, comme cela :
    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
    <?php
    $nbAlbumReq = $bdd->prepare('SELECT * FROM album WHERE artiste = ?');
    $nbAlbumReq->execute(array($_GET['artiste']));
     
     
    while ($donnees = $nbAlbumReq->fetch()) { // boucle pour chaque album
     
        ?>
            <h2>
                <?php echo htmlspecialchars($donnees["nomAlbum"]);?>
            </h2>
        <?php
     
     
        // recherche des morceaux de l'album en cours
     
        $listeMorceaux = $bdd->prepare('SELECT * FROM morceau WHERE album = ?');
        $listeMorceaux->execute(array($donnees["album"]));
     
     
        while ($donneesMorceau = $listeMorceaux->fetch()) { // boucle pour chaque morceau
     
            ?>
                <h3>
                    <?php echo htmlspecialchars($donneesMorceau["nomMorceau"]);?>
                </h3>
            <?php
     
        }
     
    }

    une fois que vous aurez conçu l'affichage que vous souhaitez, vous pourrez aussi réfléchir a l'optimisation si vous avez des grandes quantité de données et que la page mets trop de temps à s'afficher.
    par exemple, vous avez mis des index sur des champs texte pour les clés primaires. je ne connais pas trop SQL Server mais je sais qu'avec MySQL par exemple, il vaut mieux utiliser des clés numériques
    un autre exemple d'optimisation peut se faire au niveau du nombre de requête dans mon exemple de code qui utilise une requête pour la liste des albums et une requête par album. il est possible de récupérer toutes ces informations avec une seule requête

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour Mathieu, désolé je n'ai pas pu me connecter hier...

    J'essaye de voir pour les boucles que vous avez proposé, je vous tiens au courant. Je n'utilise pas SQL Server mais bien MySQL . En ce qui concerne l'unique requête, j'avais le sentiment que c'était possible. La syntaxe de la requête devrait se trouver avec quelques recherches, cependant, j'ai du mal a conccevoir comment traiter la variable contenant la requête car il ne s'agit pas d'un tableau simple mais de tableaux imbriqués... Je voulais éviter de passer par des clefs numériques par peur de devoir mettre à jour l'intégralité de la base de donnée lors de la suppression d'un album par exemple. Tous les n+1 id devraient alors être décrémentés et du coup les id des morceaux correspondants aussi ..

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Le principe d'une clé, c'est qu'elle doit être unique. Le fait d'utiliser une clé numérique facilite grandement le travail car il est vachement plus facile de faire des nombres uniques (par exemple, en incrémentant le nombre précédent ou en utilisant le timestamp en microsecondes) que des chaines uniques, surtout si la chaine représente quelque chose (par exemple, un titre de chanson...)

    Mais personne n'a jamais dit que les clés numériques devaient se suivre. Si tu as envie d'incrémenter tes clés par pas de 42, ça marche tout aussi bien que par pas de 1, et les "trous" dus aux suppressions ne posent en général aucun problème.

    Citation Envoyé par Nicolas Eggs Voir le message
    Je n'utilise pas SQL Server mais bien MySQL .
    Du coup, ça aurait été bien de poster dans le forum PHP & MySQL et non pas dans le forum PHP & SQL-Server On va arranger ça.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    La boucle proposée par Mathieu fonctionne, merci Mathieu ! Il y a peut-être un moyen d'optimiser les requêtes mais c'est un autre sujet. Bonne journée !

    EDIT: Je suis désolé Celira, ce n'était pas volontaire ... Merci d'avoir déplacé" le sujet au bon endroit. La solution de Mathieu n'utilise finalement pas d'index. Cependant, je vais creuser afin d'appliquer tes conseils lors de la future combinaison des requêtes. Encore merci à vous deux.

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

Discussions similaires

  1. [Débutant] Afficher des données (Mysql) via différents boutons
    Par rokawear dans le forum Accès aux données
    Réponses: 1
    Dernier message: 26/03/2013, 08h10
  2. [MySQL] Récupérer des données MySQL via PHP
    Par Jeannot dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/01/2008, 13h10
  3. [VB6][MYSQL] recuperer des données MySQL via PHP
    Par psykotox dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 18/01/2008, 11h25
  4. recuperer des données MySQL via PHP en VB6
    Par pobrouwers dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/04/2007, 12h33
  5. Réponses: 1
    Dernier message: 31/01/2007, 11h59

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