Se connecter / S'enregistrer
Votre question

Module d'article les plus commenté en php

Tags :
  • Sql
  • Programmation
Dernière réponse : dans Programmation
31 Octobre 2009 12:58:05

Bonjour, donc voila comme précisé dans le titre je suis entrain de faire un module qui classe mes articles en fonction du nombre de commentaire.

Pour cela j'ai une table "article" ou chaque article ajouté prend un certain id
et une seconde table "comment" ou chaque commentaire ajouté prend un id et en plus de ca prend l'id de l'article via un formulaire donc de colonne essentiel : id et id_art.

J'ai réussi à récupérer dans un tableau associatif le nombre de commentaire selon les article grace à ce bout de code:

<?php

include('connexion.php');

$[/contents/sql/sqlintro.php3 sql] = "[/contents/sql/sqlsel.php3 SELECT] id_art FROM comment";
$result = mysql_query($sql);
while($donnees = mysql_fetch_array($result))
{
$tbl_comment[] = $donnees['id_art'];
}
$tbl_comment = array_unique($tbl_comment);
print_r($tbl_comment); echo '<br>';
$max = max($tbl_comment);
echo $max; echo '<br>';
for($i=0 ; $i<=$max ; $i++)
{
$sql = "SELECT id FROM comment WHERE id_art = $i";
$result = mysql_query($sql);

if(mysql_num_rows($result)>0)
{
$req = "SELECT COUNT(*) AS id FROM comment WHERE id_art = $i";
$result = mysql_query($req);
while($donnees = mysql_fetch_array($result))
{
$class_plus_comment[$i] = $donnees['id'];
}
}
}
print_r($class_plus_comment);
?>
Avec ca j'obtiens : Array ( [2] => 6 [3] => 1 [4] => 2 [11] => 2 )

Donc entre crochet c'est le numéro de l'article et ensuite c'est le nombre de commentaire associé à cette article.
Donc ce que j'aimerais maintenant c'est classé le nombre de commentaire en ordre décroissant ( ca je sais le faire ) mais le probleme c'est que le nombre entre crochet ne suis pas. Je m'explique j'obtiens un nouveau tableau:
Array ( [0] => 6 [1] => 2 [2] => 2 [3] =>1 )

On peut voir que le nombre de commentaire a été classé mais que le numéro de l'article associé n'y est lpus Or moi j'aimerais obtenir ca: Array ( [2] => 6 [4] =>2 [11] => 2 [3] => 1 )
En considérant qu'il y aurait beaucoup plus de commentaire sur beaucoup plus d'article , je pensais récupéré les 5 premiers afin d'afficher le titre de l'article.

Si c'est un peu confus je m'en excuse mais je crois que c'est justement pour ca que je n'y arrive pas.

Donc je résume mes problèmes:
***Classer le tableau par ordre décroissant le nombre de commentaire tout en faisant en sorte que l'id de l'article suive le classement.
( Une fois fais, je pense que récupéré les 5 premières valeur dans un nouveau tableau ne devrait pas être difficile )
***Récupérer le résultat en faisant une boucle, je pense, de ce style la:
Récupération des premières valeurs: [2] => 6
- $sql = "SELECT * FROM article WHERE id=2";
....
Suivant : [4] => 2
- ............. [/contents/sql/sqlrestr.php3 WHERE] id=4
Etc...

J'espere que vous quelqu'un sera en mesure de résoudre mon problème.
Merci d'avance.
PS: Si vous avez des chose à redire sur le début du code n'hésitez pas.

Autres pages sur : module article commente php

a c 232 L Programmation
1 Novembre 2009 19:42:36

Salut,

Ca fait longtemps que j'ai pas fait de PHP, mais pour trier ton tableau, tu n'auras même pas besoin de PHP.
Tu dois pouvoir faire la majorité de tes opérations avec du SQL...

SELECT id_art, COUNT(*) AS nb_comment
FROM comment
GROUP BY id_art
ORDER BY nb_comment DESC
LIMIT 5

si je ne me suis pas planté... ça devrait te retourner les 5 articles les plus commentés avec id_art qui contient l'id de l'article et nb_comment qui contient le nombre de commentaires associés à cet article
m
0
l
2 Novembre 2009 22:51:02

J'ai essayé avec ce code la donc: en utilisant ce que tu m'a conseillé et en l'adaptant.
<?php

include('connexion.php');

$sql = "SELECT id_art FROM comment";
$result = mysql_query($sql);
while($donnees = mysql_fetch_array($result))
{
$tbl_comment[] = $donnees['id_art'];
}
$tbl_comment = array_unique($tbl_comment);
$max = max($tbl_comment);
for($i=0 ; $i<=$max ; $i++)
{
$sql = "SELECT id FROM comment WHERE id_art = $i";
$result = mysql_query($sql);

if(mysql_num_rows($result)>0)
{
$req = "SELECT article.contenu, article.titre, article.auteur, id_art, COUNT(*) FROM comment, article WHERE article.id = comment.id_art GROUP BY id_art ORDER BY COUNT(*) DESC LIMIT 5";
$result = mysql_query($req) or die(mysql_error());
while($donnees = mysql_fetch_array($result))
{
echo ''.$donnees['titre'].' est classé dans les 5 premiers<br><br>';
}
}
}
?>

Ca me donne bien les 5 titre les plus classé mais la liste est répété 6 fois par contre.
C'est a dire qu'au lieu d'avoir seulement :
1er titre (le plus commenté )
2eme titre
3eme titre
4eme titre
5eme titre.

j'ai :
1er titre (le plus commenté )
2eme titre
3eme titre
4eme titre
5eme titre.

1er titre (le plus commenté )
2eme titre
3eme titre
4eme titre
5eme titre.

6 groupe de 5

La seul fois ou apparait 6 c'est le nombre de commentaire qu'a l'article le plus commenté. Donc j'ai vérifié ca et j'ai rajouté un commentaire mais ca le vérifie pas , y a toujours 6 groupe.
SI tu vois d'ou ca vien n'hésite pas stp
m
0
l
a c 145 L Programmation
3 Novembre 2009 08:54:22

Tu fais bien trop de requêtes:
  1. <?php
  2. $qry = "SELECT a.*, COUNT(c.*) AS nb_comment
  3. FROM articles a
  4. LEFT JOIN comment c ON (c.id_art=a.id_art)
  5. GROUP BY c.id_art
  6. ORDER BY nb_comment DESC
  7. LIMIT 5";
  8. $res = mysql_query($qry);
  9. if (@mysql_numrows($res)<1) exit;
  10. $liste = array();
  11. while ($row = mysql_fetch_array($res)) {
  12. $liste[$row['id_art']] = array(
  13. 'titre' => $row['titre'],
  14. 'nb_com' => $row['nb_comment']
  15. );
  16. }
  17. echo '<pre>', var_dump($liste), '</pre>';
  18. ?>
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS