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 :

Puce hiérarchisée avec requête SQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut Puce hiérarchisée avec requête SQL
    Bonjour,

    J'essaye de faire des puces hiérarchisées avec des requêtes SQL.
    Ma première requête fonctionne bien, elle m'affiche les matières.
    Ma seconde par contre, m'affiche bien les chapitres mais elle me met les chapitres dans toutes les matières tandis qu'il faudrait que chaque chapitre aille dans la bonne matière.

    Voici mon code PHP:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <div id="monmenu">
    <ul class="niveau1">
    <?php
    $db=mysql_connect("localhost", "root", "");
    mysql_select_db("dropdev",$db);
    $result = mysql_query("SELECT matiere FROM matiere");
     
    while ($row = mysql_fetch_row($result)) {
    echo "<li>";
    for ($i = 0; $i < count($row); $i++) 
    {
    echo "$row[$i]";
     
    $result2 = mysql_query("SELECT chapitre FROM chapitre WHERE matiere = $i");
    while ($row2 = mysql_fetch_row($result2)) {
    echo "<ul><li>";
    for ($j = 0; $j < count($row2); $j++) 
    {
    echo "$row2[$j]";
    }
    echo "</li></ul>";
    }
    }
    echo "</li>";
    }
    ?>
    </div>

    Ma BDD:
    Code sql : 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    --
    -- Base de données: `dropdev`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `chapitre`
    --
     
    CREATE TABLE IF NOT EXISTS `chapitre` (
      `num_chapitre` int(11) NOT NULL AUTO_INCREMENT,
      `chapitre` varchar(20) DEFAULT NULL,
      `matiere` varchar(20) NOT NULL,
      PRIMARY KEY (`num_chapitre`),
      KEY `matiere` (`matiere`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `chapitre`
    --
     
    INSERT INTO `chapitre` (`num_chapitre`, `chapitre`, `matiere`) VALUES
    (1, 'les boucles', 'Developpement'),
    (2, 'les tableaux', 'developpement');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `cours`
    --
     
    CREATE TABLE IF NOT EXISTS `cours` (
      `num_cours` int(11) NOT NULL AUTO_INCREMENT,
      `cours` varchar(20) DEFAULT NULL,
      `chapitre` varchar(20) NOT NULL,
      PRIMARY KEY (`num_cours`),
      KEY `chapitre` (`chapitre`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `exercice`
    --
     
    CREATE TABLE IF NOT EXISTS `exercice` (
      `num_exercice` int(11) NOT NULL AUTO_INCREMENT,
      `exercice` varchar(20) DEFAULT NULL,
      `chapitre` varchar(20) NOT NULL,
      PRIMARY KEY (`num_exercice`),
      KEY `chapitre` (`chapitre`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `matiere`
    --
     
    CREATE TABLE IF NOT EXISTS `matiere` (
      `code_matiere` int(11) NOT NULL AUTO_INCREMENT,
      `matiere` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`code_matiere`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
     
    --
    -- Contenu de la table `matiere`
    --
     
    INSERT INTO `matiere` (`code_matiere`, `matiere`) VALUES
    (1, 'Developpement'),
    (2, 'BDD'),
    (3, 'PPE'),
    (4, 'Francais'),
    (5, 'Anglais'),
    (6, 'Droit'),
    (7, 'Economie'),
    (8, 'Algorithme'),
    (9, 'Mathematiques'),
    (10, 'SI7');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `prof`
    --
     
    CREATE TABLE IF NOT EXISTS `prof` (
      `code_prof` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(20) DEFAULT NULL,
      `prenom` varchar(20) DEFAULT NULL,
      `email` varchar(20) DEFAULT NULL,
      `matiere_prof` varchar(20) DEFAULT NULL,
      `mdp` varchar(20) NOT NULL,
      `fonction` varchar(20) NOT NULL,
      PRIMARY KEY (`code_prof`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
    --
    -- Contenu de la table `prof`
    --
     
    INSERT INTO `prof` (`code_prof`, `nom`, `prenom`, `email`, `matiere_prof`, `mdp`, `fonction`) VALUES
    (1, 'test', 'test', 'test', 'test', 'test', 'utilisateur'),
    (2, 'raph', 'raph', 'raph', 'raph', 'raph', 'administrateur'),
    (3, 'poiuytr', 'poiuytr', 'poiuytr', 'poiuytr', 'poiuytr', '');
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    Merci de votre aide

  2. #2
    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
    Ouh la... Il y a un peu beaucoup trop de boucles dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($row = mysql_fetch_row($result)) {
    echo "<li>";
    for ($i = 0; $i < count($row); $i++) 
    {
    echo "$row[$i]";
    $result2 = mysql_query("SELECT chapitre FROM chapitre WHERE matiere = $i");
    while ($row2 = mysql_fetch_row($result2)) {
    for ($j = 0; $j < count($row2); $j++) 
    echo "$row2[$j]";
    Revient à dire :
    Pour chaque ligne récupérée dans la table des matières
        Pour chaque champ récupéré dans la ligne de la table des matières
            Afficher le champ 
            Rechercher les chapitres dont la matière est le numéro du champ
            Pour chaque ligne récupérée dans la table des chapitres
                Pour chaque champ récupéré dans la ligne de la table des chapitres
                    afficher le champ
    Donc
    1) Inutile de boucler sur les champs de la ligne. D'abord parce que tu ne récupères qu'un seul champ, et ensuite parce que si tu décides de récupérer le nom et le numéro de la matière, tu n'a pas envie d'afficher 2 fois les chapitres pour chaque matière.
    2) Dans ta table chapitre, le champ qui te permet de faire la liaison avec la matière contient le nom de la matière. Personnellement, j'aurais plutôt utilisé le champ "numero_matiere", mais ça marche aussi. Il faut donc que tu cherches à partir du nom de la matière et non pas à partir du n° de champ.

    En nettoyant les boucles, ça donne ça :
    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
    <div id="monmenu">
    <ul class="niveau1">
    <?php
    $db=mysql_connect("localhost", "root", "");
    mysql_select_db("dropdev",$db);
    $result = mysql_query("SELECT matiere FROM matiere");
     
    // pour chaque matiere
    while ($row = mysql_fetch_row($result)) {
    	echo "<li>";
    	echo $row[0]; // nom de la matière
    	// recherche des chapitres à partir du nom de la matière
    	$result2 = mysql_query("SELECT chapitre FROM chapitre WHERE matiere = '".$row[0]."'");
    	echo '<ul>';
    	// pour chaque chapitre
    	while ($row2 = mysql_fetch_row($result2)) {
    		echo '<li>'.$row2[0].'</li>'; // nom du chapitre
    	}
    	echo '</ul>';
    	echo "</li>";
    }
    ?>
    <ul>
    </div>
    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]

  3. #3
    Membre du Club
    Homme Profil pro
    Novice
    Inscrit en
    Mars 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Mars 2014
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Merci de ton aide Celira.

    J'étais conscient qu'il y avait trop de boucles dans mon code (jusqu'à me perdre moi même ^^") mais je ne voyais pas comment faire autrement vu que je suis novice dans la matière.

    Ton code à l'air de bien fonctionné, je vais essayer de continuer pour les cours et les exos
    Par contre au niveau de ma BDD, je suis conscient qu'elle n'est pas super ^^"
    Tu n'aurais pas quelques conseils à me donner pour m'améliorer car j'ai un prof de base de données qui s'y connait encore moins que moi en BDD... :/

  4. #4
    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
    Ta structure n'est pas trop mauvaise Il ya juste deux choses que je changerai :
    1) Une clé étrangère doit pointer vers un champ unique de la table référencée (en général, la clé primaire fait très bien l'affaire).
    Par exemple pour ta table exercice, tu as une clé étrangère vers la table chapitre (<=> un exercice appartient à un chapitre), il faudrait donc utiliser la valeur de num_chapitre (clé primaire de chapitre).
    Sinon, si tu as deux chapitres intitulés "Introduction" par exemple, aucun moyen de savoir à quel chapitre se rattache ton exercice.

    2) Étant donné la structure de tes tables, pour une matière, tu as plusieurs chapitres et pour un chapitre plusieurs cours. C'est voulu ?

    Tu peux jeter un oeil aux tutos de la rubrique SGBD & SQL (notamment à la série "SQL de A à Z", qui contient plein de trucs à connaitre)
    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]

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

Discussions similaires

  1. probléme avec requête SQL
    Par richard60 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/03/2007, 18h18
  2. Problème avec requête SQL avec variables
    Par harry25 dans le forum ASP
    Réponses: 1
    Dernier message: 03/01/2007, 03h41
  3. VBA avec requête SQL
    Par seba_stien dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 17/10/2006, 15h39
  4. [JDBC]probleme avec requête sql
    Par lkryss dans le forum JDBC
    Réponses: 16
    Dernier message: 10/06/2006, 01h44
  5. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 16h04

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