Commentaires et réponses (récursivité?)

Commentaires et réponses (récursivité?) - PHP - Programmation

Marsh Posté le 11-05-2010 à 13:00:44    

Bonjour.

 

Dans ma table commentaire je possède un champs reply_id qui me permet de savoir si un commentaire vient en réponse à un autre commentaire.

 

Dans ma page il faudrait donc que j'affiche la liste des commentaires avec leur réponses (un commentaire de réponse doit venir juste en dessous de son commentaire parent)

 

J'ai du mal à voir comment mettre cela en place sachant qu'un commentaire peux avoir autant de réponses et qu'une réponse à une réponse peux avoir une réponse.

 

Ca me semble être un bouclage infini mais je dois mal m'y prendre

 

Affichage d'un commentaire
 Si le commentaire à une réponse on l'affiche (il faut donc récupérer les  commentaires fils)
       Il faut ensuite tester si le commentaire fils a lui aussi eu une réponse.
 etc etc
   
Sinon on affiche le commentaire suivant

 

Ca me semble être un truc sans fin, je dois rater quelque chose non ou c'est la bonne manière de procéder?
Avec un truc dans le genre j'arrive à récupérer les réponses à un post, mais du coup si une réponse a une réponse cela ne sera pas affiché.
On m'a conseillé d'utiliser la récursivité, si vous avez une idée sur quoi faire et comment faire je suis preneur.

 
Code :
  1. <?php
  2. function getComments($row) {
  3. echo "<li class='comment'>";
  4. echo "<div class='aut'>".$row['author']."</div>";
  5. echo "<div class='comment-body'>".$row['comment']."</div>";
  6. echo "<div class='timestamp'>".$row['created_at']."</div>";
  7. echo "<a href='#comment_form' class='reply' id='".$row['id']."'>Reply</a>";
  8. /* The following sql checks whether there's any reply for the comment */
  9. $q = "SELECT * FROM threaded_comments WHERE parent_id = ".$row['id']."";
  10. $r = mysql_query($q);
  11. if(mysql_num_rows($r)>0) // there is at least reply
  12.   {
  13.   echo "<ul>";
  14.   while($row = mysql_fetch_assoc($r)) {
  15.    getComments($row);
  16.   }
  17.   echo "</ul>";
  18.   }
  19. echo "</li>";
  20. }
  21. ?>
 

Merci par avance


Message édité par masseur le 11-05-2010 à 13:15:51
Reply

Marsh Posté le 11-05-2010 à 13:00:44   

Reply

Marsh Posté le 11-05-2010 à 14:03:25    

C'est un arbre. D'ailleurs, on voit cela sur certains anciens forums où l'on a, visuellement, quelque chose qui ressemble à une liste de répertoires, avec sous-répertoires, etc.

Reply

Marsh Posté le 11-05-2010 à 15:28:23    

