Page 1 sur 1

Tri des données d'une table

Posté : 23 oct. 2006, 09:16
par Lunatik
Bonjour,

Je dispose d'une table avec les champs suivants:
`id`,`nom`,`parent`. Cette table sert à définir des dossiers de classification. Le champ `parent` indique ici l'id du dossier conteneur, s'il existe.
Il n'y a pas de limitation à la création de sous-dossiers.
Je souhaite pouvoir afficher l'ensemble des dossiers pour impression, par ordre alphabétique et en affichant les sous-dossiers.
Je n'y arrive pas. Quelqu'un a t-il une piste ??

Par avance, merci.

Posté : 23 oct. 2006, 09:52
par Cyrano
Qu'as-tu déjà essayé ? à priori, je dirais que c'est un problème de SQL à la base et pas encore de PHP.

Posté : 23 oct. 2006, 12:59
par Lunatik
j'ai fait un essai avec ceci:

Code : Tout sélectionner

<? include('acces.php'); $sql="SELECT * FROM folder where archive=0 ORDER BY parent,idDossier "; $req=mysql_query($sql) or die(mysql_error()); ?> <html> <head> <title>Document sans titre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <? while($enr=mysql_fetch_array($req)){ $sql2="SELECT * FROM `folder` WHERE `archive`=0 AND `parent`='".$enr['idDossier']."'"; $req2=mysql_query($sql2); echo "<b>".$enr['idDossier']." - ".$enr['nomDossier']." - ".$enr['parent']."</b><br>"; while($enr2=mysql_fetch_array($req2)){ echo "---->".$enr2['nomDossier']."<br>"; } } ?>
Ca marche avec un seul niveau de sous-dossier. mais je n'arrive pas à développer.

Merci

Posté : 23 oct. 2006, 13:10
par Mim
Quelle différence entre la première requête, qui marche, et la deuxième, qui échoue ? Les apostrophes !
Dans ton code, en outre, tu ne vérifies pas le résultat de $req2 (tu le fais pour $req1)... Comment savoir ce qui cloche dans ce cas ? ;-))

Posté : 23 oct. 2006, 13:19
par Ryle
Ne sachant pas à l'avance combien il y a de sous dossiers, et plutôt que d'imbriquer nombre de requête, je me contenterais d'une simple requête sql ramenant tous les enregistrements triés par ordre alphabétique simple, que je stockerais dans un tableau associatif de la forme : parent => nom.

Puis je parcourerais ce tableau à l'aide d'une fonction récursive en affichant tous les éléments dont le "parent" est égal à la valeur passée en paramètre, et en rappelant la fonction pour ceux-ci.

Ainsi en supposant que pour les dossiers à la racine le "parent" soit égal à "0", il parcourerait le tableau une première fois à la recherche des parent à 0, pour chacun il rechercherait alors dans le tableau les fils dont le parent est égal à l'id de ce dernier et ainsi de suite...

Posté : 23 oct. 2006, 13:29
par Lunatik
merci à tous pour vos réponses.

Est-ce que tu pourrais me donner un exemple ryle ??

D'avance, Merci

Posté : 24 oct. 2006, 09:21
par Lunatik
Bonjour,

J'ai suivi la piste de Ryle, et j'ai trouvé le code suivant un peu adapté qui répond à mes attentes:

Code : Tout sélectionner

/*cette fonction gère le décallage des éléments suivant leur position dans l'arborescence */ function espace($rang) { $ch=""; for ($x=0;$x<$rang;$x++) { $ch=$ch."    "; } return $ch; } /*fonction récursive d'affichage de l'arbre $tab :tableau des éléments $pere :index de l'élément courrant $rang :décallage de l'élément */ function recur($tab,$pere,$rang) { //ballayage du tableau for ($x=0;$x<count($tab);$x++) { //si un élément a pour père : $pere if ($tab[$x][1]==$pere) { //on l'affiche avec le décallage courant echo "<tr><td>".espace($rang).$tab[$x][2]."</td></tr>"; /*et on recherche ses fils en rappelant la fonction recur() (+ incrémentation du décallage)*/ recur($tab,$tab[$x][0],$rang+1); } } } $sql="SELECT * FROM `folder` WHERE `archive`=0 ORDER BY `nomDossier`"; $req=mysql_query($sql) or die(mysql_error()); /*-------------------- MAIN ----------------------- tableau des éléments de l'arbre: c'est un tableau à 2 dimensions. Une ligne représente un élément : data[$x] chaque ligne est décomposée en 3 données: - l'index de l'élément - l'index de l'élément parent - la chaîne à afficher ie: data[]= array (index, index parent, chaine ) */ //il faut d'abord déclarer un élément racine de l'arbre $data[] = array(0,-1,"DOSSIERS COURANTS"); $i=1; while($enr=mysql_fetch_array($req)){ $data[]=array($enr['idDossier'],$enr['parent'],$enr['nomDossier']); } //appelle de la fonction récursive (ammorce) //avec recherche depuis la racine. ?> <table width="800px" bordercolor="#333333" border="1 solid" style="border-collapse:collapse"> <? recur($data,0,0); ?> </table>
Merci à tous