Creation Classement PHP par mois

Creation Classement PHP par mois - PHP - Programmation

Marsh Posté le 15-04-2010 à 14:16:23    

Bonjour,  
 
J'ai créé un classement en php de mes membres les plus actifs mais je voudrais également créer un classement de ces membres par mois, et si possible que le changement de mois se fasse automatiquement.
 
Voici mon classement:
 

Code :
  1. <tr><td width="500" border="2" align=center>
  2. <center><strong><font size="3" color="#8fce05"><u>Les meilleurs surfeurs:</u></font></strong><br><br>
  3. <?php
  4. // on se connecte à MySQL (à remplir)  
  5. $db = mysql_connect('******', '******', '******');
  6. // on sélectionne la base (à remplir)  
  7. mysql_select_db('******',$db);
  8. // Tableau des meilleurs surfeurs
  9. $recup_surfer =mysql_query( 'SELECT DISTINCT `name`, `lifetime_pages` FROM `user` ORDER BY `lifetime_pages` DESC LIMIT 0, 10 '); 
  10. echo mysql_error();
  11. echo '<table width=500 border=2 align=center>';
  12. echo '<tr><td align=center><strong><font size=2 color=#8fce05>Nr</font></strong></td><td align=center><strong><font size=2 color=#8fce05>Utilisateur</font></strong></td><td align=center><strong><font size=2 color=#8fce05>Pages vues</font></strong></td></tr>';
  13. $compteur = 1;
  14. while($best_surfer = mysql_fetch_array($recup_surfer)){
  15.      // Mise en forme des données à revoir  
  16.  echo '<tr>';
  17.      echo "<td align='center'><font size=2 color=#ffffff>".$compteur."</font></td>";
  18.      echo "<td align='center'><font size=2 color=#ffffff>".$best_surfer["name"]."</font></td>";
  19.      echo "<td align='center'><font size=2 color=#ffffff>".$best_surfer["lifetime_pages"]."</font></td>";
  20.      $compteur++;
  21.  echo '</tr>';
  22. }
  23.  echo '</table>';
  24. ?>
  25. <br><br><br>
  26. </td></tr>


 
 
Après avoir chercher, j'ai trouvé ceci: WHERE date >= '2010-04-01 00:00:00' AND date <= '2010-04-30 00:00:00'
 
mais je n'ai pas de champ date dans ma table, j'en ai créé une qui reste tout le temps a 0000-00-00
 
 
Soit, quelqu'un pourrait m'aider svp ?

Reply

Marsh Posté le 15-04-2010 à 14:16:23   

Reply

Marsh Posté le 15-04-2010 à 14:24:36    

Salut,
 
Est ce que tu pourrais ajouter le code lorsque tu insère des données ans ta table ?

Reply

Marsh Posté le 15-04-2010 à 14:31:35    

ben faudrait que ton champ date (à ne surtout pas appeler comme ça!!!) soit renseigné par ton appli, il va pas se renseigner tout seul :/
 
Pour info, pour faire des stats sur un site, t'as l'outil GPL Piwik. Ca fait tout ça et bien plus... Pas la peine de réinventer la roue.


---------------
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 15-04-2010 à 14:37:39    

Merci pour l'info RUFO ( Piwik)

Reply

Marsh Posté le 15-04-2010 à 14:41:03    

Ben en fait ce n'est pas des stats de mon site dont j'ai besoin mais des stats de mes membres.
 
Je voudrais faire un classement par mois de mes membres pour en faire un concours mensuel
 
mon classement il est fait, j'ai juste besoin de savoir comment faire pour qu'il n'affiche que les stats des membres du mois en cours (et si possible faire en sorte qu'il s'actualise automatiquement chaque mois)


Message édité par tszlachter le 15-04-2010 à 14:43:00
Reply

Marsh Posté le 15-04-2010 à 14:49:54    

ben faut avoir un champ de type datetime qui est renseigné à chaque fois qu'un utilisateur vient sur ton site (ou sur chaque page du site).
 
Si tu travaille avec les date et heure, pour les regroupement par date, tu dois faire un SELECT `name`, DATE_FORMAT(ChampDate,'%Y-%m') AS Mois FROM .... WHERE DATE_FORMAT(ChampDate,'%Y-%m-%d') BETWEEN "2010-01-01" AND "2010-03-31" GROUP BY Mois, `name`


---------------
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 15-04-2010 à 14:52:14    

ok merci je vais tester tout ça

Reply

Marsh Posté le 15-04-2010 à 15:22:45    

Par conter il faut que ton champ 'DATETIME' soit bien renseigné, tu nous avais dis qu'il était tout le temps à 0000

Reply

Marsh Posté le 16-04-2010 à 10:16:53    

Bon j'avance un petit peu mais je m'en sors toujours pas donc je reviens vers vous, je vais noter un max de détail pour que vous aillez le plus facile à m'aider.
 
Question de base:
 
Comment faire un classement des meilleurs surfeurs par mois (en vue de faire un concours chaque mois) et si possible que ce classement se réactualise automatiquement chaque mois
 
Pour résumer:
 
-J'ai 2 tables qui m'intéresse: 7stat et user
 
---7stat: table qui sert à stocker le nombre de visite de chaque membre chaque jour
 
 il y a 3 champ intéressants: usrid (id du membre), date (du type yyyy-mm-dd), et pg_views (total des pages vues du jour pour chaque membre)
 
Aperçu de la table:

Code :
  1. usrid         date          pg_views
  2. 1   2010-04-10     2
  3. 2  2010-04-11   3
  4. 1  2010-04-12   748
  5. 5  2010-04-12   478
  6. 6  2010-04-12   745
  7. 7  2010-04-12   87
  8. 6  2010-04-13   1379
  9. 1  2010-04-13   3750
  10. 9  2010-04-13   57
  11. 8  2010-04-13   2019
  12. 10  2010-04-13   375
  13. 11  2010-04-13   95


 
 
---user: table qui stock les données du membre
 
il y a 3 champ intéressants: id (id du membre), name (pseudo du membre), lifetime_pages (total des pages vues pour chaque membre)
 
 
 
En bidouillant bcp j'ai reussi à faire ceci:
 
J'ai mon tableau, mais il n'affiche que moi (soit le membre connecté voit son pseudo avec ses stats), la date n'est pas automatique mais lorsque je la change ça fonctionne.
 
Donc il reste à afficher le top 10 (et pas uniquement le membre connecté) et ensuite actualiser pour avoir mon classement chaque mois
 

Code :
  1. <?php
  2. // on se connecte à MySQL (à remplir)  
  3. $db = mysql_connect('*****', '*****', '*****');
  4. // on sélectionne la base (à remplir)  
  5. mysql_select_db('*****',$db);
  6. // Tableau des meilleurs surfeurs
  7. $recup_surfer =mysql_query( "SELECT SUM(pg_views) as `usrid`, `date` FROM 7stat WHERE usrid=$usrid AND date >= '2010-04-01' AND date <= '2010-04-30' ORDER BY `pg_views` DESC LIMIT 0, 10" ); 
  8. $classement=current(mysql_fetch_array(mysql_query("SELECT SUM(pg_views) as `usrid`, `date`, `pg_views` FROM 7stat WHERE usrid=$usrid AND date >= '2010-04-01' AND date <= '2010-04-30' ORDER BY `pg_views` DESC LIMIT 0, 10" )));
  9. echo mysql_error();
  10. echo '<table width=500 border=2 align=center>';
  11. echo '<tr><td align=center><strong><font size=2 color=#8fce05>Nr</font></strong></td><td align=center><strong><font size=2 color=#8fce05>Utilisateur (ID)</font></strong></td><td align=center><strong><font size=2 color=#8fce05>Pages vues</font></strong></td></tr>';
  12. $compteur = 1;
  13. while($best_surfer = mysql_fetch_array($recup_surfer)){
  14.      // Mise en forme des données à revoir  
  15.  echo '<tr>';
  16.      echo "<td align='center'><font size=2 color=#ffffff>".$compteur."</font></td>";
  17.      echo "<td align='center'><font size=2 color=#ffffff>".$usrname." (".$usrid." )</font></td>";
  18.      echo "<td align='center'><font size=2 color=#ffffff>".$classement."</font></td>";
  19.      $compteur++;
  20.  echo '</tr>';
  21. }
  22.  echo '</table>';
  23. ?>


 
 
 
