Page 1 sur 2

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x - 3.2.1

Posté : ven. 27 mai 2016 23:35
par ym_trainz
Bonsoir :)

Voici une page permettant d'afficher des statistiques détaillées sur votre forum phpBB :

Affiche un tableau de 6 colonnes. Pour chaque colonne, la liste des 30 utilisateurs classés selon le nombre de messages postés (du plus grand au plus petit) selon les périodes suivantes :
sur les dernières 24 heures, la semaine, le mois, le trimestre, le semestre, l'année.

Capture écran en pièce jointe.

Ce code php fonctionne avec php 5.5. (ma version de forum : phpBB 3.1.9)
Il suffit de copier le code ci-dessous, de l'enregistrer dans un fichier.php et de l'upLoader à la racine du forum.
Créer enfin un lien vers cette page.

En donnant un nom particulier à ce fichier php (par exemple : comptage.php) et en ne communiquant le lien qu'à certains responsables du site, on privilégie l'accès à ces informations à l'équipe de modération / administration.

Si cela peut vous être utile ;)
Forumement,
ym_trainz

Code : Tout sélectionner

<?php
   /* -------------------------------------------------
   code pour calcul de statistiques
   par martial B. , MAJ mai 2016 par Yves M. (ym_trainz)
   fonctionne avec php 5.5.34 / phpBB 3.1.9
   copier puis enregistrer sous [root]/statistique.php
   utilisation : à réserver à l'équipe de modération / admin
   -----------------------------------------------------
   */
   echo'<html><head>
   <style type="text/css">

.Style1 {
   color: #94BAD6;
   font-weight: bold;
   
   font-style: italic;
   font-size: 24px;
}
.Style2 {
   color: #94BAD6;
   
   font-weight: bold;
   font-style: italic;
}
body {
   font-family: Arial, "Times New Roman", Times, serif;
}
td {
    /* height: 50px; */
    vertical-align: top;
   font-size: small;
}
</style>
</head>';
if(isset($_POST['nbpost'])){
      $nbpost = $_POST['nbpost']; // nombre de meilleurs posteurs
   }
   else{
      $nbpost = 30; // nombre de meilleurs posteurs par défaut
   }
echo '<body>
<div align="center">
  <a href="index.php"><img src="styles/prosilver/theme/images/site_logo.gif"></a></br>
      <span class="Style1">Petite page de statistiques.</span>
  <p align="center" class="Style2">
  <form action="comptage.php" method="post">
   Ces statistiques sont bas&eacute;es sur les <input type="text"  style="width:40px; background-color:#DDEB93;" name="nbpost" value="'.$nbpost.'"> meilleurs posteurs.<input name="button_process" type="submit" value="Recalculer">
  </form>
  <a href="index.php">Retour page Index</a>
  </p>
</div>
';

   
// -------------------------------------------------
   
include("config.php");

// $db = mysql_connect($dbhost, $dbname, $dbpasswd);
$db = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);

// mysql_select_db($dbname,$db);
// mysqli_select_db($dbname,$db);

// nomUser : pseudo utilisateur
// nbPost : nombre de posts sur la période donnée

