Catégorie illimité , sous-catégorie^n etc... [Résolu]

tibine974 43 Messages postés jeudi 19 août 2004Date d'inscription 15 novembre 2009 Dernière intervention - 2 nov. 2006 à 13:12 - Dernière réponse : JulSoft 354 Messages postés dimanche 3 juin 2001Date d'inscription 11 mars 2013 Dernière intervention
- 21 nov. 2006 à 21:28
Bonjour à tous !!

Voilà mon probléme je dois construire une application qui doit permettre d'ajouter des catégories , sous-catégorie, sous-sous-catégorie ( un nombre illimité avec des profondeurs aussi illimités ) .

ex :
<li>Cat A</li><li>Sous-Cat A_0</li><li>Sous-Cat A_1</li><li>Sous-sous Cat A_1_0</li><li>Sous-sous-sous Cat A_1_0_0</li><li>Sous-sous-sous Cat A_1_0_0
</li><li>etc...</li><li>Cat B</li><li>Cat C</li>Mais voilà je bloque sur la maniére de créer ma base et mes requêtes.
J'ai pensé que vu que je ne savais pas combien de catégorie , ss-cat etc... je comptais mettre tous dans une même table : voir ci dessous :

CREATETABLE`table`(
`cat_id`INT(5)NOTNULLAUTO_INCREMENTPRIMARYKEY,
`cat_libelle`VARCHAR(255)NOTNULL,
`cat_parent`INT(5)NOTNULL
)ENGINE=innodb;

Cat_parent  : pour l'élément qui correspond à une Catégorie, le cat_parent est égale à 0 . Pour les sous-cat , il correspondra à l'id de l'élément dont il est le parent.

Voici ma question : est-ce que ce systéme vous semble correct , sinon voyez-vous une autre solution ??

Merci d'avance pour les réponses positives ou négatives, car j'avoue bloquer .
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
JulSoft 354 Messages postés dimanche 3 juin 2001Date d'inscription 11 mars 2013 Dernière intervention - 6 nov. 2006 à 00:59
3
Merci
Voilà... c'est un peu spaghetti, pas des masses commenté, mais ça a l'air de marcher


<?php

// objet "cat"

class cat{

    // variables

    var $id;

    var $nom;

    var $enfants;

    // constructeur

    function cat($id,$nom){

        $this->id = $id;

        $this->nom = $nom;

        $this->enfants = array();

    }

}

// fonction  de récursivité

function setchild($parent,$id_parent,$id,$nom){

    if($parent->id==$id_parent){

        // on set

        $parent->enfants[count($parent->enfants)] = new cat($id,$nom);

        return 1;

    }else{

        for($j=0;$j<count($parent->enfants);$j++){

            // on parcours les enfants et on applique la récurence

            if(setchild($parent->enfants[$j],$id_parent,$id,$nom)==1){

                // c'est bon

                return 1;

            }

        }

        return 0;

    }

}

// fonction d'affichage récursif

function display($parent){

    echo $parent->nom ."
";

    for($i=0;$i<count($parent->enfants);$i++){

        display($parent->enfants[$i]);

    }

}

// ouverture mysql

$db_link = mysql_connect("localhost","root","");

mysql_select_db("test");

$requete = mysql_query("select * from table_cat",$db_link)or die(mysql_error());

// conteneur des cats...

    $objs = array();

// on parcours les résultats

    for($i=0;$i<mysql_num_rows($requete);$i++){

        $nom = mysql_result($requete,$i,'nom');

        $id = mysql_result($requete,$i,'id');

        $parent = mysql_result($requete,$i,'parent');

        // on enregistre le nouvel objet...

        if($parent==0){

            $objs[count($objs)] = new cat($id,$nom);

        }else{

            // par récursivité on tente de trouver le parent

            for($j=0;$j<count($objs);$j++){

            // on parcours les enfants et on applique la récurence

            if(setchild($objs[$j],$parent,$id,$nom)==1){

                // c'est bon

                break;

            }

        }

        }

    }

// on devrait tout avoir...

// on affiche

    for($i=0;$i<count($objs);$i++){

        display($objs[$i]);

    }

// fermeture mysql

mysql_close($db_link);

?>


pour ce qui est de la table mysql:


"id";"nom";"parent"

"1";"cat1";"0"

"2";"cat2";"0"

"3";"cat3";"0"

"4";"subcat2.1";"2"

"5";"subcat1.1";"1"

"6";"subcat2.1.1";"4"

"7";"subcat1.2";"1"

"8";"subcat1.1.1";"5"


Voilà, n'hésite pas à demander si t'as rien compris, il est tard quand je poste...

Merci JulSoft 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de JulSoft
JulSoft 354 Messages postés dimanche 3 juin 2001Date d'inscription 11 mars 2013 Dernière intervention - 2 nov. 2006 à 13:33
0
Merci
Je pense que c'est la seule façon que tu puisse utiliser. ça marche pas
trop mal (quand même pas mal de requetes pour tout récupérer et trier).


Après ce que tu peux faire pour éviter les requetes multiples est de
créer une classe catégorie qui comprenne un champ "sous_categories" qui
lui contien un nouvel élément catégorie. ça peut peut être t'éviter de
faire 300 requetes mysql, mais je ne suis sur de rien (pas testé).
Commenter la réponse de JulSoft
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 2 nov. 2006 à 18:04
0
Merci
Hello,

je pense aussi que c'est la seule solution.
Mais j'éviterais les requêtes multiples pour trouver toutes les occurences liées à une catégorie. Je récupèrerais tout dans un tableau multidimensionnel, et ferais le tri en PHP (l'algo est simple, en php).
Commenter la réponse de malalam
tibine974 43 Messages postés jeudi 19 août 2004Date d'inscription 15 novembre 2009 Dernière intervention - 2 nov. 2006 à 20:30
0
Merci
Re !

Tout d'abord merci pour les réponses ! Comme tu l'as dit malalam moi aussi j'ai pensé récupérer dans un tableau multidimensionnel. Mais voilà , un autre probléme survient comment trier ce dit tableau , voici ce que cela donne aprés la requête :

$stockage = array (
  array (1, "cat a",  0 )  ,
  array (2 , "cat b",  0 ) ,
  array (3 , "cat c",  0 ) ,
  array (4 , "sous-cat a_0",  1 ) ,
  array (5 , "sous-cat a_1",  1 ) ,
  array (6 , "sous-sous cat a_1_0",  5 ) ,
  array (7 , "sous-sous-sous cat a_1_0_0",  6 )
);

Je sais ensuite qu'il faut passer en boucle le tableau, mais à l'intérieur de la boucle je ne vois pas comment faire pour que le array1 recherche dans les autres array la valeur souhaité .

foreach ( $stockage as $tab => items ):

endforeach;

Si vous avez un début de réponse ou me proposer une démarche je suis preneur . merci d'avance

Meuh ! Fais la vache
Commenter la réponse de tibine974
JulSoft 354 Messages postés dimanche 3 juin 2001Date d'inscription 11 mars 2013 Dernière intervention - 3 nov. 2006 à 00:29
0
Merci
je reste convaincu que c'est possible (probablement plus simple) avec
des classes... donne moi un peut de temps que je te bricole quelque
chose...
Commenter la réponse de JulSoft
tibine974 43 Messages postés jeudi 19 août 2004Date d'inscription 15 novembre 2009 Dernière intervention - 3 nov. 2006 à 06:13
0
Merci
Merci à toi de regarder mon probléme ! moi aussi de mon côté je continue de chercher.On se tient au courant :

Meuh ! Fais la vache
Commenter la réponse de tibine974
JulSoft 354 Messages postés dimanche 3 juin 2001Date d'inscription 11 mars 2013 Dernière intervention - 6 nov. 2006 à 01:01
0
Merci
Pour ce qui est du tri, tu tries les parents puis par récurence les enfants... tout ça dans la joie et la bonne humeur
Commenter la réponse de JulSoft
tibine974 43 Messages postés jeudi 19 août 2004Date d'inscription 15 novembre 2009 Dernière intervention - 7 nov. 2006 à 07:12
0
Merci
Re !!
Je viens de regarder et tester ton code , cela à l'air de bien marcher . Merci encore d'avoir regardé mon probléme.

++

Meuh ! Fais la vache
Commenter la réponse de tibine974
prophete56 1 Messages postés vendredi 20 octobre 2006Date d'inscription 20 novembre 2006 Dernière intervention - 20 nov. 2006 à 13:59
0
Merci
Salut

Je travaille sur un problème similaire mais je suis bloqué....

Je voudrais   
 - pouvoir deplacer par categories ou sous catégories
 - pouvoir ajouter un controle sur la suppression des catégories (si il existe des sous categories )

etc...
Commenter la réponse de prophete56
JulSoft 354 Messages postés dimanche 3 juin 2001Date d'inscription 11 mars 2013 Dernière intervention - 21 nov. 2006 à 21:28
0
Merci
pour ce qui est de déplacer une catégorie, il suffit de changer le parent de l'élément concerné (les enfants suivent leurs parents, que c'est beau la famille...), pour supprimer cherche d'abord la liste des enfants et des générations suivantes puis supprime le tout (comme ça t'as personne perdu en pleine base de donnée, et pas de façon logique de les retrouver)
Commenter la réponse de JulSoft

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.