1. ✅ Apprenez une METHODE qui marche pour votre SEO ! Formation à distance avec Olivier Duffez et Fabien Facériès + aide pour prise en charge du financement
    Rejeter la notice

Créer un Fil d'ariane dynamique (php/mysql)

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par yazerty, 7 Septembre 2007.

  1. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Bonjour,

    J'ai une table mysql avec ceci :

    Code:
    cat_id - name - parent
    1 - Catégorie 1 - 0
    2 - Catégorie 2 - 5
    3 - Catégorie 3 - 2
    4 - Catégorie 4 - 3
    5 - Catégorie 5 - 3
    ...
    Il s'agit d'un système de catégorie à plusieurs niveaux. Une catégorie peut en contenir une autre (ceci à l'infini). Si je suis dans la catégorie 5 le fil d'ariane peut ainsi donner :

    Index > Catégorie 3 > Catégorie 5 >Catégorie 2

    Le "parent" est la clé de la chose, il permet de savoir à quelle catégorie appartient la catégorie (ci-dessus j'ai volontairement fait un exemple un peu tordu pour tenter de l'illustrer).

    Je souhaite donc faire un fil d'ariane. J'ai cherché avec mon ami Google, mais je n'ai rien trouvé de probant en terme de code php lié à une base de données MySQL. La plupart des pages que j'ai consultées explique comment faire en javascript ou comment les présenter en CSS.

    Pourriez-vous m'aider à réaliser ce petit fil d'ariane s'il vous plait :) ?
     
  2. French Fred
    French Fred WRInaute discret
    Inscrit:
    12 Février 2004
    Messages:
    203
    J'aime reçus:
    0
    C'est purement algorithmique.
    Il te faut realiser une boucle recursive.
    Et dans chaque boucle tu devras executer une requete pour recuperer le parent du noeud courant.

    Voici la requete que tu devras utiliser.
    SELECT cat_id FROM table WHERE parent=XXX

    Ta boucle devra s'arreter lorsque le parent sera egal a 0

    Sinon fait une recherche sur les boucles recursives.
     
  3. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Merci pour cette piste French Fred ! Je pensais qu'il fallait sélectionner toute la table, l'organiser en tableau et trier le tout ensuite. Ca parait plus simple comme tu le dit :) !

    J'ai donc fais ceci :

    Code:
    $category_id = $db_data['category_id'];
    while (($sql = "SELECT parent_num, category FROM categories WHERE category_id=$category_id") &&  ($category_id!='0')) {
    $req = mysql_query($sql);
    $db_data = mysql_fetch_assoc($req);
    $category = french($db_data['category']);
    echo "<a href=\"c-$category_id.html\">$category</a>";
    $category_id = $db_data['parent_num'];
    }
    Le problème c'est que ça m'affiche les choses dans le désordre : la catégorie affichée la plus à gauche est l'enfant et celle de droite le parent. Ca devrait bien sûr être le contraire.

    Y aurait-il une astuce de derrière les fagots pour rebidouiller tout ça dans le bon sens de la marche ^^ ?
     
  4. webmasterlamogere
    webmasterlamogere WRInaute passionné
    Inscrit:
    17 Décembre 2006
    Messages:
    1 654
    J'aime reçus:
    1
    avec une fonction du style :

    Code:
    function affiche_cat($id) {
      select...
      if ($parent_num!='0') {
        affiche_cat($parent_num);
        echo ...
      }
    }
    avec l'affichage après la recherche des parents.
     
  5. French Fred
    French Fred WRInaute discret
    Inscrit:
    12 Février 2004
    Messages:
    203
    J'aime reçus:
    0
    webmasterlamogere a raison.

    Il te faut realiser une function qui va interroger la base.
    Cette fonction realiser une boucle recursive.
    elle s'appelle elle meme tant qu'une condition n'est pas remplie.
    En l'occurence, tu n'attends pas la categorie dite "root"

    Ensuite imprimer dans la fonction ou en dehors, c'est un choix a faire.

    Je prefere tout mettre dans un tableau que j'inverse via une function php qui est faite pour cela.

    Enfin tu boucles sur ce dernier qui est dans l'ordre Root->enfant->enfant 1 de enfant -> enfant 2 de enfant 1 ...
     
  6. hsii04
    hsii04 Nouveau WRInaute
    Inscrit:
    15 Mars 2005
    Messages:
    26
    J'aime reçus:
    0
    essaie cette fonction :
    Code:
    function GetFil($CategorieID)
    {
    	$r = GetCategorie($CategorieID);
    
    	$lien = "";
    	if($r["CategorieParenteID"] == 0)
    		$lien .= " &raquo; <a href=\"".HTTP_HOST.$r["URL"]."\">".$r["Categorie"]."</a>";
    	else
    		$lien .= GetFil($r["CategorieParenteID"])." &raquo; <a href=\"".HTTP_HOST.$r["URL"]."\">".$r["Categorie"]."</a>";
    	
    	return $lien;
    }
    GetCategorie est une fonction où tu va chercher les infos de la categorie en question
     
  7. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Merci à vous trois pour vos réponses :).

    Par contre je ne comprends pas du tout le principe, la logique, comment organiser ça dans mon cas précis (j'ai un niveau relativement amateur en php/mysql).

    Je ne comprends pas où est la boucle dans la structure de code proposée par webmasterlamogere. Pourquoi écrire une fonction alors que ce code ne me servira que dans un seul fichier php de tout mon site (je n'ai pas précisé désolé :-/ ) :- ?

    Merci pour votre aide en tout cas !

    ps : j'ai trouvé ceci mais cela tourne vite à la démonstration de force entre 2 méthodes :-/.
     
  8. webmasterlamogere
    webmasterlamogere WRInaute passionné
    Inscrit:
    17 Décembre 2006
    Messages:
    1 654
    J'aime reçus:
    1
    La fonction est récursive : elle s’appelle elle même pour remonter ta hiérarchie. On commence par rechercher le parent avant d’afficher l’élément courant. On s’arrête quand il n’y a plus de parent.
     
  9. yann214
    yann214 WRInaute occasionnel
    Inscrit:
    17 Novembre 2005
    Messages:
    371
    J'aime reçus:
    0
    Je peux proposer cette fonction (c'est du récursif) :

    Code:
        function get_categorie_byidparent($cat_id, $parent){
        global $connection;
        $query = "SELECT *
                  FROM categorie
                  WHERE CAT_ID = '$cat_id'
                  AND PARENT = '$parent'";
        $result = $connection->exec_query($query);
        return $connection->get_next_record($result);
      }
    
    
    function calc_fil_ariane($cat_id, $ref_cat){
        $fil_ariane = '';
        if ($cattmp = get_categorie_byid($cat_id))
          if ($cattmp->PARENT!=0)
            if ($cat_id == $ref_cat)
             $fil_ariane = calc_fil_ariane($cattmp->PARENT, $ref_cat).'<a href="" title="Filtrer sur cette catégorie">'.stripslashes($cattmp->NAME).'</a>';
            else
              $fil_ariane = calc_fil_ariane($cattmp->PARENT, $ref_cat).'<a href="" title="Filtrer sur cette catégorie">'.stripslashes($cattmp->NAME).'</a> &raquo; ';
          else
              $fil_ariane = '<a href="" title="Filtrer sur cette catégorie">'.stripslashes($cattmp->NAME).'</a> &raquo; ';
        return $fil_ariane;
      }
    
    $ref_cat est la catégorie fille de laquelle on part pour remonter en haut de l'arborescence.
    Ce code à pour effet de présenter les catégories comme cela :
    cat1 >> cat2 >> cat3
     
  10. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Ah je commence à entrevoir un peu la logique de la chose je crois.

    J'ai donc recodé ceci :

    Code:
    $category_id = $db_data['category_id'];
    echo $category_id; // affiche bien l'id de la catégorie en cours (20)
    function affiche_cat($id) {
    $sql = "SELECT parent_num, category FROM categories WHERE category_id=$category_id";
    $req = mysql_query($sql) or die(mysql_error());
    $db_data = mysql_fetch_assoc($req);
    $parent_num = $db_data['parent_num']; 
      if ($parent_num!='0') {
        affiche_cat($parent_num);
        echo $db_data['category'];
      }
    }
    affiche_cat($category_id);
    Mais il me sort une erreur SQL :

    Si j'enlève mon mysql_error() il me lance une boucle infinie avec ce message d'erreur (répété à l'infini) :

    Je ne vois pas ce qui bug dans mon SELECT là :- ?

    Et si je place un echo $parent_num; avant le "if {}" cela n'affiche pas le numéro du parent_num :-/.
     
  11. French Fred
    French Fred WRInaute discret
    Inscrit:
    12 Février 2004
    Messages:
    203
    J'aime reçus:
    0
    modifie dans ta requete WHERE category_id=$category_id
    par WHERE category_id=$id

    :p
     
  12. French Fred
    French Fred WRInaute discret
    Inscrit:
    12 Février 2004
    Messages:
    203
    J'aime reçus:
    0
    Code:
            function getTopParent($pi_current, &$pa_data)
            {
    
                // sql + query
                $sSql = 'SELECT  parent_num, category FROM categories WHERE id='.$pi_current;
                $req = mysql_query($sSql) or die(mysql_error());
    
                if (mysql_affected_rows($req)>0)
                {
                    $aData = mysql_fetch_assoc($req); 
                    $pa_data[] = $aData;
    
                    getTopParent($aData['parent_num'], $pa_data);
                }
            }
    
    
            // Appel de la function
            getTopParent($db_data['category_id'], $pa_data) ;
            
            // Reverse l'ordre des resultats pour avoir en premier le root
            $aFinalData = array_reverse($pa_data) ;
    
    $aFinalData sera de la forme:

    Code:
            Array
            (
                [0] => Array
                    (
                        [parent_num] => 1
                        [category] => categorie Root
                    )
                [1] => Array
                    (
                        [parent_num] => 2
                        [category] => Enfant de Root
                    )
                [2] => Array
                    (
                        [parent_num] => 3
                        [category] => Enfant de "Enfant de Root"
                    )
            )
    Bon je n'ai pas teste mais ca devrait fonctionner approximativement comme cela
     
  13. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Ah vi :p ;).

    J'aboutis donc à ceci :

    Code:
    // Fil d'Ariane (c'était Alphonse le fils d'Ariane non ?)
    $category_id = $db_data['category_id'];
    echo $category_id; // affiche bien l'id de la catégorie en cours
    
    function affiche_cat($id) {
    $sql = "SELECT parent_num, category FROM categories WHERE category_id=$id";
    $req = mysql_query($sql);
    $db_data = mysql_fetch_assoc($req);
    $parent_num = $db_data['parent_num'];
    $category = $db_data['category'];
    echo "<strong>$id $category - </strong>";
    if ($parent_num!='0') {
       affiche_cat($parent_num);
    }
    }
    affiche_cat($category_id);
    (il faut que je place mon echo "" avant le if {} sinon ça n'affiche pas la dernière catégorie (ou plutôt la première, c'est à dire celle la plus proche de 0).

    Cela affiche bien mes catégories, avec le bon numéro d'id mais par contre elles sont toujours affichées dans le sens inverse.

    Cela donne actuellement avec la fonction ci-dessus :

    J'imagine qu'il faut maintenant que j'attaque :

    Mais quelle est donc cette fonction magique qui permet d'inverser ces ptites choses :) ?
     
  14. French Fred
    French Fred WRInaute discret
    Inscrit:
    12 Février 2004
    Messages:
    203
    J'aime reçus:
    0
    Regarde le code que j'ai ajoute juste avant ton post :p
     
  15. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    lol décidément ;).

    J'ai essayé ton code entier (en remplaçant id par category_id dans le SELECT) car il me parait plus propre que le mien, mais cela m'a retourné ces erreurs :

     
  16. French Fred
    French Fred WRInaute discret
    Inscrit:
    12 Février 2004
    Messages:
    203
    J'aime reçus:
    0
    eish

    Replace mysql_affected_rows by mysql_num_rows()
    Me suis trompe dans les functions :(
     
  17. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Muuh c'est mieux, ça fait déjà une erreur en moins :) mais le code bloque toujours sur le tableau apparemment (même erreurs que précédemment) :

    J'imagine que la seconde erreur découle de la première.

    J'ai cherché sur Google pour tenter de voir comment marchent les tableaux / array en php, mais je ne comprends pas pourquoi ça ne marche pas là :eek: ...

    EDIT : problème résolu :) ! Merci à vous tous pour votre aide :).
     
Chargement...
Similar Threads - Créer Fil ariane Forum Date
Plug-in pour créer un fil d'Ariane sur Wordpress, recherche Développement d'un site Web ou d'une appli mobile 5 Janvier 2016
Créer un fil d'Ariane sur Wordpress Développement d'un site Web ou d'une appli mobile 26 Mars 2013
Créer un filtre anti spam referer Google Analytics 11 Août 2015
Comment créer des "univers" à partir des filtres? Google Analytics 24 Mars 2014
Comment créer une plate forme d'affiliation de produits numériques Développement d'un site Web ou d'une appli mobile 14 Août 2012
Aide : Créer le filtre d'analyse d'un sous-domaine Google Analytics 14 Avril 2012
Comment créer une plateforme d'affiliation ? Développement d'un site Web ou d'une appli mobile 22 Juin 2010
créer un nouveau site ou améliorer l'ancien ? Débuter en référencement 25 Août 2020
Créer une page ou une rubrique "citation", bonne idée ? Débuter en référencement 21 Juin 2020
Créer un article annuaire avec liens externes Débuter en référencement 11 Juin 2020