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 :

plusieurs categories parentes


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut plusieurs categories parentes
    bonjour,
    j'ai un soucis, je ne sais pas comment faire une recherche en boucle :
    voila le topo :
    j'ai une table categorie dans laquelle j'ai :
    'id' et 'parent' (+ nom, description, vignette, mais ils ne sont pas importants pour l'exemple)

    je peut donc avoir, par exemple:
    id 8, 12, 22, 34, 45
    et id 12 parent de 34, lui meme parent de 22

    ce qui me retournerai le resultat :
    12 > 34 > 22

    j'aimerai donc savoir comment je peut boucler ma requête pour rechercher tous les parents à partir de l'id 22, mais j'en ai aucune idée
    merci d'avance pour votre aide car je ne sais vraiment pas comment m'y prendre

    EDIT: j'ai oublié de preciser que , lorsque le 'parent' = 0 => l'id n'as pas de parent
    ex: id: 12 / parent: 0 => pas de parent
    id: 36 / parent : 45 => le parent est l'id 45

  2. #2
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    bon, voila ou j'en suis après de nombreux essais :

    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
     
    $sq_cat="SELECT  * FROM categorie "; 
     $quer_cat=mysql_query($sq_cat ) or die(mysql_error());  
     $row_cat=mysql_num_rows($quer_cat); 
    if($row_cat>0){
     
    while($assoc_cat= mysql_fetch_assoc($quer_cat)){
     
    if($assoc_cat['parent']>0){
    $ass_cat=$assoc_cat['parent'];
     
    do{
    $sq_parent="SELECT  * FROM categorie where id='$ass_cat' "; 
     $quer_parent=mysql_query($sq_parent ) or die(mysql_error());  
     $assoc_parent= mysql_fetch_assoc($quer_parent); 
     $row_parent=mysql_num_rows($quer_parent);  
     $parent .=$assoc_parent['nom'].' > ';
    $ass_cat=$assoc_parent['parent'];
     
    }
    while ($assoc2= mysql_fetch_assoc($quer_parent));
     }echo $parent.$assoc_cat['nom'].'<br>';
    avec une base :
    id / nom / parent
    1 / lacat1 / 0
    5 / lacat2 / 1
    6 / lacat3 / 0
    7 / lacat4 / 5
    8 / lacat5 / 7
    devrait me retourner :
    lacat1
    lacat1 > lacat2
    lacat3
    lacat1 > lacat2 > lacat4
    lacat1 > lacat2 > lacat4 > lacat5
    et me retourne , en fait :

    lacat1
    lacat1 > lacat2
    lacat1 > lacat3
    lacat1 > lacat2 > lacat4
    lacat1 > lacat2 > lacat4 > lacat5
    hummmffff

  3. #3
    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
    Par défaut
    Je te conseille plutot de recuperer tous les résultats dans un tableau et de le travailler ensuite avec des fonctions recursives.

    Ce que tu as écris actuellement produit beaucoup trop de requêtes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    bon, j'en suis ici, mais il me manque l'essentiel ......
    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
     
    $sq_cat="SELECT  id, nom, parent  FROM categorie WHERE famille ='$nom2' "; 
     $quer_cat=mysql_query($sq_cat ) or die(mysql_error());  
     $quer_cat2=mysql_query($sq_cat ) or die(mysql_error());  
     $quer_cat3=mysql_query($sq_cat ) or die(mysql_error());  
     $row_cat=mysql_num_rows($quer_cat); 
    if($row_cat>0){// au moins un resultat pour afficher les categories
    //echo '<table style="border:1px solid black;width:500px;"><tr>';
    while($assoc_cat= mysql_fetch_assoc($quer_cat)){
    if($assoc_cat['parent']>0){ // si il y a un parent
    $ass_cat=$assoc_cat['parent'];//recup numero parent
       $donnees = array();
    while ($assoc_cat2= mysql_fetch_assoc($quer_cat2))  
    {
    	$donnees[] = $assoc_cat2;
    }
    echo'<pre>';
    print_r($donnees);
    echo'</pre>';
    //ok, j'ai mon tableau :
    Array
    (
    [0] => Array
    (
    [id] => 1
    [nom] => lacat1
    [parent] => 0
    )

    [1] => Array
    (
    [id] => 5
    [nom] => lacat2
    [parent] => 1
    )

    [2] => Array
    (
    [id] => 6
    [nom] => lacat3
    [parent] => 0
    )

    [3] => Array
    (
    [id] => 7
    [nom] => lacat4
    [parent] => 5
    )

    [4] => Array
    (
    [id] => 8
    [nom] => lacat5
    [parent] => 7
    )

    )
    maintenant il faut que je liste chaque categorie et , si j'ai un parent, il s'ajoute ...et si l'ajout a un parent, il s'ajoutera aussi , etc...

    ça devrait me retourner pour l'exemple:
    lacat1
    lacat1>lacat2
    lacat3
    lacat1>lacat2>lacat4
    lacat1>lacat2>lacat4>lacat5
    mais là...je commence vraiment a caler ......

  5. #5
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    ... je seche toujours ....
    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
     
    $sq_cat="SELECT  id, nom, parent  FROM categorie WHERE famille ='$nom2' "; 
     $quer_cat=mysql_query($sq_cat ) or die(mysql_error());  
     $row_cat=mysql_num_rows($quer_cat); 
    if($row_cat>0){// au moins un resultat pour afficher les categories
    $i=0;
    while ($assoc_cat= mysql_fetch_assoc($quer_cat))  {
    echo
    	$assoc_cat['nom'];
    if($assoc_cat['parent']>0){
     
    echo
    	 '>parent : oui<br>';//$assoc_cat['nom'].'<br>';
    } 
    else{ echo '<br>';}
    }
     
    	} 
    else { echo 'il n\'y a pas de catégorie créée<br>',"\n";}
    je crois que là, j'ai bien l'indication du parent, mais pas de boucle (si ce parent à lui aussi un parent ...)

    me renvoi
    lacat1
    lacat2>parent : oui
    lacat3
    lacat4>parent : oui
    lacat5>parent : oui
    et devrait me retourner

    lacat1
    lacat1>lacat2
    lacat3
    lacat1>lacat2>lacat4
    lacat1>lacat2>lacat4>lacat5

  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
    Par défaut
    Comme je t'ai dis, il faut travailler avec de la recursivité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function donne_le_parent($fils) {
    // du code qui donne
    // le parent à partir du fils
    if ($parent > 0) {
       donne_le_parent($parent) // et on boucle en recursivité
    }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    merci sabotage ....
    mais j'y pige toujours rien ... la nuit porte conseil ......
    en plus je recupere l'id du parent et il faut que je lui attribue son nom ...
    j'arrive meme pas a visualiser la demarche a suivre, c'est pour dire...
    je suis peaumé de chez peaumé ....

    en core un code de 3 lignes qui va me prendre une semaine......

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Pourtant, la piste donnée est bonne, tout y est, ou presque.

    D'abord, il faudrait faire une requête sur les 1ères catégories car c'est une exception (parent = 0)
    Ensuite, appeler la fonction récursive donne_le_parent($fils)

    Exemple :
    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
     
    function donne_le_parent($fils) {
    	// du code qui donne le parent à partir du fils
    	$rs_cat = mysql_query("SELECT  id, nom, parent  FROM categorie WHERE parent = '".(int)$fils."' ") or die(mysql_error());
    	$tot_cat = mysql_num_rows($rs_cat);
     
    	if ((int)$tot_cat > 0) {
    		$cat = mysql_fetch_assoc($rs_cat);
    		echo $cat['nom'].'<br />';
    		donne_le_parent($cat['id']); // et on boucle en recursivité
    	}
    }
     
    $rs_cat = mysql_query("SELECT  id, nom, parent  FROM categorie WHERE parent = 0") or die(mysql_error());
    while ($assoc_cat = mysql_fetch_assoc($rs_cat))  {
    	echo $assoc_cat['nom'].'<br />';
    	donne_le_parent($assoc_cat['id']);
    }
    Je n'ai pas vérifié, mais ça ne devrait pas être trop loin

    Mais ceci aura surement pour but de faire un affichage dans une page, un menu, je suppose.
    Il y aura très certainement un souci pour afficher cette arborescence, il y a une notion de niveau théoriquement.
    Faudrait alors rajouter un autre paramètre (genre $niveau) qui s'incrémenterait ou décrémenterait selon le niveau pour justement savoir à quel niveau on se situe dans les catégories.
    Faut voir.

  9. #9
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    bon, d'abord, merci a vous pour votre aide

    ensuite, j'ai tripatouillé tout ça pendant un long moment avant d'arriver a un resultat correct.
    cette version là me donne des resultats ok :
    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
     
    function donne_le_parent($fils) {
    	// du code qui donne le parent à partir du fils
    	$rs_cat = mysql_query("SELECT  id, nom, parent  FROM categorie WHERE id = '".(int)$fils."' ") 
    				or die($rs_cat.mysql_error());
    $cat = mysql_fetch_assoc($rs_cat);	
    		echo $cat['nom'].' &gt; ';
    	if ($cat['parent'] != 0) {
    		donne_le_parent($cat['parent']); 
    	}
    	}
     
    $sq_cat ="SELECT  id, nom, parent  FROM categorie ";
    $quer_cat=mysql_query($sq_cat ) or die(mysql_error());  
    while ($assoc_cat = mysql_fetch_assoc($quer_cat))  {
    $leparent=$assoc_cat['parent'];
    $lenom=$assoc_cat['nom'];
      if($leparent>0){
    donne_le_parent($leparent);
     
    		}
    echo ' &gt; '.$lenom;	
    echo '<br><br><br>';
    sauf que je savais qu'il fallait inverser , bicose :
    j'ai un resultat de ce genre:
    lacat4 > lacat2 > lacat1 > > lacat5

    lacat5, c'est "$lenom=$assoc_cat['nom'];"
    et pour le reste, lacat1 est parent de lacat2 qui est parent de lacat4 qui est parent de lacat5,
    il faut donc que j'inverse mes resultats, j'ai donc fait un explode et repris a l'envers mes resultats qui devraient m'afficher , au final ceci:

    lacat1 > lacat2 > lacat4 > lacat5

    mais ça ne fonctionne pas:
    j'ai conservé ma fonction et j'ai modifié le reste comme ça :
    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
     
    $sq_cat ="SELECT  id, nom, parent  FROM categorie ";
    $quer_cat=mysql_query($sq_cat ) or die(mysql_error());  
    while ($assoc_cat = mysql_fetch_assoc($quer_cat))  {
    $leparent=$assoc_cat['parent'];
    $lenom=$assoc_cat['nom'];
      if($leparent>0){
    //donne_le_parent($leparent);
    //$les_parents2="aaa &gt; bbb &gt; ccc &gt; ddd";//test ok, le resultat est a l'envers
    $les_parents2=donne_le_parent($leparent); //ne fonctionne pas ...?
         $explose=explode(" &gt; ", $les_parents2);
    	$compte=count($explose);
    	for($i=$compte-1;$i>-1;$i--){
    	echo $explose[$i].' &gt; '; } /*  */
    		}
    echo ' &gt; '.$lenom;	
    echo '<br><br><br>';
    apparemment il y a une erreur dans le fait de récupérer ma fonction en tant que variable, ça doit pas etre compatible, non ?

    merci d'avance encore ...

  10. #10
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Le 1er truc, c'est un détail, mais je ne vois pas pourquoi tu ne conserve pas le mysql_num_row().
    Pourtant, c'est prévu pour retourner le nombre de ligne, de résultat, donc soit ça retourne 0, soit un entier (1, 2 10, etc ...), c'est donc fiable.

    Par contre, il me semble avoir fait une erreur, pas fait de boucle dans la fonction donne_le_parent().
    Ca devrait être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function donne_le_parent($fils) {
    	// du code qui donne le parent à partir du fils
    	$rs_cat = mysql_query("SELECT  id, nom, parent  FROM categorie WHERE parent = '".(int)$fils."' ") or die(mysql_error());
    	$tot_cat = mysql_num_rows($rs_cat);
     
    	if ((int)$tot_cat > 0) {
    		while ($cat = mysql_fetch_assoc($rs_cat)) {
    			echo $cat['nom'].'<br />';
    			donne_le_parent($cat['id']); // et on boucle en recursivité
    		}
    	}
    }

    Ensuite, il me semble que tu rencontre un problème d'ordre, de tri, du classement des catégories.
    S'il y a rien dans ce sens dans la Bdd, leurs tri est quelque peu aléatoire, lié au moment où tu les avaient enregistrés.

    Une solution serait de créer un nouveau champ (genre "ordre" ou "tri" ou "classement") pour définir l'ordre.
    Ensuite, faut juste rajouter dans les requêtes : SELECT ... FROM ... WHERE ... ORDER BY ordre

    Si c'est ça le problème et que tu opte pour cette solution, inutile de te dire que cela ne doit pas être fait au hasard, mais en tenant compte des catégories parent/filles ...


    Par contre, je remarque que dans ta 1ère requête, tu récupère toutes les catégories, sans exception, et non pas celles dont le parent vaut 0.
    Je ne suis pas certain que ça soit la bonne technique.


    L'autre truc, c'est que le code, le principe fourni ici c'est pour afficher directement le résultat (un echo), donc il ne faut pas récupérer les données retournées par la fonction donne_le_parent(), ça va foirer du fait que c'est une fonction récursive.
    Quand on boucle, c'est 1 catégorie par catégorie qui est renvoyée. Si c'est pas la bonne, alors c'est un problème de trie (voir plus haut).


    Dernier point, c'est le > (chevron) que tu souhaite mettre entre les catégories, les niveaux (que j'ai parlé le post plus haut).
    Rajoute ce paramètre, il te permettra de t'appuyer dessus pour faire une mise en forme, couche présentation.
    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
     
    // Fonction
    function donne_le_parent(&$niveau, $fils) {
    	// la requête avant
    	$tot_cat = mysql_num_rows($rs_cat);
    	if ($tot_cat <= 0 && (int)$niveau > 0) $niveau--;
     
    	if ((int)$tot_cat > 0) {
    		// bla bla bla
    		while ($cat = mysql_fetch_assoc($rs_cat)) {
    			// bla bla bla
    		}
    	}
    }
     
    // 1ère requête
    while ($cat = mysql_fetch_assoc($rs_cat)) {
    	// bla bla bla
    	$niveau = 0;
    	donne_le_parent($niveau, $cat['categories_id']);
    }
    Le $niveau vaut 0 à chaque boucle de la 1ère requête, et s'incrémente ou décrémente dans la fonction donne_le_parent()

  11. #11
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    YES!
    ok, je l'ai ... quasiment ...
    lacat1
    > lacat1 > lacat2
    lacat3
    > lacat1 > lacat2 > lacat4
    > lacat1 > lacat2 > lacat4 > lacat5
    .. il me reste que cette petite histoire de chevron au debut..pas grave(au pire , un nettoyage...)

    alors, merci bien a vous deux pour votre aide !!

    ensuite, pour "RunCodePhp" :
    pour le "mysql_num_row()" : en effet, j'avais pas fait la nuance entre
    if ((int)$tot_cat > 0) {
    et
    if ($tot_cat > 0) {
    pour le probleme de "ordre ou position" ce n'est pas le meme contexte :

    moi, je veux faire ce systeme de categorie pour pouvoir modifier a volonté
    ex:
    lacat1>lacat2
    lacat1>lacat3

    comment je defini l'ordre de lacat2 et lacat3 ? position 2 ? tous les 2 ? ...
    va y avoir conflit ....!!

    en fait, j'avais pris exemple sur le systeme de categorie coppermine avec un champ "parent"
    (et j'ai pensé(un peu tard...) que je pourrai m'inspirer de leur code ... mais faut dechiffrer tout ça, et c'est une autre histoire...)

    Par contre, je remarque que dans ta 1ère requête, tu récupère toutes les catégories, sans exception, et non pas celles dont le parent vaut 0.
    Je ne suis pas certain que ça soit la bonne technique.
    ça, c'est normal, je liste toutes les categories repertoriées, dans l'ordre .

    mais je m'apperçois juste maintenant d'un truc:
    toujours meme exemple:
    lacat1
    > lacat1 > lacat2
    lacat3
    > lacat1 > lacat2 > lacat4
    > lacat1 > lacat2 > lacat4 > lacat5
    en supposant que je decide que "lacat2" n'est plus sous_categ de lacat1, il faut que je controle "lacat4" ....

    et si :

    lacat1>lacat2
    lacat1>lacat3
    quand je vais lister "lacat1", faudra que j'ai :
    lacat1>..lacat2
    ............lacat3
    ...bon, ben, il reste du taffe!!!

  12. #12
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    lacat1
    > lacat1 > lacat2
    lacat3
    > lacat1 > lacat2 > lacat4
    > lacat1 > lacat2 > lacat4 > lacat5
    C'est bizarre que les lignes se répètes ? C'est normal ?

    J'aurais plus vu un truc du genre : (J'ai rajouté l'ordre, pour expliquer un peu)
    Cat:1(parent:0)(ordre:1) > Cat:5(parent:1)(ordre:2) -> Cat:6(parent:5)(ordre:3)
    Cat:2(parent:0)(ordre:1) > Cat:7(parent:2)(ordre:2)
    Cat:3(parent:0)(ordre:1) > Cat:8(parent:3)(ordre:2) > Cat:9(parent:8)(ordre:3) > Cat:10(parent:9)(ordre:4)


    Mais c'est peut être que tu souhaite faire une mise en forme particulière.

  13. #13
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    c'est vrai que la repetition des lignes est inutile :
    lacat1
    > lacat1 > lacat2
    lacat3
    > lacat1 > lacat2 > lacat4
    > lacat1 > lacat2 > lacat4 > lacat5
    peut etre remplacé par ça:
    > lacat1 > lacat2 > lacat4 > lacat5
    lacat3
    etant donné qu'il n'y a rien d'autre a savoir.

    il faudrait donc que je controle à l'envers, donc, oui , t'avais raison, il faut demarrer par "parent =0"

    bouououohhhhhhhh .....
    bon, je vais essayer de me reprendre en main , de refaire le topo et de saisir la demarche a suivre ....
    le principal soucis etant de trouver le temps.... a coup de 1/2 heure a droite a gauche ... faut se remetre dans le bain....

  14. #14
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je (re)vient faire une correction, réparer une bêtise, c'est l'exemple que j'ai donné plus haut concernant précisément l'ordre.
    Ce n'est pas bon quoi

    En fait, les valeurs devraient varier lorsque qu'une catégorie parente contient plusieurs filles.
    Pour les 1ères catégories dont le parent vaut 0, pour l'ordre ça devrait être :
    Cat:1(parent:0)(ordre:3)
    Cat:2(parent:0)(ordre:1)
    Cat:3(parent:0)(ordre:2)
    Ici, j'ai donc volontairement mis un ordre différent par rapport aux valeurs des IDs. Du coup, avec un ORDER BY ordre on obtiendra :
    Cat:2
    Cat:3
    Cat:1


    Ceci dit, ce n'est peut être pas le problème principal que tu rencontre, mais je tenais à éviter de te mettre en erreur.

  15. #15
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    bon, je me rapproche... doucement...


    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
    29
    30
    31
    32
    33
    34
     function donne_le_parent($fils, $space='') {
    $rs_cat = mysql_query("SELECT  id, nom, parent  FROM categorie WHERE parent = '".(int)$fils."' ORDER BY ordre ASC") 
    				or die($rs_cat.mysql_error());
    $tot_cat = mysql_num_rows($rs_cat);
    //if ($tot_cat <= 0 && (int)$niveau > 0) $niveau--;	
     
    if ((int)$tot_cat > 0) {
     $i=0;
    while ($cat = mysql_fetch_assoc($rs_cat)) {
    if($i==0){$sp=' &gt; ';} else{ $sp='';}
    $catnom=$sp.$cat['id']." <br> ";
    $i++;
    $donne=donne_le_parent($cat['id'], $space.' &gt; '); // &nbsp;&nbsp; et on boucle en recursivité
    								}	
    					}
    return $space.$catnom.$donne;	 
    	}
     //-----
    $sq_cat ="SELECT  id, nom, parent  FROM categorie where parent ='0'";// 
    $quer_cat=mysql_query($sq_cat ) or die(mysql_error());  
    while ($assoc_cat = mysql_fetch_assoc($quer_cat))  {
    $leparent=$assoc_cat['parent'];
    $lenom=$assoc_cat['nom'];
    $leid=$assoc_cat['id'];
     
    echo $leid.'<br>';	  
     
    if (donne_le_parent($leid)!=""){
    $niveau = 0;
     
     echo donne_le_parent($leid);
     }
    echo '<br>';
    	}
    me retourne les bons resultats :

    1
    > 5
    > > 7
    > > > 8
    > > >
    6
    pour le chevron, j'ai bricolé avec un if ... pas top, mais sinon, j'ai pas le premier chevron pour l'id5 (normal, il est demandé apres)
    mais de toute maniere, j'en ai une ligne de trop a la fin (apres id8, les 3 chevrons) ...??

    ensuite, probleme de niveau, j'ai essayé de créer un id9 au meme niveau que le id7 (donc, parent de id8 et enfant de id5) , j'ai donc aussi mis un ordre(id7:ordre:1, id9:ordre:2) et là, bug !! :
    ordre asc
    1
    > 5
    > 9
    > >
    6
    ordre desc:
    1
    > 5
    > 7
    > > > 8
    > > >
    6
    normal, je recupere 2 valeurs, il faut donc que je fasse une boucle, mais comment ??

    ensuite, un mystere pour moi :
    dans la fonction,
    " return $space.$catnom.$donne; "
    me renvoi :
    1
    > 5
    > > 7
    > > > 8
    > > >
    6

    9
    et
    " return $catnom.$donne;"
    me renvoi
    1
    > 5
    > 7
    > 8

    6

    9
    ....
    note:
    runcodephp :
    j'ai pas compris la manipe pour $niveau, désolé !!
    et , au fait, je fais ça dans l'intention de faire un systeme modifiable de categories pour elaborer plus ou moins n'importe quoi (admin de produits , de liens, etc...)
    dans un premier temps, j'ai besoin de pouvoir faire une arborescence de ce genre, pour l'admin:
    1
    > 5
    >>12
    > > 7
    > > > 8
    6
    9
    >>4
    bon, vous me direz .... ça fait que 11 jours que je suis dessus !!!!

  16. #16
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je crains, ou je n'espère pas t'avoir embrouillé avec les "ordres" (ou classement), et même le "niveau".
    En tout cas, il ne faut pas mélanger les 2, ils n'ont aucun rapports.

    Malgré tout, ils peuvent être très important, voir indispensables.

    Pour le champ "ordre".
    Le champ "ordre", et leurs valeurs n'ont d'intérêts QUE si une catégorie (parente ou fille, peu importe) contient plusieurs catégorie.
    C'est le cas des toutes 1ères catégories, les principale (parent = 0).
    En somme, la façon dont la Bdd va récupérer les catégories va dépendre de la valeur du champ "ordre" et non pas de la valeur de leur identifiants.

    Un exemple : (valeur des IDs au pif, juste pour exemple)
    1 (ordre :1)
    > 6 (ordre :1)
    > > 8 (ordre :1)
    > > 9 (ordre :2)
    > > 7 (ordre :3)
    > > > 11 (ordre :1)
    > > > 10 (ordre :2)

    La catégorie 1 contient 1 seule catégorie fille (6) (donc quelque part l'ordre n'a pas trop d'importance dans ce cas là)
    La catégorie 6 contient 3 catégories (8,9,7). L'ordre prend tout son sens.
    La catégorie 7 contient 2 catégories (11,10). L'ordre est important.

    2 (ordre :2)
    > 5 (ordre :1)
    > 4 (ordre :2)
    > > 12 (ordre :1)
    > > 13 (ordre :2)
    > > > 14 (ordre :1)

    La catégorie 2 contient 2 catégories filles (5,4)
    La catégorie 4 contient 2 catégories (12,13)
    La catégorie 13 contient 1 catégorie (14)


    (Il me semble cette fois de ne pas m'être trompé sur cet exemple pour l'ordre)
    Il faut cependant que les valeurs des "ordre" soient cohérents.



    Pour le niveau, il n'est pas obligatoire, ça dépend de l'affichage, la présentation que l'on souhaite faire.
    Ca m'a l'air d'être le cas.
    Apparemment, dès qu'une catégorie contient une catégorie fille, tu mets un chevron, et ainsi de suite ...
    Théoriquement $niveau contient le niveau, le nombre de chevrons.
    Exemple :
    1 (niveau 0 : aucun chevron)
    > 5 (niveau 1 : 1 chevron)
    > > 7 (niveau 2 : 2 chevrons)
    > > > 8 (niveau 3 : 3 chevrons)
    Donc si tu souhaite mettre autant de chevrons que le niveau de la catégorie, se baser sur le niveau devient utile, pratique.
    Pour ça, suffit de boucler sur le $niveau pour afficher des chevrons.



    Si l'affichage que tu veux faire correspond à celui que j'ai mis plus haut, alors un code comme celui ci devrait être pas trop loin :
    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
     
    // Attention au : &$niveau (ne pas oublier le & devant)
    function donne_le_parent($fils, &$niveau) {
     
    	$rs_cat = mysql_query("SELECT id, nom, parent FROM categorie WHERE parent = '".(int)$fils."' ORDER BY ordre ASC") or die(mysql_error($rs_cat));
    	$tot_cat = mysql_num_rows($rs_cat);
    	//
    	if ($tot_cat <= 0 && (int)$niveau > 0) $niveau--;
    	$chevron = '';
    	for ($i=0; $i <= $niveau; $i++) $chevron .= ' &gt; ';
    	//
    	if ((int)$tot_cat > 0) {
    		//$i = 0;
    		while ($cat = mysql_fetch_assoc($rs_cat)) {
    			$niveau++;
    			echo $chevron.'('.$cat['id'].'-'.$cat['parent'].') '.$cat['nom'].'<br />';
    			// &nbsp;&nbsp; et on boucle en recursivité
    			donne_le_parent($cat['id'], $niveau);
    		}
    	}
    }
     
    $rs_cat = mysql_query("SELECT id, nom, parent FROM categorie WHERE parent = 0 ORDER BY ordre ASC") or die(mysql_error($rs_cat));
    while ($cat = mysql_fetch_assoc($rs_cat)) {
    	$niveau = 0;
    	echo '('.$cat['id'].'-'.$cat['parent'].') '.$cat['nom'].'<br />';
    	donne_le_parent($cat['id'], $niveau); 
    }
    Cette fonction donne_le_parent() et un cas particulier, elle est récursive, elle boucle sur elle même.
    En l'état, elle est faite pour renvoyer directement le résultat, des echo().
    On peu faire autrement, certes, mais ça sera plus compliqué.
    Donc faire un return n'est pas correcte.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ca n'a pas été mentionné, alors je le rajoute.
    Le problème est simplement une exploration de graphe.
    On a deux possibilités, largeur et profondeur.
    Pour ma part, j'avoue préférer profondeur et c'est cqui semble etre le cas ici.

    Les algos sont dispo sur wiki.

    Une parenthèse tout de même,
    1 fils de 3
    1 fils de 5
    3 fils de 7
    5 fils de 7
    donnera (si j'ai a peu pres compris)
    1>3>7
    1>5>7
    ou qqch dans ce gout là.
    Autrement dit 7 sera présent deux fois, je sais pas si c'est ce qui est attendu vu que tu cherches les parents de 1. Pe, pe pas, de toute façon c'est juste une parenthèse.

  18. #18
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    merci a vous,
    je vais encore re-potasser tout ça ....

    galerien69 : il est ou , ce wiki ? ici ? http://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Algorithme

    runcodephp :
    ou j'avais bien saisi la difference entre ordre et niveau , ok

    je comprends maintenant aussi, le "boucler sur le $niveau pour afficher des chevrons", d'ac ... merci, je vais voir ça


  19. #19
    Invité
    Invité(e)
    Par défaut
    voila un lien pour le
    parcours de graphes en profondeur

  20. #20
    Membre éclairé Avatar de zugolin
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 275
    Par défaut
    bon, alors, j'avance ....
    deja, je conserve cette methode qui me permet de definir ou je suis dans l'arborescence jusqu'au parent="0" =>

    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
     
    $sq = 'SELECT  id, nom, parent  FROM categorie WHERE id = "10" AND famille="'.bdd($_GET['nom']).'" ';
    $quer=mysql_query($sq ) or die(mysql_error());  
    $quer2=mysql_query($sq);  
    $assoc= mysql_fetch_assoc($quer); 				
    $assoc3= mysql_fetch_assoc(mysql_query($sq)); 				
    echo "<br>Arborescence => <br>";
    while ($cat1 = mysql_fetch_assoc($quer2)) {
    	$les_parents2=donne_les_parents($cat1['id']);
    } 
        $explose=explode(":", $les_parents2);
    	$donnees=array_reverse($explose);
    	$str=implode(" > ", $donnees);
    	$str=substr($str, 3);//la 1iere valeur est vide
    	echo $str;
    me retourne un resultat du type :
    lacat1(est parent de : ) > lacat2 (est parent de : )> lacat6 (est parent de : )> nouvelle_cat

    par contre, j'ai fait un systeme de liste de selection, et je n'arrive pas a pointer sur la bonne categorie correspondante :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    $sq_les_categs="SELECT id, nom, parent FROM categorie WHERE parent = 0 
    		AND famille='".bdd($_GET['nom'])."' ORDER BY ordre ASC";
     
    $quer_les_categs = mysql_query($sq_les_categs)	or die(mysql_error($rs_cat));
    $row_les_categs = mysql_num_rows($quer_les_categs); 
     
    if($row_les_categs>0){
    echo 
    	'Classer dans la catégorie:<br>',"\n",
    	'<select name="categorie">',"\n",
    	'<option name="choisir" value="choisir" > - choisir - </option>',"\n"; 
    while ($cat = mysql_fetch_assoc($quer_les_categs)) {
    if($assoc3['categorie']==$cat['id']){$id_selected='selected';}		
    $select=$assoc3['categorie'];
    	$niveau = 0;
    echo
    	'<option name="'.$cat['id'].'" ',
    	'value="'.$cat['id'].'" '.$id_selected.' >'.$chevron.$cat['nom'].'</option>',"\n";
    	liste_cat_select($cat['id'], &$niveau, $select); 
    }
    echo
    	'</select>',"\n";
    // la fonction :
    function liste_cat_select($fils, &$niveau, $select) {// Attention => &$niveau 
    	$rs_cat = mysql_query("SELECT id, nom, parent FROM categorie WHERE parent = '".(int)$fils."' 
    			AND famille='".bdd($_GET['nom'])."' ORDER BY ordre ASC") or die(mysql_error($rs_cat));
    	$tot_cat = mysql_num_rows($rs_cat);
    	//
    	if ($tot_cat <= 0 && (int)$niveau > 0) $niveau--;
    	$chevron = '';
    	for ($i=0; $i <= $niveau; $i++) $chevron .= ' &gt; ';
    	//
    	if ((int)$tot_cat > 0) {
     
    		//$i = 0;
    		while ($cat = mysql_fetch_assoc($rs_cat)) {
    			$niveau++;
    		if($select==$cat['id']){$id_selected='selected';}	
    			//echo $chevron.'(id:'.$cat['id'].'-par:'.$cat['parent'].') '.$cat['nom'].'<br />';
    			//echo $chevron.$cat['nom'].'<br />';
    			echo '<option name="'.$cat['id'].'" ',
    			'value="'.$cat['id'].'" '.$id_selected.' >'.$chevron.$cat['nom'].'</option>',"\n";
     
    			// &nbsp;&nbsp; et on boucle en recursivité
    			liste_cat_select($cat['id'], &$niveau, $select);
    		}
    	}
    }
    quand je suis sur le meme niveau ex:
    id 8 parent de id12 et id15 => j'ai le id12 et le 15 qui sont tous les 2 "selected"
    ... et y'a peut etre d'autres defauts que je n'ai pas vu ...

Discussions similaires

  1. Plusieurs groupes parents dans un état
    Par fabOK dans le forum IHM
    Réponses: 2
    Dernier message: 02/10/2013, 12h35
  2. [AC-2007] 1 image, plusieurs categories
    Par POPR26 dans le forum Access
    Réponses: 1
    Dernier message: 13/07/2012, 11h41
  3. Réponses: 2
    Dernier message: 05/02/2010, 14h07
  4. Un control enfant pour plusieurs Controls Parents
    Par Cedric33 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/10/2008, 10h14
  5. Réponses: 2
    Dernier message: 18/02/2008, 12h30

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