Module articles les plus commentés en php

Fermé
kepsylis - 31 oct. 2009 à 12:54
 kepsylis - 3 nov. 2009 à 13:35
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');

$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);
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
- ............. 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.
A voir également:

8 réponses

Dynamix Messages postés 202 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 30 avril 2011 76
3 nov. 2009 à 12:42
Cela vient certainement de ta boucle car au niveau au niveau du while tu ne devrais avoir en aucun cas plus de 5 titres (à cause du limit 5).

$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>';
}

Pourquoi ne pas laisser que ça?
1
Dynamix Messages postés 202 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 30 avril 2011 76
31 oct. 2009 à 13:11
SELECT art.contenu, art.titre, art.auteur, idart, COUNT(*)
FROM commentaire, article
WHERE article.idart = commentaire.idart
GROUP BY idart
ORDER BY COUNT(*) DESC;

Voilà comment sélectionner ce que tu veux en une seule requête.

Si t'as une question n'hésite pas.
0
Excuse moi je ne vois pas à quel endroit se situe ce code. Je dois l'utiliser dans quel but.
Est-ce une modification de mon propre code au début ou à la suite.

Si ca correspond à ma derniere demande :
"Récupération des premières valeurs: [2] => 6
- $sql = "SELECT * FROM article WHERE id=2";
....
Suivant : [4] => 2
- ............. WHERE id=4
Etc..."

Comment faire pour classer mon tableau comme demandé stp.

Merci de ta réponse en tout cas.
0
Dynamix Messages postés 202 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 30 avril 2011 76
31 oct. 2009 à 14:44
Ma réponse manquait un peu d'explication :

Donc la requête SQL suivante te permet de récupérer tes articles classés suivant le nombre de commentaires (du plus grand au plus petit) .
Dans cet exemple, j'ai nommé la table "art" pour les articles et "commentaire" pour les commentaires.

Donc au début de ton code :

//Sélection des articles classés suivant le nombre de commentaires
$rqt ="SELECT art.contenu, art.titre, art.auteur, idart, COUNT(*)
FROM commentaire, article
WHERE article.idart = commentaire.idart
GROUP BY idart
ORDER BY COUNT(*) DESC";
mysql_query($rqt);

// Affichage des articles
while($donnees = mysql_fetch_array($rqt)) {

// Là tu gères l'affichage

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai essayé avec ce code la donc
<?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
0
Mais j'ai bien les 5 titre avec le plus de commentaire mais le truc c'est que c'est répété 6 fois comme écris précédemment et ca je ne vois pas d'ou ca viens et que veux tu dire par "Pourquoi ne pas laisser que ca ?"

Tu veux dire remplacer tout le code par seulement ca ?
0
Perfecto ! Je vien d'essayer ce bout de code seul et ca fonctionne a merveilleux.
Pourquoi faire compliqué quand on peux faire simple.

Encore merci Dynamix pour cette aide apporté. Je t'en suis tres reconnaissant.
0
Par contre, la je suis entrain d'étudier le code ou du moins la requete et je bloque sur le GROUP BY j'esaye de comprendre à quoi il sert mais je ne vois pas. Peut tu me dire ce qu'il permet de faire dans mon cas stp ?
0