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

Langage PHP Discussion :

Boucle récursive pour effectuer un fil d'ariane avec requête [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut Boucle récursive pour effectuer un fil d'ariane avec requête
    Bonjour,

    Voici mon problème et il me tient à coeur .

    Point de vu général :
    J'ai un site dans lequel je souhaite faire un fil d'ariane du style :
    Vous êtes : Accueil > téléchargement

    Mais contrairement à beaucoup je souhaite afficher le nom téléchargement (dans l'exemple) via une requête sql et en fonction d'un id passé dans l'url (en GET)

    Il s'agit donc d'une boucle récursive car je ne connais pas d'avance la profondeur de mes rubriques. Or il s'agit d'une notion que je ne maîtrise pas du tout et je souhaiterai un coup de main pour réalisé ceci. j'ai vu des explication théorique mais ...
    Point de vu technique :
    Une table : rubrique
    Des colonnes : id_rubrique, id_parent, nom_rubrique

    Exemple de suite possible : téléchargement > windows > audio
    SOIT

    id_rubrique
    1
    id_parent
    0
    nom_rubrique
    téléchargement

    id_rubrique
    8
    id_parent
    1
    nom_rubrique
    Windows

    id_rubrique
    9
    id_parent
    8
    nom_rubrique
    audio


    Voilà.
    Je comprend bien qu'il faille faire une fonction qui fait appel à elle même mais là... Je souhaiterai voir la requête pour mieux comprendre.

    Si vous aviez possibilité de me faire la requête tout en m'indiquant ce qui se passe cela serait vraiment super sympa car je galère depuis tellement longtemps avec ça.

    Merci pour ceux qui prendront le temps de répondre car une fois que j'aurai ce code je pourrais l'adapter pour mon menu etc donc s'il vous plaît...

    Merci et bonne journée à tous.

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Tu n'as pas vraiment obligé de faire ça en récursif, personnellement je ferai simplement une boucle qui dit "tant que la rubrique récupérée n'est pas une racine alors je cherche son parent"

    En prenant l'exemple de ton post ca donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_rubriquee, id_parents FROM rubriques where id_rubrique = TON_ID
    Et tu recupères l'id parent, tu en trouverais un là, donc tu ferais la requete avec l'id et tu aurais comme nom_rubrique : PHP et comme parent : Forum des professionnels en informatique
    Tu fais encore la requete et cette fois tu t'apercevrais que id_parent = 0 et donc que tu as atteins le sommet.

    J'espère avoir été compréhensible

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut Ok, voyons
    Citation Envoyé par koopajah Voir le message
    Tu n'as pas vraiment obligé de faire ça en récursif, personnellement je ferai simplement une boucle qui dit "tant que la rubrique récupérée n'est pas une racine alors je cherche son parent"

    En prenant l'exemple de ton post ca donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_rubriquee, id_parents FROM rubriques where id_rubrique = TON_ID
    Et tu recupères l'id parent, tu en trouverais un là, donc tu ferais la requete avec l'id et tu aurais comme nom_rubrique : PHP et comme parent : Forum des professionnels en informatique
    Tu fais encore la requete et cette fois tu t'apercevrais que id_parent = 0 et donc que tu as atteins le sommet.

    J'espère avoir été compréhensible
    D'accord mais est-ce que cela te dérange de me faire la requête pour que je puisse voir concrètement ce que cela donnerai alors ?
    Je sais que ça fait beaucoup mais j'ai tellement galèré que là, je n'en peut plus...
    Merci d'avance

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par eltyty Voir le message
    D'accord mais est-ce que cela te dérange de me faire la requête pour que je puisse voir concrètement ce que cela donnerai alors ?
    Je sais que ça fait beaucoup mais j'ai tellement galèré que là, je n'en peut plus...
    Merci d'avance
    Il me semble t'avoir quasiment donné l'exemple, enfin bon, prenons la première requete, celle qui va récupérer le nom de la rubrique en cours et l'identifiant du parent :

    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
     
    if(isset($_GET['id_rubrique'])
    {
    $id_rubrique = $_GET['id_rubrique'];
    echo "La rubrique en cours a l'identifiant $id_rubrique";
    $requete = "SELECT nom_rubrique, id_parent FROM rubrique where id_rubrique = " . $id_rubrique; 
     
    // ... faire la requete + récupérer le résultat + l'afficher
     
    // si on a un id parent, alors on refait la meme requete avec le nouvel id_parent
    }
    else
    {
    echo "Vous n'avez pas de rubrique en cours";
    }
    Cette requete devrait prendre l'identifiant de la rubrique en cours dans le paramètre id_rubrique dans l'url et s'il existe aller chercher dans la base de données le nom de la rubrique et l'identifiant du parent.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut ok
    Citation Envoyé par koopajah Voir le message
    Il me semble t'avoir quasiment donné l'exemple, enfin bon, prenons la première requete, celle qui va récupérer le nom de la rubrique en cours et l'identifiant du parent :

    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
     
    if(isset($_GET['id_rubrique'])
    {
    $id_rubrique = $_GET['id_rubrique'];
    echo "La rubrique en cours a l'identifiant $id_rubrique";
    $requete = "SELECT nom_rubrique, id_parent FROM rubrique where id_rubrique = " . $id_rubrique; 
     
    // ... faire la requete + récupérer le résultat + l'afficher
     
    // si on a un id parent, alors on refait la meme requete avec le nouvel id_parent
    }
    else
    {
    echo "Vous n'avez pas de rubrique en cours";
    }
    Cette requete devrait prendre l'identifiant de la rubrique en cours dans le paramètre id_rubrique dans l'url et s'il existe aller chercher dans la base de données le nom de la rubrique et l'identifiant du parent.
    D'accord mais ce n'est pas plus lent de faire ça qu'une fonction récursive ?
    En tout cas merci de cette réactivité et de bien vouloir m'aider.
    vraiment Merci

  6. #6
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Faire une boucle for qui va enchainer les requetes ne me parait pas plus lent que de faire une fonction qui fera de même.
    D'un autre coté si votre nombre de rubrique est assez "limité" il peut être plus simple de récupérer toutes les rubriques et ensuite de traiter le fil d'ariane en PHP.

  7. #7
    Membre averti
    Homme Profil pro
    Lead Dev Web
    Inscrit en
    Avril 2005
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lead Dev Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2005
    Messages : 282
    Points : 390
    Points
    390
    Par défaut
    Bah c'est quand même plus long plusieurs appels sql dans une boucle que un appel et une boucle qui test.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut oui mais
    Je vois bien ce que tu veux mais du coup j'ai toujours le même soucis de profondeur. Voici ce que j'ai fait du coup mais je pense que j'ai loupé qq chose :

    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
     
    		IF(EMPTY($_GET['som'])AND!EMPTY($_GET['rub'])){
    			$g_id_rub=$_GET['rub'];//faire un controle si vide!!!!!!!!!!!!!!!!!!!!!!!
    			$sql->query("SELECT id_rubrique,id_parent,titre  FROM rubriques WHERE id_rubrique='".$g_id_rub."';","rub");
    			$row_sec=$sql->fetch_object("rub");
    				$id_parent=$row_sec->id_parent;
    				$id_rub_voulu=$row_sec->id_rubrique;
    				$nom_rub_voulu=$row_sec->titre;
     
    			IF($id_parent <>0){
    			//LORSQUE QUE LA RUBRIQUE À UN PARENT
    				$sql->query("SELECT id_rubrique,id_parent,titre  FROM rubriques WHERE id_rubrique='".$id_parent."';","nom_ssrub");
    				$row_parent=$sql->fetch_object("nom_ssrub");		
    				$nom_parent=$row_parent->titre;
    				$id_rub=$row_parent->id_rubrique;
    				$id_parent_dernier=$row_parent->id_parent;
    				$fils =" . ".$nom_parent;
    			}
    			$fils .=" > ".$nom_rub_voulu;
     
    			}
    			$this->fils_ariane .=$fils;
    Ceci marche mais cela ne m'affiche que deux niveaux, le nom de la rubrique (en GET) et son parent mais comment faire pour que ça fasse ça jusqu'à temps que la rubrique en GET est un id_parent à 0 ??

    Merci en tout cas ça avance.

  9. #9
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Il faut en fait rajouter une boucle. Quand vous avez le parent de votre rubrique, il faut boucler tant que vous n'avez pas eu la racine

    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
    <?php
    IF(EMPTY($_GET['som'])AND!EMPTY($_GET['rub']))
    {
    	$g_id_rub		= $_GET['rub'];//faire un controle si vide!!!!!!!!!!!!!!!!!!!!!!!
    	$sql->query("SELECT id_rubrique,id_parent,titre  FROM rubriques WHERE id_rubrique='".$g_id_rub."';","rub");
    	$row_sec		= $sql->fetch_object("rub");
    	$id_parent		= $row_sec->id_parent;
    	$id_rub_voulu	= $row_sec->id_rubrique;
    	$nom_rub_voulu	= $row_sec->titre;
     
    	// On initalise le fil d'ariane a la rubrique fille
    	$fils =" > ".$nom_rub_voulu;
     
    	// Tant que la rubrique a un parent on cherche son parent
    	WHILE($id_parent <>0){
    		// On récupère les infos sur le parent
    		$sql->query("SELECT id_rubrique,id_parent,titre  FROM rubriques WHERE id_rubrique='".$id_parent."';","nom_ssrub");
    		$row_parent	= $sql->fetch_object("nom_ssrub");		
    		$nom_parent	= $row_parent->titre;
    		$id_rub		= $row_parent->id_rubrique;
    		$id_parent		= $row_parent->id_parent;
     
    		// On ajout le parent en tête du fil d'ariane
    		$fils 			= " . ".$nom_parent . $fils;
    	}
    }
    $this->fils_ariane .=$fils;
    ?>
    par contre je jure rien sur le code, j'ai l'impression que vous utilisez un template ou quelquechose que je ne connais pas

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut Merci
    merci beaucoup ça marche . Vraiment merci.
    En effet j'utilise un template car je me suis mit tout juste à la notion d'objet avec le php5.

    En tout cas je pense que je vais pouvoir enfin avancer maintenant.

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

Discussions similaires

  1. Quelles balises HTML5 pour fil d'ariane et le menu
    Par saluts92 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 25/02/2015, 16h26
  2. [SP-2007] fil d'ariane pour une bibliothèque de documents
    Par gloutioche dans le forum SharePoint
    Réponses: 1
    Dernier message: 26/05/2010, 18h16
  3. [MVC] Fil d'ariane avec Spring Portlet MVC et AbstractWizardFormController
    Par FunkyBreizh dans le forum Spring Web
    Réponses: 0
    Dernier message: 27/04/2010, 16h37
  4. [XI] Problème pour la création d'un rapport avec requête intégré
    Par doudoudetahiti dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 05/07/2007, 16h22
  5. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14

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