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 :

Intercallage et affichage avec des données issues de plusieurs tables SQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut Intercallage et affichage avec des données issues de plusieurs tables SQL
    Bonjour,

    Me revoilà avec un problème d'affichage.

    Je précise qu'au niveau des insertions, les données s'insèrent avec les bons identifiants.

    J'ai 4 tables : cours, chapitres, reponses, questions et une table relationnelle qui permet de faire les relations entre les 4 tables.

    Sur la page d'affichage, toutes les données s'affichent mais je rencontre un problème pour l'affichage des questions/exercices. Les questions/exercices dépendent des chapitres. Les questions/exercice prennent en compte l'identifiant du cours mais pas l'identifiant du chapitre. Je précise qu'il y a une fonction javascript, qui crée un sommaire avec les balises de titres (de <h1> jusqu'à <h7>) avec une numérotation automatique.

    J'ai essayé plusieurs fois, j'ai obtenu des résultats différents (affichage du bloc : "Exercices" dans chaque chapitre, etc…).

    Voici mon raisonnement :
    Pour chaque chapitre trouvé, tu vas voir dans la table des questions s'il y en a avec l'identifiant du chapitre : si oui, tu affiches le bloc : "Exercice" sinon tu passes au prochain chapitre (ainsi de suite pour chaque chapitre trouvé).

    Voici les requêtes SQL :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Sélectionnement de l'identifiant de l'élève connecté
    $selection_identifiant_id_eleve_connecte = mysql_query("SELECT id_utilisateur FROM test_site_utilisateur WHERE id_utilisateur=".$_SESSION['id_utilisateur']." AND (acces_utilisateur='1' OR acces_utilisateur='5')") or die ('Erreur lors de la requête SQL qui permet de sélectionner l\'élève connecté.');
    // Sélectionnement du bon Cours/TP
    $selection_cours_tp = mysql_query("SELECT DISTINCT(t4.titre_chapitre),t2.titre_cours,t2.introduction_cours,t2.conclusion_cours,t2.date_publication_cours,t2.matiere_cours,t2.classe_cours,t4.contenu_chapitre, t2.id_cours FROM test_site_relation_cours_tp_utilisateur_v2 t1,test_site_cours_v2 t2,test_site_utilisateur t3,test_site_chapitres_v2 t4 WHERE t3.id_utilisateur=".$_SESSION['id_utilisateur']." AND t1.id_chapitre=t4.id_chapitre AND t1.id_cours=t2.id_cours AND (acces_utilisateur='1' OR acces_utilisateur='5') AND t2.id_cours='$id_cours_tp' AND t4.id_cours='$id_cours_tp'") or die("Erreur sur la requête SQL qui sélectionne toutes les informations du Cours/TP (sauf les questions et les réponses).");
    // Récupération des questions du Cours/TP dans la base de données - Deuxième version
    $query_selection_questions_cours_tp=mysql_query("SELECT DISTINCT(contenu_question) FROM test_site_questions_v2 t1, test_site_cours_v2 t2 WHERE t1.id_cours=t2.id_cours AND t2.id_cours='$id_cours_tp'") or die('Erreur lors de la sélection des questions d\'un Cours/TP'.mysql_error());

    Voici la partie du code actuel (où toutes les questions se mettent sous le premier chapitre alors qu'il y en a une qui doit se mettre sous le second chapitre) :
    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
    28
    29
    30
    31
    32
     $id_cours_tp = intval($_POST['id_cours_tp']);
    <?php
    if(mysql_num_rows($selection_identifiant_id_eleve_connecte)==1) {
          if(mysql_num_rows($query_selection_titre_cours_tp)==1) {
              echo "<header>".$_SESSION['titre_cours']."</header>";
          }
          echo '<div id="sommaire"></div>';
    		  if(mysql_num_rows($selection_cours_tp)>=1) {
    		  $classe_matiere=mysql_fetch_assoc($selection_classe_matiere);
    			  echo '<span class="informations_importantes">Classe : </span>'.html_entity_decode(stripslashes($classe_matiere['classe_cours']))."<br />";
                  echo '<span class="informations_importantes">Matière : </span>'.html_entity_decode(stripslashes($classe_matiere['matiere_cours']));
     
              while ($donnees_cours_tp_eleve = mysql_fetch_assoc($selection_cours_tp)) {
                  echo html_entity_decode(stripslashes($donnees_cours_tp_eleve['date_depot_cours']));
                  echo html_entity_decode(stripslashes($donnees_cours_tp_eleve['introduction_cours']));
                  echo "<h1>".html_entity_decode(stripslashes($donnees_cours_tp_eleve['titre_chapitre']))."</h1>";  
                  echo html_entity_decode(stripslashes($donnees_cours_tp_eleve['contenu_chapitre']));
    	            // Récupération du nombre d'enregistrements des questions du Cours/TP dans la base de données pour faire qu'un bloc "Exercices" s'il y a plusieurs questions (à voir avec une question par chapitre) - Deuxième version - Il faut améliorer pour que les questions s'affichent par rapport aux chapitres (au bon endroit)
                  $nombre_de_questions = mysql_num_rows($query_selection_questions_cours_tp);
                      // Boucle qui permet d'afficher la question et la zone de texte correspondante - DEBUT
                      for ($i = 0; $i < $nombre_de_questions; $i++) {
    	 $donnees_exercice_question_cours_tp_eleve = mysql_fetch_assoc($query_selection_questions_cours_tp);
                   if(mysql_num_rows($query_selection_questions_cours_tp)>=1) {               
    			echo '<div class="exercice">'.html_entity_decode(stripslashes($donnees_exercice_question_cours_tp_eleve['contenu_question'])).'<a name="question'.($i+1).'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.($i+1).'</b> <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.($i+1).'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.($i+1).'" onChange="go('.($i+1).', this.value);"></textarea></div></div>';
    }
                      // Boucle qui permet d'afficher la question et la zone de texte correspondante - FIN
    	  	  }
            echo html_entity_decode($donnees_cours_tp_eleve['conclusion_cours']); 
    }
    }
    }
    ?>

    Ma question est : Comment afficher les questions et les zones de texte correspondantes (du bon cours) au bon endroit par rapport aux chapitres ? S'il n'y a pas de question, ce n'est pas la peine d'afficher le bloc : "Exercice". Actuellement, toutes les questions s'affichent sous le premier chapitre et ne prennent pas en compte le champs id_chapitre de la table des questions. De plus, le bloc "Exercice" s'affiche même quand il n'y a pas de question.

    Je viens vers vous en ayant réfléchi, je ne viens pas en "touriste" !

    Cordialement

  2. #2
    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
    Une jointure entre deux tables s'écrit :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT champs FROM tableA
    JOIN tableB on tableA.champA = tableB.champB

    Ensuite en nommant tes alias t1, t2, t3 etc. il est evidemment impossible de s'y retrouver.

    Egalement on peut se demander ce que contient une table "site_relation_cours_tp_utilisateur".

    Bref, imaginons que tu aies bien une relation entre la table question et la table chapitre pour matérialiser que les questions font partie de chapitres.
    Si tu voulais afficher toutes les questions des chapitres 1 et 25 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT champs FROM questions
    JOIN chapitre on questions.chapitre_id = chapitre.id
    WHERE chapitre.id IN (1,25)
    ORDER BY chapitre
    Il n'y a pas a faire deux requêtes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Merci de ta réponse.

    Juste pour information, voici les :

    Table des cours :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE IF NOT EXISTS `test_site_cours_v2` (
      `id_cours` int(11) NOT NULL AUTO_INCREMENT,
      `titre_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      `auteur_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      `introduction_cours` longtext CHARACTER SET utf8 NOT NULL,
      `conclusion_cours` longtext CHARACTER SET utf8 NOT NULL,
      `date_publication_cours` datetime NOT NULL,
      `date_cloture_validation_cours` datetime NOT NULL,
      `date_debut_validation_cours` datetime NOT NULL,
      `matiere_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      `classe_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_cours`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=218 ;

    Table des chapitres :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `test_site_chapitres_v2` (
      `id_chapitre` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `titre_chapitre` varchar(255) CHARACTER SET utf8 NOT NULL,
      `contenu_chapitre` longtext CHARACTER SET utf8 NOT NULL,
      `date_depot` datetime NOT NULL,
      `auteur_chapitre` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_chapitre`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=557 ;

    Table des questions :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `test_site_questions_v2` (
      `id_question` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `id_chapitre` int(11) NOT NULL,
      `contenu_question` varchar(255) CHARACTER SET utf8 NOT NULL,
      `reponse_question` varchar(255) CHARACTER SET utf8 NOT NULL,
      `date_depot` datetime NOT NULL,
      `auteur_question` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_question`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2385 ;

    Table des réponses :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `test_site_reponses_v2` (
      `id_reponse` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `id_chapitre` int(11) NOT NULL,
      `texte_reponse` longtext CHARACTER SET utf8 NOT NULL,
      `question_reference` varchar(255) CHARACTER SET utf8 NOT NULL,
      `date_depot` datetime NOT NULL,
      `auteur_reponse` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_reponse`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3109 ;

    Table relationnelle :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `test_site_relation_cours_tp_utilisateur_v2` (
      `id_rel_cours_utilisateur_chapitre_question_reponse` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `id_utilisateur` int(11) NOT NULL,
      `id_chapitre` int(11) NOT NULL,
      `id_question` int(11) NOT NULL,
      `id_reponse` int(11) NOT NULL,
      `date_depot_rel_cours_user` datetime NOT NULL,
      PRIMARY KEY (`id_rel_cours_utilisateur_chapitre_question_reponse`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4159 ;

    Cordialement

  4. #4
    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
    Dans un modèle relationnelle, ta "table relationnelle" n'existe pas.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Comme tu me l'as soumis, j'ai remplacé les deux requêtes SQL par cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $query_selection_questions_cours_tp=mysql_query("SELECT titre_chapitre,contenu_chapitre,contenu_question
    FROM test_site_chapitres_v2
    JOIN test_site_questions_v2
    ON test_site_chapitres_v2.id_chapitre=test_site_questions_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours = '$id_cours_tp'")
    or die('Erreur lors de la sélection des questions d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL

    J'ai toujours cette requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Sélectionnement de l'identifiant de l'élève connecté
    $selection_identifiant_id_eleve_connecte = mysql_query("SELECT id_utilisateur
    FROM test_site_utilisateur
    WHERE id_utilisateur=".$_SESSION['id_utilisateur']."
    AND (acces_utilisateur='1' OR acces_utilisateur='5')")
    or die ('Erreur lors de la requête SQL qui permet de sélectionner l\'élève connecté.'); // Envoie une requête à un serveur MySQL

    Voici le bloc d'affichage :

    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
      <?php
      if(mysql_num_rows($selection_identifiant_id_eleve_connecte)==1) {
              echo "<header>".$_SESSION['titre_cours']."</header>";
          echo '<div id="sommaire"></div>';
              while ($donnees_cours_tp_eleve = mysql_fetch_assoc($query_selection_questions_cours_tp)) {
     
                  echo html_entity_decode(stripslashes($donnees_cours_tp_eleve['date_depot_cours']));
                  echo html_entity_decode(stripslashes($donnees_cours_tp_eleve['introduction_cours']));
                  echo "<h1>".html_entity_decode(stripslashes($donnees_cours_tp_eleve['titre_chapitre']))."</h1>";
     
                  echo html_entity_decode(stripslashes($donnees_cours_tp_eleve['contenu_chapitre']));
     
     
                  $nombre_de_questions = mysql_num_rows($query_selection_questions_cours_tp);
                      // Boucle qui permet d'afficher la question et la zone de texte correspondante - DEBUT
                      for ($i = 0; $i < $nombre_de_questions; $i++) {
    	 $donnees_exercice_question_cours_tp_eleve = mysql_fetch_assoc($query_selection_questions_cours_tp);
                   if(mysql_num_rows($query_selection_questions_cours_tp)>=1) {                  
     
    						echo '<div class="exercice">'.html_entity_decode(stripslashes($donnees_exercice_question_cours_tp_eleve['contenu_question'])).'<a name="question'.($i+1).'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.($i+1).'</b> <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.($i+1).'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.($i+1).'" onChange="go('.($i+1).', this.value);"></textarea></div></div>';
    }               
                      // Boucle qui permet d'afficher la question et la zone de texte correspondante - FIN
    	  	  }
            echo html_entity_decode($donnees_cours_tp_eleve['conclusion_cours']); 
    }
     }      
    ?>

    Alors maintenant, tous les chapitres ne s'affichent plus. Si vous pouvez me faire un code qui permet d'afficher tout les chapitres avec les questions qui s'affichent au bon endroit, ce serait parfait.

  6. #6
    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
    Première chose, écris ton code proprement en indentant bien.
    Exemple de ce qu'il ne faut pas avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $donnees_exercice_question_cours_tp_eleve = mysql_fetch_assoc($query_selection_questions_cours_tp);
                   if(mysql_num_rows($query_selection_questions_cours_tp)>=1) {                  
     
    						echo '<div class="exercice">'.html_entity_decode(stripslashes($donnees_exercice_question_cours_tp_eleve['contenu_question'])).'<a name="question'.($i+1).'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.($i+1).'</b> <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.($i+1).'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.($i+1).'" onChange="go('.($i+1).', this.value);"></textarea></div></div>';
    }               
                      // Boucle qui permet d'afficher la question et la zone de texte correspondante - FIN
    	  	  }
    Ensuite html_entity_decode(stripslashes()) est à bannir : le HTML dans ta base de données ne doit ni contenir des entités HTML, ni des slashes en trop ; il n'y a donc pas besoin de les retirer/convertir en lecture.
    Donc si tu as un htmlentities() dans des requêtes d'insertion, enlève le. mysql_real_escape_string() est là pour echapper les données.

    Continuons ...
    Pour parcourir tous les résultats d'une requête on ne fait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      for ($i = 0; $i < $nombre_de_questions; $i++) {
    	 $donnees_exercice_question_cours_tp_eleve = mysql_fetch_assoc($query_selection_questions_cours_tp);
    On fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ($row = mysql_fetch_assoc($query_questions);
    Tu remarqueras au passage que j'ai considérablement raccourci le nom de tes variables. On peut avoir des variables tout à fait explicite sur leur contenu et leur rôle sans écrire "$donnees_exercice_question_cours_tp_eleve". Au contraire tes variables a rallonge ne sont pas lisibles et rendent le code illisble.

    Pour finir, tu comptes deux fois le nombre de lignes (ligne 14 et ligne 18). Celui de la ligne 18 est doublement inutile : tu connais déjà le résultat et tu es déjà engagé dans une boucle pour afficher les lignes, il est donc un peu tard pour vérifier s'il y en a.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Voici la requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT (
    titre_chapitre
    ), contenu_chapitre, contenu_question
    FROM test_site_chapitres_v2
    LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours =  '214'
    AND test_site_questions_v2.id_cours =  '214'
    AND test_site_chapitres_v2.date_depot = test_site_questions_v2.date_depot

    Elle sélectionne tous les titre_chapitre et contenu_chapitre alors que je voudrais sélectionner que les titres et les contenus des chapitres du bon cours (grâce à l'identifiant du cours). 214 est un exemple.

    On va s'occuper de cette requête avant de s'attaquer sur la boucle.

  8. #8
    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
    Si j'ai bien compris ton organisation une question fait partie d'un chapitre et d'un seul ; un chapitre fait partie d'un cours et d'un seul.
    Si c'est bien ça, id_cours n'a rien à faire dans la table question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND test_site_chapitres_v2.date_depot = test_site_questions_v2.date_depot
    Pourquoi faut-i que le chapitre et la question aient la même date_depot ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Voici ce que j'aimerais :

    J'ai une page qui permet de poster des cours.

    J'enregistre les informations générales du cours (titre, date dépot, auteur, etc...) dans la table test_site_cours_v2.

    Un cours se découpe en chapitres. Les chapitres sont sauvegardés dans la table test_site_chapitres_v2 avec l'identifiant du cours trouvé dans la table test_site_cours_v2. Un chapitre correspond à un cours uniquement.

    Dans les chapitres, il y a souvent des questions que j'enregistre dans la table test_site_questions_v2 avec l'identifiant du cours trouvé dans la table test_site_cours_v2 et l'identifiant du chapitre trouvé dans la table test_site_chapitres_v2.

    On verra plus tard pour les réponses...

    J'ai aussi une table pour les utilisateurs.

    Pour faire toutes les relations, j'enregistre chaque identifiant dans test_site_relation_cours_tp_utilisateur_v2.

    Au niveau de l'insertion, tout fonctionne.

    C'est sur la page d'affichage des cours que j'ai un problème. En effet, je voudrais intercaler les questions (du bon cours) sous le chapitre correspondant. De plus, un chapitre ne pouvant pas contenir de question, je voudrais que le bloc "Exercice" ne s'affiche pas sous tous les chapitres.

    Après ces explications, je te met le traitement PHP de la page qui affiche un cours :

    Requêtes SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
          // Sélectionnement de l'identifiant de l'élève connecté
          $selection_identifiant_id_eleve_connecte = mysql_query("SELECT id_utilisateur
    FROM test_site_utilisateur
    WHERE id_utilisateur=".$_SESSION['id_utilisateur']."
    AND (acces_utilisateur='1'
    OR acces_utilisateur='5')")
    or die ('Erreur lors de la requête SQL qui permet de sélectionner l\'élève connecté.'); // Envoie une requête à un serveur MySQL
     
          $query_questions=mysql_query("SELECT DISTINCT(titre_chapitre),contenu_chapitre,contenu_question
    FROM test_site_chapitres_v2
    JOIN test_site_questions_v2
    ON test_site_chapitres_v2.id_chapitre=test_site_questions_v2.id_chapitre") or die('Erreur lors de la sélection des questions d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL

    Traitement 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
          $id_cours_tp = intval($_POST['id_cours_tp']);
    <?php
    if(mysql_num_rows($selection_identifiant_id_eleve_connecte)==1) {
    	echo "<header>".$_SESSION['titre_cours']."</header>";
    	echo '<div id="sommaire"></div>';
    	$nombre_de_questions = mysql_num_rows($query_questions);
    	while ($row = mysql_fetch_assoc($query_questions)) {
    		echo $row['date_depot_cours'];
    		echo $row['introduction_cours'];
    		echo "<h1>".$row['titre_chapitre']."</h1>";
    		echo $row['contenu_chapitre'];
    		echo '<div class="exercice">'.$row['contenu_question'].'<a name="question'.($i+1).'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.($i+1).'</b> <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.($i+1).'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.($i+1).'" onChange="go('.($i+1).', this.value);"></textarea></div></div>';
    		echo $row['conclusion_cours'];
    		}
     } 
     ?>

    Ce code est celui avec les modifications effectuées, j'ai gardé l'ancien. Si tu veux, je te le passe.

    Lors des essais, il ne tient pas en compte l'identifiant du chapitre donc il affiche tous les chapitres quelque soit le cours choisi et il affiche un chapitre deux fois (rapport avec les questions). Pour ls questions, elles s'insèrent dans les bons chapitres. Par contre, s'il y en a plusieurs le chapitre s'affiche plusieurs fois.

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Voici les requêtes SQL :
    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
          // Récupération du titre du Cours/TP dans la base de données - Deuxième version
          $query_selection_titre_cours_tp=mysql_query("
    SELECT DISTINCT(titre_cours)
    FROM test_site_questions_v2 t1, test_site_cours_v2 t2
    WHERE t1.id_cours=t2.id_cours
    AND t2.id_cours='$id_cours_tp'")
    or die('Erreur lors de la sélection du titre d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
     
          // Sélectionnement de l'identifiant de l'élève connecté
          $selection_identifiant_id_eleve_connecte = mysql_query("
    SELECT id_utilisateur
    FROM test_site_utilisateur
    WHERE id_utilisateur=".$_SESSION['id_utilisateur']."
    AND (acces_utilisateur='1'
    OR acces_utilisateur='5')")
    or die ('Erreur lors de la requête SQL qui permet de sélectionner l\'élève connecté.'); // Envoie une requête à un serveur MySQL
     
          // Sélectionnement du bon Cours/TP
          $selection_cours_tp = mysql_query("
    SELECT DISTINCT(t4.titre_chapitre),t2.titre_cours,t2.introduction_cours,t2.conclusion_cours,t2.date_publication_cours,t2.matiere_cours,t2.classe_cours,t4.contenu_chapitre, t2.id_cours
    FROM test_site_relation_cours_tp_utilisateur_v2 t1,test_site_cours_v2 t2,test_site_utilisateur t3,test_site_chapitres_v2 t4
    WHERE t3.id_utilisateur=".$_SESSION['id_utilisateur']."
    AND t1.id_chapitre=t4.id_chapitre
    AND t1.id_cours=t2.id_cours AND (acces_utilisateur='1' OR acces_utilisateur='5')
    AND t2.id_cours='$id_cours_tp'
    AND t4.id_cours='$id_cours_tp'")
    or die("Erreur sur la requête SQL qui sélectionne toutes les informations du Cours/TP (sauf les questions et les réponses)."); // Envoie une requête à un serveur MySQL

    Voici le traitement 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
      <?php
      if(mysql_num_rows($selection_identifiant_id_eleve_connecte)==1) {
          if(mysql_num_rows($query_selection_titre_cours_tp)==1) {
    		  echo "<header>".$_SESSION['titre_cours']."</header>";
    		  echo '<div id="sommaire"></div>';
              echo '<span class="informations_importantes">Date de clôture de validation de ce Cours/TP :</span> '.$_SESSION['date_cloture_validation_cours'];
    		  //if(mysql_num_rows($selection_cours_tp)>=1) {
    			  $classe_matiere=mysql_fetch_assoc($selection_classe_matiere);
    			  echo '<span class="informations_importantes">Classe : </span>'.$classe_matiere['classe_cours']."<br />";
                  echo '<span class="informations_importantes">Matière : </span>'.$classe_matiere['matiere_cours'];
    			  $nombre_de_questions = mysql_num_rows($query_questions);
    			  while ($row = mysql_fetch_assoc($query_questions)) {
    				  echo $row['date_depot_cours'];
    				  echo $row['introduction_cours'];
    				  echo "<h1>".$row['titre_chapitre']."</h1>";
    				  echo $row['contenu_chapitre'];
    	   			  echo '<div class="exercice">'.$row['contenu_question'].'<a name="question'.($i+1).'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.($i+1).'</b> <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.($i+1).'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.($i+1).'" onChange="go('.($i+1).', this.value);"></textarea></div></div>';
    				  echo $row['conclusion_cours']; 
    				}
    } 
    }
    ?>

    On a avancé. En effet, maintenant la page affiche uniquement le cours choisi. Il reste un problème : le nombre de questions. Quand il y a plusieurs questions (2 ou plus), avant d'afficher la seconde il met un title (<h1>) avec le même titre et contenu que le précédent et bloque l'affichage des chapitres suivants. Autrement dit, ce code affiche une question par titre (s'il y en a plusieurs, le titre et le contenu s'affichent plusieurs fois).

    En tout cas, ça avance mais il reste un problème à régler...

  11. #11
    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
    Dans les chapitres, il y a souvent des questions que j'enregistre dans la table test_site_questions_v2 avec l'identifiant du cours trouvé dans la table test_site_cours_v2 et l'identifiant du chapitre trouvé dans la table test_site_chapitres_v2.
    comme je t'ai dit si la question fait partie d'un chapitre qui fait partie d'un cours, "cours_id" est dans "chapitre" pas dans "question".
    Tes jointures ne sont toujours pas faites correctement et tu persistes avec les DISTINCT.
    Ton code n'etant toujours pas indenté, il est toujours pénible à lire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    J'ai compris mais là tout marche à part la gestion de l'affichage des questions.

    Il faut gérer :
    - s'il n'y a pas de question/exercice, pas d'affichage du bloc "Exercice" et passage au chapitre suivant,
    - s'il y a plusieurs questions/exercices, il faut les afficher dans un seul bloc "Exercice" et pas afficher plusieurs title (<h1>) avec le même titre sans oublier de passer au chapitre suivant

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Je comprend pourquoi il y a le problème de la multiplication ou de l'absence des questions mais je n'arrive pas à le régler.

    Voici mon raisonnement :
    La requête SQL sélectionne les données tant qu'il y a des enregistrements en commun dans les deux tables. S'il n'y a pas de question, dans mon cas, elle s'arrête.

    Le problème qu'il y a :
    *) quand il y a plusieurs questions, il affiche plusieurs fois le titre et le contenu du chapitre (Objectif recherché : afficher toutes les questions avec leurs zones de texte correspondantes dans un bloc : "Exercices" et passer au chapitre suivant.)
    *) quand il y a aucune question, il n'affiche rien (Objectif recherché : afficher le cours avec ses chapitres et enlever le bloc : "Exercices".)

    Comment puis-je le régler ?

    PS : Je n'ai pas changé les requêtes SQL pour les identifiants.J'ai indenté le code. Veux-tu que je le remette ?

  14. #14
    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 avais mis un LEFT JOIN, c'était bien ça.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT test_site_chapitres_v2.id_chapitre, titre_chapitre, contenu_question
    FROM test_site_chapitres_v2
    LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours =  214
    ORDER BY id_chapitre ASC

    Une méthode très simple pour regrouper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $id_chapitre = 0;
    while ($row = mysql_fetch_assoc($result)) {
         if ($row['id_chapitre'] != $id_chapitre) {
                echo '<h1>' . $row['titre_chapitre'] . '</h1>';
                $id_chapitre = $row['id_chapitre']
         }
     
         if ($row['contenu_question']) {
              echo '<p>' . $row['contenu_question'] . '</p>';
         }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    C'est bon ça marche, je te remercie...

    J'ai mis le sujet comme RESOLU.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  2. Réponses: 2
    Dernier message: 04/06/2007, 16h38
  3. Réponses: 2
    Dernier message: 21/02/2007, 11h22
  4. [MySQL] Remplir un array() avec des données issues d'une bdd
    Par fichtre! dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/12/2006, 17h03
  5. Réponses: 6
    Dernier message: 11/07/2006, 10h56

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