Si vous voulez voir en ligne, inscrivez-vous la: http://autosurf.astuceargent.com/
et puis rdv la tout en bas: http://autosurf.astuceargent.com/m [...] urfers.php


Message édité par tszlachter le 16-04-2010 à 10:18:33
Reply

Marsh Posté le 16-04-2010 à 12:20:51    

Ton select devrait être

 

select usrid,
         sum(pg_views) as "pg_views"
from matable
where date between <début du mois> and <fin du mois>
group by usrid
order by sum(pg_views)
limit 0, 10

 

Ton SUM(pg_views) as `usrid`, c'est comme si tu disais que 10 patates = 1 carotte, techniquement ça ne gène pas mais fonctionnellement c'est faux.

 

Le tableau n'affiche que l'utilisateur connecté pour la bonne et simple raison qu'il y a la clause "WHERE usrid=$usrid".

 

Comme on te l'a déjà dit,
- n'utilise JAMAIS de mot qui ressemble trop à un mot-clé pour nommer un champ : ici, "date",
- préfère le BETWEEN au "champ1 >= valeur 1 AND champ1 <= valeur2".

 


Et un dernier truc : la présentation du code, qui t'aurait permis de voir pourquoi ton tableau n'affiche que l'utilisateur connecté. Préfère un truc comme :

 
Code :
  1. $requete = "select champ1
  2.             from   table1 t1
  3.                        inner join table2 t2 on t1.id = t2.id
  4.             where  t1.critere1 = $valeur1
  5.             and    t2.critere2 = valeur2";
  6. mysql_query($requete) or die ($message);
 

C'est BEAUCOUP plus lisible, à terme quand il faut maintenir tu gagnes pas mal de temps.


Message édité par Fred999 le 16-04-2010 à 12:21:06
Reply

Marsh Posté le 16-04-2010 à 12:20:51   

Reply

Marsh Posté le 16-04-2010 à 13:49:04    

remarque en passant : je suis pas sûr que ça soit une bonne idée de faire commencer le nom d'une table par un chiffre :/


---------------
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 16-04-2010 à 13:53:22    

Si on commence comme ça, faut faire un topo sur la nomenclature des bases de données :o

Reply

Marsh Posté le 16-04-2010 à 14:21:38    

Merci bcp, mon classement fonctionne correctement !
 
Il reste juste à actualiser automatiquement la date du classement chaque mois pour ne pas devoir le faire à la main chaque début de mois.
 
Malgré tout j'ai encore (et oui ...  :pt1cable: ) un petit probleme.
 
Comment afficher le nom d'un membre dont le champ est dans une autre table ?
 
le champ 'name' se trouve dans ma table 'user'
 
PS: merci bcp a Fred999 pour m'avoir fourni des explications supplémentaires pour ma compréhension.
 
 
Rappel du code:
 