Surtout pas la récursivité! Tu peux facilement transformer ce pb en itératif. Je l'ai implémenté dans mes 2 softs (Astres et Icare, cf ma signature).
Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index. La première stockes la position de l'élément en cours de traitement et la 2ième, la position pour l'insertion du prochain élément trouvé qui sera être rajouté dans le tableau des éléments à traiter (en général, c'est en fin de tableau).
Le traitement est terminé quand les 2 index ont la même valeur.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-05-2010 à 15:36:43    

rufo a écrit :

Surtout pas la récursivité! Tu peux facilement transformer ce pb en itératif.


 :ouch: Tu peux meme le coder directement en binaire, le php c'est comme la recursivite, beaucoup trop simple et indigne de nous autres. :ouch:  

Reply

Marsh Posté le 11-05-2010 à 15:41:19    

Surtout pas la récursivité car bien souvent, tu ne maîtrises pas la taille de l'arbre (le plus gênant étant la profondeur) et donc, un parcours par récursivité va faire que tu vas pas arrêter d'empiler sur la pile les appels de fonctions, pile qui va finir par péter. A ça, tu rajoutes que la récursivité est une catastrophe en terme de perfs par rapport à l'itératif (ben oui, stocker sur la pile le contexte, ça a un coût en temps).
 
Donc, je répète, surtout pas de récursivité pour un parcours d'arbre.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-05-2010 à 16:06:03    

rufo a écrit :

Surtout pas la récursivité! Tu peux facilement transformer ce pb en itératif. Je l'ai implémenté dans mes 2 softs (Astres et Icare, cf ma signature).
Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index. La première stockes la position de l'élément en cours de traitement et la 2ième, la position pour l'insertion du prochain élément trouvé qui sera être rajouté dans le tableau des éléments à traiter (en général, c'est en fin de tableau).
Le traitement est terminé quand les 2 index ont la même valeur.


 
Ok je vais essayer de comprendre.

Citation :

Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index.


 

Citation :

Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index.[quote]
Un tableaux global contenant tout les commentaires du genre?
array("commentaire1" => array('id' => 5, 'body' => ',xxxxxx' , "commentaire2" => array('id' => 6, 'body' => ',xxxxxx' ......,)
 
[quote]La première stockes la position de l'élément en cours de traitement et la 2ième, la position pour l'insertion du prochain élément trouvé qui sera être rajouté dans le tableau des éléments à traiter (en général, c'est en fin de tableau).


 
La de suite ca devient plus compliqué, si je suis bien,  sur le premier commentaire je suppose qu'on mettra 1 pour la position et par contre pour l'insertion du prochaine élément j'ai pas trop saisi.
 
Si tu peux aussi me dire dans quel fichier tu gères cela dans tes projets ca serait cool, après peux être que tu t'en souviens plus.
Merci bien.
 
 

Reply

Marsh Posté le 11-05-2010 à 16:19:24    

La fonction getSubLevelsAowOfAow() du fichier /Astres/Common/DbAowLibrary.php
 
En gros, un ticket de help-desk peut être sous-découpé en plusieurs tickets, eux-mêmes pouvant l'être à leur tour, etc... On a donc pour un ticket, une petite arbo de tickets, chaque ticket étant stocké en BD dans une table qui contient, entre autre, leur niveau de profondeur dans l'arbo (0, 1, 2...) et l'ID vers le ticket parent.
La table contient des pleins d'arbo de tickets, une arbo pouvant être vue comme un "dossier client" (sa demande et tous les sous-découpages vers d'autres services de traitement, on appelle ça en help-desk une escalade).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-05-2010 à 17:06:10    

rufo a écrit :

Surtout pas la récursivité car bien souvent, tu ne maîtrises pas la taille de l'arbre (le plus gênant étant la profondeur) et donc, un parcours par récursivité va faire que tu vas pas arrêter d'empiler sur la pile les appels de fonctions, pile qui va finir par péter. A ça, tu rajoutes que la récursivité est une catastrophe en terme de perfs par rapport à l'itératif (ben oui, stocker sur la pile le contexte, ça a un coût en temps).

 

Donc, je répète, surtout pas de récursivité pour un parcours d'arbre.

 

C'est un poil trop définitif, comme avis, si tu veux le mien.:D
Là il va se faire chier à implémenter un parcours itératif alors qu'un récursif s'écrit bien plus facilement et répond peut-être très bien au besoin.:o

 

(et sinon, pour répondre un peu plus à la question, il n'y a pas de fonction mysql qui fait ça? Oracle permet de le faire en une requête...:o )


Message édité par skeye le 11-05-2010 à 17:06:57

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 11-05-2010 à 17:22:49    

non, pour avoir implémenté des arbo sous mysql dans mes 2 softs, y'a pas :/ Par contre, on peut s'en sortir si on change sa modélisation dans la bd, pour passer d'un truc genre TableArbo (ID, ......, ParentID) à d'un de ces modèles :
- modèle de "plus proches ensembles" : http://dev.mysql.com/tech-resource [...] -data.html
- modèle appelée en fr "représentation intervallaire" : http://sqlpro.developpez.com/cours/arborescence/
 
Malheureusement, j'ai découvert ces solutions après...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-05-2010 à 17:27:24    

ya de l'espoir.[:petrus75]
 
http://dev.mysql.com/doc/refman/5. [...] uture.html
 

Citation :


B.8.3. Ce qui doit être fait dans un futur proche
Nouvelle fonctionnalité
 
Commande CONNECT BY PRIOR ..., inspirée d'Oracle, pour traiter les structures de type arbre (hiérarchisée).


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 11-05-2010 à 17:27:24   

Reply

Marsh Posté le 11-05-2010 à 17:42:33    

J'aimerais bien savoir l'âge qu'a cette page, mais il me semble l'avoir déjà lue y'a bien longtemps (plus d'1 an)... :D
 
[hs]dans la foulée, ils auraient pu ajouter le fait qu'on puisse aliaser plus d'1 fois une table temporaire dans une requête :/[/hs]


Message édité par rufo le 11-05-2010 à 17:42:57

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-05-2010 à 18:59:28    

Le problème c'est que toi tu stoques le level et une autre valeur dans ta base.

 

Moi j'ai uniquement un champs parent_id et donc je voudrais récupérer toutes les réponses filles par ordre ou le commentaire a été posté comme on le voit sur cette image par exemple.

 

http://3.bp.blogspot.com/_FX3RmPEl [...] mments.png

 

Ca me gonfle je ne sais pas comment m'y prendre.

Message cité 1 fois
Message édité par masseur le 11-05-2010 à 18:59:48
Reply

Marsh Posté le 11-05-2010 à 19:17:15    

tu fais une fonction du genre  

Code :
  1. afficheCommentaireFils($idParent)
  2. {
  3.    $query ="SELECT idCommentaire,nom,contenu FROM table WHERE idPArent =$idParent";
  4.    $result = mysql_query($query);
  5.    while(list($idCommentaire,$titre,$contenu) = mysql_fetch_array($result))
  6.     {
  7.            echo $titre.' '.$contenu;
  8.            afficheCommentaireFils($idCommentaire);
  9.  
  10.      }
  11. }


 
le aprcours itératif, c'est bien pour optimiser, mais c'est pas aussi simple que ça à mettre en place quand meme. ET le gain me semble marginal

Reply

Marsh Posté le 11-05-2010 à 19:37:03    

flo850 a écrit :

tu fais une fonction du genre

Code :
  1. afficheCommentaireFils($idParent)
  2. {
  3.    $query ="SELECT idCommentaire,nom,contenu FROM table WHERE idPArent =$idParent";
  4.    $result = mysql_query($query);
  5.    while(list($idCommentaire,$titre,$contenu) = mysql_fetch_array($result))
  6.     {
  7.            echo $titre.' '.$contenu;
  8.            afficheCommentaireFils($idCommentaire);
  9.  
  10.      }
  11. }
 

le aprcours itératif, c'est bien pour optimiser, mais c'est pas aussi simple que ça à mettre en place quand meme. ET le gain me semble marginal

 

Ca sous entend que je dois appeler cette fonction pour chacun de mes commentaires?
En effet quand je suis sur la page du détail d'un article, je ne sais pas ce que vaut idparent, il faut donc que j'appel cette fonction autant de fois qu'il y a de commentaires ?


Message édité par masseur le 11-05-2010 à 19:37:28
Reply

Marsh Posté le 11-05-2010 à 20:11:45    

tu l'appelle avec idParent a zéro
mais effectivement, tu vas l'appeler un paquet de fois ( autant que de commentaire)

Reply

Marsh Posté le 12-05-2010 à 09:29:00    

masseur a écrit :

Le problème c'est que toi tu stoques le level et une autre valeur dans ta base.
 
Moi j'ai uniquement un champs parent_id et donc je voudrais récupérer toutes les réponses filles par ordre ou le commentaire a été posté comme on le voit sur cette image par exemple.
 
http://3.bp.blogspot.com/_FX3RmPEl [...] mments.png
 
Ca me gonfle je ne sais pas comment m'y prendre.


 
Mon critère d'arrêt le level, mais c'est parce que je permets à ma fonction de pas tout récupérer l'arbo (limite dans la remontée ou dans la profondeur). Toi, ton critère d'arrêt, ben c'est quand tu ne trouves plus aucun élément à traiter. Donc tu tiens pas compte du level. Mais le principe de l'algo est le même.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed