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 :

Chapitre, sous-chapitre & sous-sous-chapitre - éviter les boucles ?


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Chapitre, sous-chapitre & sous-sous-chapitre - éviter les boucles ?
    Bonjour à tous.
    Je suis en train de faire un site de tutoriaux informatiques en tout genre, et je suis bloqué sur un problème assez complexe (pour un gros débutant en SQL comme moi )

    En effet, j'ai 3 tables : Cours, Chapitres et Tutoriaux.
    Chaque cours peut contenir un nombre illimité de chapitres et chaque chapitre peut contenir un nombre illimité de tutoriaux. Il y a aussi la table Membres qui contiens les données des utilisateurs.

    Cependant, je ne sais pas comment éviter de mettre des requêtes dans des boucles (ce qui demande beaucoup de ressources).

    Je vous montre un peu mon code :

    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
    $req = mysql_query('
    	SELECT	c.cours_id, 
    		c.cours_user_id, 
    		c.cours_titre, 
    		c.cours_intro, 
    		c.cours_conclusion, 
    		DATE_FORMAT(c.cours_date, "%d/%m/%Y à %Hh%m") AS cours_date,
    		DATE_FORMAT(c.cours_update_date, "%d/%m/%Y à %Hh%m") AS cours_update_date,
    		c.cours_image,
    		m.user_pseudo,
    		m.user_avatar
    	FROM cours c
    		LEFT JOIN membres m ON c.cours_user_id = m.user_id
    	WHERE	c.cours_id = "'.$cours_id.'"
    	GROUP BY c.cours_id
    ');
     
    $cours = mysql_fetch_assoc($req)or die(redirection('index.php','Le cours sélectionné n\'existe pas'));
    Jusque là, pas de problèmes. Je séléctionne le cours et je fais une jointure avec la table membres pour afficher le pseudo de l'utilisateur qui a écrit le cours et son avatar.
    C'est après que les choses se gâtent :

    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
    $req = mysql_query('
    	SELECT	chap_id,
    		chap_titre,
    		chap_intro,
    		chap_conclusion
    	FROM	chapitres
    	WHERE	chap_cours_id = "'.$cours_id.'"
    	ORDER BY chap_id
    ');
     
    while($chapitre = mysql_fetch_assoc($req))
    {
    ?>
    <h2 id="#chapitre-<?php echo $chapitre['chap_id'] ?>"><?php echo $chapitre['chap_titre'] ?></h2>
    			<?php echo $chapitre['chap_intro'];
    Je sélectionne les chapitres et je fais une boucle.
    Maintenant, je veux afficher les tutoriaux (sous-chapitres) et je ne vois pas d'autre choix que de faire encore une boucle

    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
    $req2 = sql('
    				SELECT	tuto_id,
    					tuto_cat_id,
    					tuto_name,
    					tuto_image
    				FROM	tutoriaux
    				WHERE	tuto_cat_id = "'.$chapitre['chap_id'].'"
    				ORDER BY tuto_date
    				  ');
    			while($tuto = mysql_fetch_assoc($req2))
    			{
    				echo $tuto['tuto_name'] . '<br />';
    				?>
    				<div class="tuto_sommaire">
    				<img src="<?php echo $tuto['tuto_image'] ?>" alt="" />
    			</div>
    				<?php
    			}
    			echo $chapitre['chap_conclusion'];
    Voilà. Le problème c'est qu'en faisant cela, je demande beaucoup de ressources à MySQL. Je suis presque sûr qu'il y a un moyen d'éviter ça et je demande votre aide.
    Peut-être je dois utiliser une autre structure pour ma base de données ?
    Merci d'avance de votre aide.

  2. #2
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Tu peux récuperer tes cours/chapitres/tutoriaux en une seule requête, en prennant soint de la classer (avec un order by) par nom de cours/nom de chapitre/nom de tutoriaux.

    Dans l'esprit :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from cours, chapitres, tutoriaux where 
    cours.id_cours=chapitres.id_cours and
    chapitres.id_chapitres=tutoriaux.id_chapitres 
    order by nom_cours asc, nom_chapitres asc, nom_tutoriaux asc

    Après, tu ne fais plus qu'une seule boucle php qui va tout lire. Tu sais que tu va passer au chapitre "suivant", lorsque le nom de chapitre change d'un enregistrement a l'autre. Dans la mesure ou on a pris soin de classer, tu ne risque pas de te retrouver avec deux fois le même chapitre (et des cours differents) dans deux endroits.
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

Discussions similaires

  1. [Débutant] Filtre sur RichTextBox - éviter les boucles
    Par Symone dans le forum VB.NET
    Réponses: 5
    Dernier message: 26/08/2014, 15h22
  2. [SQL 2k8] Est ce possible d'éviter les boucles
    Par lerieure dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/04/2011, 09h41
  3. [C#] Events, éviter les boucles infinies
    Par levalp dans le forum Windows Forms
    Réponses: 50
    Dernier message: 02/12/2007, 14h12
  4. [SQL - procStock ] optimisation du code (éviter les boucles)
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/10/2005, 17h22

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