$jour = time() - 86400;
$semaine = time() - 604480;
$mois = time() - 2419200;
$trimestre = time() - 7257600;
$semestre = time() - 14515200;
$annee = time() - 29030400;
$sql = 'SELECT s1.nbPost, s2.nomUser FROM (SELECT poster_id AS idUser, count( * ) AS nbPost FROM phpbb3_posts WHERE phpbb3_posts.post_time >'.$jour.' GROUP BY phpbb3_posts.poster_id)s1 JOIN (SELECT user_id AS idUser, username AS nomUser FROM phpbb3_users)s2 ON s1.idUser = s2.idUser order by nbPost DESC limit '.$nbpost.'';
$req = mysqli_query($db, $sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$sql1 = 'SELECT s1.nbPost1, s2.nomUser1 FROM (SELECT poster_id AS idUser, count( * ) AS nbPost1 FROM phpbb3_posts WHERE phpbb3_posts.post_time >'.$semaine.' GROUP BY phpbb3_posts.poster_id)s1 JOIN (SELECT user_id AS idUser, username AS nomUser1 FROM phpbb3_users)s2 ON s1.idUser = s2.idUser order by nbPost1 DESC limit '.$nbpost.'';
$req1 = mysqli_query($db, $sql1) or die('Erreur SQL !<br>'.$sql1.'<br>'.mysql_error());
$sql2 = 'SELECT s1.nbPost2, s2.nomUser2 FROM (SELECT poster_id AS idUser, count( * ) AS nbPost2 FROM phpbb3_posts WHERE phpbb3_posts.post_time >'.$mois.' GROUP BY phpbb3_posts.poster_id)s1 JOIN (SELECT user_id AS idUser, username AS nomUser2 FROM phpbb3_users)s2 ON s1.idUser = s2.idUser order by nbPost2 DESC limit '.$nbpost.'';
$req2 = mysqli_query($db, $sql2) or die('Erreur SQL !<br>'.$sql2.'<br>'.mysql_error());
$sql3 = 'SELECT s1.nbPost3, s2.nomUser3 FROM (SELECT poster_id AS idUser, count( * ) AS nbPost3 FROM phpbb3_posts WHERE phpbb3_posts.post_time >'.$trimestre.' GROUP BY phpbb3_posts.poster_id)s1 JOIN (SELECT user_id AS idUser, username AS nomUser3 FROM phpbb3_users)s2 ON s1.idUser = s2.idUser order by nbPost3 DESC limit '.$nbpost.'';
$req3 = mysqli_query($db, $sql3) or die('Erreur SQL !<br>'.$sql3.'<br>'.mysql_error());
$sql4 = 'SELECT s1.nbPost4, s2.nomUser4 FROM (SELECT poster_id AS idUser, count( * ) AS nbPost4 FROM phpbb3_posts WHERE phpbb3_posts.post_time >'.$semestre.' GROUP BY phpbb3_posts.poster_id)s1 JOIN (SELECT user_id AS idUser, username AS nomUser4 FROM phpbb3_users)s2 ON s1.idUser = s2.idUser order by nbPost4 DESC limit '.$nbpost.'';
$req4 = mysqli_query($db, $sql4) or die('Erreur SQL !<br>'.$sql4.'<br>'.mysql_error());
$sql5 = 'SELECT s1.nbPost5, s2.nomUser5 FROM (SELECT poster_id AS idUser, count( * ) AS nbPost5 FROM phpbb3_posts WHERE phpbb3_posts.post_time >'.$annee.' GROUP BY phpbb3_posts.poster_id)s1 JOIN (SELECT user_id AS idUser, username AS nomUser5 FROM phpbb3_users)s2 ON s1.idUser = s2.idUser order by nbPost5 DESC limit '.$nbpost.'';
$req5 = mysqli_query($db, $sql5) or die('Erreur SQL !<br>'.$sql5.'<br>'.mysql_error());
echo '<table width="1020" align="center" style="vertical-align:top;">';
echo '<tr>';
echo '<td>';
$output = '<table width="160"  bgcolor="#94BAD6" border="1" align="center">';
echo '<table><p align="center" class="Style2"">H-24<br>dernieres 24h.</p></table>';
while($data = mysqli_fetch_assoc($req))
    {
    $output .= '<tr>';
     $output .= '<td>'.$j2=$data['nomUser'].'</td>';
     $output .= '<td>'.$j1=$data['nbPost'].'</td>';
     $output .= '</tr>';
    // on affiche les informations de l'enregistrement en cours
    //$j1=$data['nbPost'];
   //$j2=$data['nomUser'];
    }
   $output .= '</table>';
echo $output;
echo '</td>';
echo '<td>';
$output1 = '<table width="160"  bgcolor="#6B8AA5" border="1" align="center">';
echo '<table><p align="center" class="Style2"">J-7<br>(1 semaine)</p></table>';   
while($data1 = mysqli_fetch_assoc($req1))
    {
    $output1 .= '<tr>';
     $output1 .= '<td>'.$s2=$data1['nomUser1'].'</td>';
     $output1 .= '<td>'.$s1=$data1['nbPost1'].'</td>';
     $output1 .= '</tr>';
    // on affiche les informations de l'enregistrement en cours
    //$j1=$data['nbPost'];
   //$j2=$data['nomUser'];
    }
   $output1 .= '</table>';
   echo $output1;
echo '</td>';
echo '<td>';   
$output2 = '<table width="160"  bgcolor="#94BAD6" border="1" align="center">';   
echo '<table><p align="center" class="Style2"">J-30<br>(le dernier mois)</p></table>';
while($data2 = mysqli_fetch_assoc($req2))
    {
    $output2 .= '<tr>';
     $output2 .= '<td>'.$s2=$data2['nomUser2'].'</td>';
     $output2 .= '<td>'.$s1=$data2['nbPost2'].'</td>';
     $output2 .= '</tr>';
    // on affiche les informations de l'enregistrement en cours
    //$j1=$data['nbPost'];
   //$j2=$data['nomUser'];
    }
   $output2 .= '</table>';
echo $output2;
echo '</td>';
echo '<td>';
$output3 = '<table width="160"  bgcolor="#6B8AA5" border="1" align="center">';
echo '<table><p align="center" class="Style2"">le dernier<br>trimestre</p></table>';
while($data3 = mysqli_fetch_assoc($req3))
    {
    $output3 .= '<tr>';
     $output3 .= '<td>'.$s2=$data3['nomUser3'].'</td>';
     $output3 .= '<td>'.$s1=$data3['nbPost3'].'</td>';
     $output3 .= '</tr>';
    // on affiche les informations de l'enregistrement en cours
    //$j1=$data['nbPost'];
   //$j2=$data['nomUser'];
    }
   $output3 .= '</table>';
   echo $output3;
echo '</td>';
echo '<td>';   
$output4 = '<table width="160"  bgcolor="#94BAD6" border="1" align="center">';   
echo '<table><p align="center" class="Style2"">Le dernier<br>semestre</p></table>';
while($data4 = mysqli_fetch_assoc($req4))
    {
    $output4 .= '<tr>';
     $output4 .= '<td>'.$s2=$data4['nomUser4'].'</td>';
     $output4 .= '<td>'.$s1=$data4['nbPost4'].'</td>';
     $output4 .= '</tr>';
    // on affiche les informations de l'enregistrement en cours
    //$j1=$data['nbPost'];
   //$j2=$data['nomUser'];
    }
   $output4 .= '</table>';
   echo $output4;
echo '</td>';
echo '<td>';   
$output5 = '<table width="160" bgcolor="#6B8AA5" border="1" align="center">';   
echo '<table><p align="center" class="Style2"">J-360<br>(une année)</p></table>';   
while($data5 = mysqli_fetch_assoc($req5))
    {
    $output5 .= '<tr>';
     $output5 .= '<td>'.$s2=$data5['nomUser5'].'</td>';
     $output5 .= '<td>'.$s1=$data5['nbPost5'].'</td>';
     $output5 .= '</tr>';
    // on affiche les informations de l'enregistrement en cours
    //$j1=$data['nbPost'];
   //$j2=$data['nomUser'];
    }
   $output5 .= '</table>';
   echo $output5;
echo '</td>';
echo '</tr>';
echo '<table>';
// on ferme la connexion à mysql
mysqli_close($db);
echo '</body></html>';
?>


[EDIT Raphaël]Ajout d’une icône de sujet et harmonisation du titre du sujet.

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : sam. 28 mai 2016 00:15
par Raphaël
C’est un bon début merci.

Cela étant dit, je pense qu’il est nécessaire d’expliquer davantage :
  • la liste exhaustive des informations que cette page indique ;
  • la signification dans le code de nomUser et nbPost et leurs dérivés numériques (01, 02…) ;
  • si la page est par défaut protégée de tous les autres utilisateurs n’ayant pas le statut de modérateur ou administrateur.

Bonne continuation !

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x  Question traitée

Posté : dim. 29 mai 2016 10:53
par ym_trainz
Ajout de quelques précisions supplémentaires sur le premier post ainsi qu'une capture d'écran. :)

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : lun. 30 mai 2016 01:22
par Raphaël
Merci c'est mieux mais cela manque de sécurité.

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : ven. 15 juil. 2016 22:52
par Laptop-Gaming

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : sam. 16 juil. 2016 04:24
par Raphaël
Salut Laptop-Gaming,

peut-être que dans ta base de données tes tables n'ont pas comme préfixe : phpbb3_ mais autre chose. Si c’est le cas, il te faudra remplacer toute allusion à : phpbb3_ contenu dans le code indiqué dans le premier message de ce sujet, par le nom du préfixe de tes tables.

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : dim. 17 juil. 2016 10:43
par Laptop-Gaming
Salut Raphael

Alors la je connais rien dans les base de données

Si tu peux m'aider a ce sujet

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : dim. 20 nov. 2016 12:49
par Raphaël
Salut Laptop-Gaming,

dans phpMyAdmin tu as le début de chaque ligne indiquant le nom de tes tables de ta base de données qui commence par quelquechose (si tu ne les a pas changées durant l'installation de ton forum) : phpbb3_. Auquel cas, si c"est différent il faut modifier toute allusion à phpbb3_ dans le fichier à créer indiqué dans le premier message de ce sujet.

@ym_trainz, tu n’as pas répondu à l’interrogation sur la sécurté de ce script, vérifie t-il l’identité du visiteur qui la consulte. Auquel cas contraire c’est un manquement à la sécurité. Tout au moins, je conseille de placer ce fichier dans un sous-répertoire, tel que : ./stats/ avec un jeu de fichiers .htaccess et .htpasswd dedans.

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : dim. 20 nov. 2016 21:22
par ym_trainz
Bonsoir,

En effet, pour plus de sécurité, ce code peut être placé dans un répertoire protégé par .htaccess . Pour notre site, il porte un nom exotique que seuls les modos et admins connaissent. Nous n'avons jamais de souci. De plus, ce code ne fait que de la lecture.

ym_trainz

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : dim. 20 nov. 2016 21:57
par Raphaël
N’étant pas codeur je ne vais pas prendre ce risque. Les robots sont aujourd’hui capables de trouver les pages alors même qu’elles ont un nom exotique.

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : dim. 20 nov. 2016 23:16
par ym_trainz
Certes ;-)
Merci pour ces précisions ^_^

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : sam. 26 nov. 2016 10:33
par pboulanger
:) Bonjour,

Idée sympa mais j'ai un souci avec le bouton RECALCULER : :223:

Il fait appel à un fichier comptage.php qui n'existe pas (voici le message d'erreur "No route found for "POST /comptage.php")

Je teste ton script sur la partie admin de notre site ....

Merci pour l'initiative c'est cool

Bonne journée

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : sam. 26 nov. 2016 10:46
par ym_trainz
Bonjour Pbloulanger,

Change comptage.php par le nom de cette page statistique php. Ce bouton rafraîchit la page.
;-)

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : mar. 29 nov. 2016 14:48
par Raphaël
Salut,

ce serait peut-être utile de préciser quel nom doit porter ce fichier, ou indiquer où changer le nom de l'appel au fichier, histoire de ne pas reproduire ce genre de question. ;)

MISE EN PLACE : Page privée de statistiques du forum phpBB 3.1.x

Posté : mer. 30 nov. 2016 17:43
par ym_trainz
Bonsoir,

Pour faire suite à la remarque de Raphaël que je remercie au passage,
Le bouton "recalculer" est un membre de la form qui, avec la méthode post, rafraîchit la page.
Si vous avez enregistré cette page sous le nom "comptage.php",

Alors, le code de la form est :
<form action="comptage.php" method="post">
;-)

ym_trainz