Code :
  1. <?php
  2. // on se connecte à MySQL (à remplir)  
  3. $db = mysql_connect('******', '******', '******');
  4. // on sélectionne la base (à remplir)  
  5. mysql_select_db('******',$db);
  6. // Tableau des meilleurs surfeurs
  7. $recup_surfer =mysql_query( "SELECT `usrid`,  sum(pg_views) as `pg_views`, `champdate` FROM 7stat WHERE champdate BETWEEN '2010-04-01' AND '2010-04-30' GROUP BY usrid ORDER BY sum(pg_views) DESC LIMIT 0, 10" ); 
  8. echo mysql_error();
  9. echo '<table width=500 border=2 align=center>';
  10. echo '<tr><td align=center><strong><font size=2 color=#8fce05>Nr</font></strong></td><td align=center><strong><font size=2 color=#8fce05>Utilisateur (ID)</font></strong></td><td align=center><strong><font size=2 color=#8fce05>Pages vues</font></strong></td></tr>';
  11. $compteur = 1;
  12. while($best_surfer = mysql_fetch_array($recup_surfer)){
  13.      // Mise en forme des données à revoir  
  14.  echo '<tr>';
  15.      echo "<td align='center'><font size=2 color=#ffffff>".$compteur."</font></td>";
  16.      echo "<td align='center'><font size=2 color=#ffffff>(".$best_surfer["usrid"]." )</font></td>";
  17.      echo "<td align='center'><font size=2 color=#ffffff>".$best_surfer["pg_views"]."</font></td>";
  18.      $compteur++;
  19.  echo '</tr>';
  20. }
  21.  echo '</table>';
  22. ?>

Reply

Marsh Posté le 16-04-2010 à 15:06:02    

La date du classement... en PHP, il y a une fonction date() pour récupérer la date système.
 
Sinon, pour ta question, je te conseille sérieusement de te documenter sur les bases du SQL... cela te sera plus utile que de voir une requête tout faite.

Reply

Marsh Posté le 16-04-2010 à 23:12:28    

Pour insérer le pseudo du membre j'ai utilisé INNER JOIN comme ceci:
 
$recup_surfer =mysql_query( "SELECT user.name as `sname`, `usrid`,  sum(pg_views) as `pg_views`, `champDate` FROM `7stat` INNER JOIN `user` ON user.id=7stat.usrid WHERE champDate BETWEEN '2010-04-01' AND '2010-04-30' GROUP BY usrid ORDER BY sum(pg_views) DESC LIMIT 0, 10" );  
 
 
 
 
Il me reste encore à actualiser automatiquement la date chaque mois... j'avance lentement mais j'avance :)
 
Voila mon code terminé.
 

Code :
  1. $recup_surfer =mysql_query( "SELECT user.name as `sname`, `usrid`,  sum(pg_views) as `pg_views`, DATE_FORMAT(champDate,'%Y-%m') AS Mois FROM `7stat` INNER JOIN `user` ON user.id=7stat.usrid WHERE DATE_FORMAT(champDate,'%Y-%m-%d') BETWEEN '2010-01-01' AND '2010-12-31' GROUP BY Mois, usrid ORDER BY sum(pg_views) DESC LIMIT 0, 10" );


 
 
Le code est-il ok ?
 
Merci bcp pour toute votre aide.


Message édité par tszlachter le 16-04-2010 à 23:44:19
Reply

Marsh Posté le 17-04-2010 à 11:27:12    

heu, t'as quand même pas appelé le champ qui doit contenir la date et l'heure de visite d'une page "ChampDate" :??: J'ai donné un nom générique juste pour l'exemple... :/


---------------
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 17-04-2010 à 19:36:51    

Ben on m'a dit de pas l'appeler date pour ne pas créer de soucis avec les fonctions date.
 
J'avais bien compris que tu nommais ce champ "champDate" comme exemple lol ... je suis novice mais quand meme pas bete ... héhé
 
Donc je l'ai appelé champDate, le nom importe peu du moment que je me comprends non ? ^^
 
En tout cas merci beaucoup, j'en ai beaucoup appris, et je compte encore progresser.


Message édité par tszlachter le 17-04-2010 à 19:38:50
Reply

Marsh Posté le 19-04-2010 à 10:12:27    

Faut toujours appeler un chat un chat. Donc ton nom de champ dans le BD doit avoir un sens, être représentatif de sa fonction, à quoi il sert  :o


---------------
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