Un script de statistiques


Nous allons donc voir dans cet article comment faire un petit script de statistiques bien sympathique.

En effet, c'est toujours agréable de savoir combien de personnes se sont connectées sur votre site, aujourd'hui, sur un mois, ou sur l'année.

Le nombre de pages vues sur une journée est aussi une information importante, tout comme le fait de connaître les pages de son site qui sont les plus visitées.
Grâce à cette information, vous allez pouvoir modifier votre site en conséquence : si une page n'est pas vraiment visitée, c'est peut être qu'elle n'est pas vraiment "accrocheuse", etc...



Bref, avec un scripts de statistiques, vous allez pouvoir connaître toutes ces informations, et même bien plus encore :
- l'adresse IP de vos visiteurs
- leurs domaines
- les sites d'où proviennent vos visiteurs (le referer : si quelqu'un arrive sur votre site par le biais de google, vous allez pouvoir le savoir ! Savoir même ce qu'il a recherché sur google avant de tomber sur votre site)
- le navigateur qu'utilisent vos visiteurs
- le système d'exploitation utilisé par vos visiteurs

Plutôt intéressant non ?

Alors commençons de suite la création de ce script :)

Comment réalisé un tel script ?

Déjà, en réfléchissant deux minutes, on se dit facilement qu'à chaque page du site qui va être chargée, nous allons exécuter un script permettant de récupérer toutes les informations du visiteur qui charge la page (adresse IP du visiteur, son navigateur, son OS, son domaine, d'où vient ce visiteur, etc...).

Ensuite, il ne nous restera plus qu'à écrire un script, qui sera dans la partie administration de votre site, permettra de consulter toutes ces informations, et surtout de bien les exploiter.

Pour ce faire, nous allons premièrement, créer une table dans notre base de données permettant de sauvegarder toutes ces informations, secondement, écrire le script permettant de récolter ces informations (qui sera donc exécuté dès qu'une page du site sera chargée, ce qui implique que nous allons devoir placer ce script sur toutes les pages de notre site, par le biais d'un include par exemple).

Et enfin, nous allons nous attarder à la création de la partie administration permettant de faire une synthèse et une analyse de toutes ces données.

C'est parti :)

1) Création de la table SQL

Notre table, que l'on nommera statistiques aura les attributs suivants :
- un attribut id, de type INT qui sera clé primaire de notre table et qui aura également une option de type AUTO_INCREMENT
- un attribut date de type DATETIME permettant de conserver l'heure, le jour, le mois et l'année du chargement de la page
- un attribut page de type VARCHAR(250) permettant de stocker l'URL de la page qui vient d'être chargée
- un attribut ip de type VARCHAR(15) permettant de conserver l'adresse IP du client qui charge la page
- un attribut host de type VARCHAR(60) permettant de sauvegarder le domaine de l'adresse IP du client
- un attribut navigateur de type VARCHAR(100) qui contiendra à la fois le navigateur qu'utilise le client, ainsi que son système d'exploitation
- un attribut referer de type VARCHAR(250) permettant de savoir d'où proviennent vos visiteurs

Et à partir de cela, nous pouvons dire que notre table aura la structure suivante :

table statistiques
  1. CREATE TABLE statistiques (
  2.       id int(11) NOT NULL auto_increment,
  3.       date datetime NOT NULL default '0000-00-00 00:00:00',
  4.       page varchar(250) NOT NULL default '',
  5.       ip varchar(15) NOT NULL default '',
  6.       host varchar(60) NOT NULL default '',
  7.       navigateur varchar(100) NOT NULL default '',
  8.       referer varchar(250) NOT NULL default '',
  9.       PRIMARY KEY (id)
  10. ) TYPE=MyISAM; 


2) Création du script relevant les informations

Une fois la création de la table faite par votre PHPMyAdmin, attardons nous sur la création du script relevant toutes ces données, qui je le rappelle, sera à placer dans toutes vos pages PHP à l'aide d'un include.

Dans cet exemple, nous avons appelé cette page record_stat.php, et nous l'avons placé dans un répertoire nommé administration à la racine du site.

On aura alors :

record_stat.php
  1. <?php
  2. // récupération de l'heure courante  
  3. $date_courante = date("Y-m-d H:i:s");  
  4.  
  5. // récupération de l'adresse IP du client (on cherche d'abord à savoir si il est derrière un proxy)  
  6. if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {  
  7. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];  
  8. }  
  9. elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {  
  10. $ip = $_SERVER['HTTP_CLIENT_IP'];  
  11. }  
  12. else {  
  13. $ip = $_SERVER['REMOTE_ADDR'];  
  14. }  
  15. // récupération du domaine du client  
  16. $host = gethostbyaddr($ip);  
  17.  
  18. // récupération du navigateur et de l'OS du client  
  19. $navigateur = $_SERVER['HTTP_USER_AGENT'];  
  20.  
  21. // récupération du REFERER  
  22. if (isset($_SERVER['HTTP_REFERER'])) { 
  23.    if (eregi($_SERVER['HTTP_HOST'], $_SERVER['HTTP_REFERER'])) { 
  24.       $referer =''; 
  25.    } 
  26.    else { 
  27.       $referer = $_SERVER['HTTP_REFERER']; 
  28.    }  
  29. }  
  30. else {  
  31. $referer ='';  
  32. }  
  33.  
  34. // récupération du nom de la page courante ainsi que ses arguments  
  35. if ($_SERVER['QUERY_STRING'] == "") {  
  36. $page_courante = $_SERVER['PHP_SELF'];  
  37. }  
  38. else {  
  39. $page_courante = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];  
  40. }  
  41.  
  42. // connexion à la base de données  
  43. $base = mysql_connect('serveur', 'login', 'pass');  
  44. mysql_select_db('base', $base);  
  45.  
  46. // insertion des éléments dans la base de données  
  47. $sql = 'INSERT INTO statistiques VALUES("", "'.$date_courante.'", "'.$page_courante.'", "'.$ip.'", "'.$host.'", "'.$navigateur.'", "'.$referer.'")';  
  48. mysql_query($sql) or die('Erreur : '.$sql.'<br />'.mysql_error());  
  49.  
  50. // fermeture de la connexion à la base de données  
  51. mysql_close();  
  52. ?> 


Je sens que vous impatient de voir la suite, non ? :)

3) Ecriture de la partie administration

En effet, il ne nous reste plus qu'à écrire les pages nous permettant de consulter nos statistiques.

Pour cela, nous allons écrire trois pages qui se ressembleront énormément :
- une page pour visualiser les statistiques de la journée en cours ou d'une journée particulière (que l'on nommera stat_jour.php et que l'on placera dans le répertoire administration)
- une page pour visualiser les statistiques du mois en cours ou d'un mois particulier (que l'on nommera stat_mois.php et que l'on placera dans le répertoire administration)
- une page pour visualiser les statistiques de l'année en cours ou d'une année particulière (que l'on nommera stat_annee.php et que l'on placera dans le répertoire administration)

On aura alors le code suivant pour la page stat_jour.php :

stat_jour.php
  1. <html>
  2. <head>
  3. <title>Statistiques</title>
  4. </head>
  5.  
  6. <body>
  7. <?php
  8. // connexion à la base de donnée  
  9. $base = mysql_connect('serveur', 'login', 'pass');  
  10. mysql_select_db('base', $base);  
  11.  
  12. // on écrit des liens permettant de naviguer entre les différentes pages de notre partie administration  
  13. echo '<a href="./stat_jour.php">Les stats du jour</a><br />';  
  14. echo '<a href="./stat_mois.php">Les stats du mois</a><br />';  
  15. echo '<a href="./stat_annee.php">Les stats de l\'année</a><br /><br />';  
  16.  
  17. echo 'Voir les statistiques d\'un autre jour :<br /><br />';  
  18.  
  19. // formulaire permettant de choisir une date afin de voir les statistiques de cette date  
  20. echo '<form action="./stat_jour.php" method="post">';  
  21. echo '<select name="jour">';  
  22. // on boucle sur 31 jours  
  23. for($i = 1; $i <= 31; $i++) { 
  24.    if ($i < "10") { 
  25.       echo '<option>0'.$i.'</option>'; 
  26.    } 
  27.    else { 
  28.       echo '<option>'.$i.'</option>'; 
  29.    }  
  30. }  
  31. echo '</select>';  
  32.  
  33. echo '&nbsp;&nbsp;';  
  34.  
  35. echo '<select name="mois">';  
  36. // on boucle sur 12 mois  
  37. for($i = 1; $i <= 12; $i++) { 
  38.    if ($i < "10") { 
  39.       echo '<option>0'.$i.'</option>'; 
  40.    } 
  41.    else { 
  42.       echo '<option>'.$i.'</option>'; 
  43.    }  
  44. }  
  45. echo '</select>';  
  46.  
  47. echo '&nbsp;&nbsp;';  
  48.  
  49. echo '<select name="annee">';  
  50. // on boucle sur 7 ans (à modifier à souhait)  
  51. for($i = 2003; $i <= 2010; $i++) { 
  52.    echo '<option>'.$i.'</option>';  
  53. }  
  54. echo '</select>';  
  55.  
  56. echo '<br /><br />';  
  57.  
  58. echo '<input type="submit" value="Voir">';  
  59. echo '</form>';  
  60.  
  61.  
  62. // on cherche le nombre de pages visitées depuis le début (création du site)  
  63. $select = 'SELECT id FROM statistiques';  
  64. $result = mysql_query($select) or die ('Erreur : '.mysql_error() );  
  65. $total_pages_visitees_depuis_creation = mysql_num_rows($result);  
  66. mysql_free_result($result);  
  67.  
  68. // on cherche le nombre de visiteurs depuis le début (création du site)  
  69. $sql = 'SELECT DISTINCT(ip) FROM statistiques';  
  70. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  71. $total_visiteur_depuis_debut = mysql_num_rows ($result);  
  72. mysql_free_result($result);  
  73.  
  74. echo 'Depuis la création du site, '.$total_pages_visitees_depuis_creation.' pages ont été visitées par '.$total_visiteur_depuis_debut.' visiteurs.<br /><br /><hr>';  
  75.  
  76.  
  77. // on teste si $_POST['jour'], $_POST['mois'], $_POST['annee'] sont vides et déclarées : si oui, c'est que l'on veut voir les statistiques de la date du jour, sinon (elles ne sont pas vides), c'est que l'on a remplit le formulaire qui suit afin de voir les statistiques d'un autre jour précis  
  78.  
  79. if (!isset($_POST['jour']) || !isset($_POST['mois']) || !isset($_POST['annee'])) { 
  80.    $date_jour = date("Y-m-d");  
  81. }  
  82. else { 
  83.    if (empty($_POST['jour']) && empty($_POST['mois']) && empty($_POST['annee'])) { 
  84.       $date_jour = date("Y-m-d"); 
  85.    } 
  86.    else { 
  87.       $date_jour = $_POST['annee'].'-'.$_POST['mois'].'-'.$_POST['jour']; 
  88.    }  
  89. }  
  90.  
  91. // on déclare un tableau ($visite_par_heure) qui aura 24 clés : de 0 à 23, chaque élément du tableau contiendra le nombre de pages vues pendant une tranche horaire (à la clé 0, on aura le nombre de pages vues entre 00:00 et 00:59:59)  
  92. $visite_par_heure = array();  
  93.  
  94. $sql = 'SELECT date FROM statistiques WHERE date LIKE "'.$date_jour.'%" ORDER BY date ASC';  
  95. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  96. while ($data = mysql_fetch_array($result)) { 
  97.    $date=$data['date']; 
  98.  
  99.    sscanf($date, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s); 
  100.  
  101.    if ($date_H < "10"){ 
  102.       $date_H = substr($date_H, -1); 
  103.    } 
  104.  
  105.    $visite_par_heure[$date_H]=$visite_par_heure[$date_H]+1;  
  106. }  
  107. $total_pages_vu = mysql_num_rows($result);  
  108. mysql_free_result($result);  
  109.  
  110. sscanf($date_jour, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);  
  111.  
  112. // on affiche le nombre de pages vues en fonction des tranches horaires  
  113. echo '<br />Les statistiques du '.$date_d.'/'.$date_m.'/'.$date_Y.' : <br /><br />';  
  114.  
  115. for($i = 1; $i <= 24; $i++) { 
  116.    $j = $i-1; 
  117.    if (!isset($visite_par_heure[$j])) { 
  118.       echo $j.'H - '.$i.'H : 0 page vue<br />'; 
  119.    } 
  120.    else { 
  121.       echo $j.'H - '.$i.'H : '.$visite_par_heure[$j].' pages vues<br />'; 
  122.    }  
  123. }  
  124.  
  125.  
  126. // on calcule le nombre de visiteurs de la journée  
  127. $sql = 'SELECT DISTINCT(ip) FROM statistiques WHERE date LIKE "'.$date_jour.'%" ORDER BY date ASC';  
  128. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  129. $total_visiteur = mysql_num_rows ($result);  
  130. mysql_free_result($result);  
  131.  
  132. echo '<br />Soit un total de '.$total_pages_vu.' pages vues par '.$total_visiteur.' visiteurs.<br /><br />';  
  133.  
  134.  
  135. // on recherche les pages qui ont été les plus vues sur la journée (on calcule au passage le nombre de fois qu'elles ont été vu)  
  136. echo '<br />Les pages les plus vues :<br /><br />';  
  137.  
  138. $sql = 'SELECT distinct(page), count(page) as nb_page FROM statistiques WHERE date LIKE "'.$date_jour.'%" GROUP BY page ORDER BY nb_page DESC LIMIT 0,15';  
  139. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  140. while ($data = mysql_fetch_array($result)) { 
  141.    $nb_page = $data['nb_page']; 
  142.    $page = $data['page']; 
  143.    echo $nb_page.' '.$page.'<br />';  
  144. }  
  145. mysql_free_result($result);  
  146.  
  147.  
  148. // on recherche les visiteurs qui ont été les plus connectes au site sur la journée (on calcule au passage le nombre de page qu'ils ont chargé)  
  149. echo '<br />Les visiteurs les plus connectés :<br /><br />';  
  150.  
  151. $sql = 'SELECT distinct(host), count(host) as nb_host FROM statistiques WHERE date LIKE "'.$date_jour.'%" GROUP BY host ORDER BY nb_host DESC LIMIT 0,15';  
  152. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  153. while ($data = mysql_fetch_array($result)) { 
  154.    $nb_host = $data['nb_host']; 
  155.    $host = $data['host']; 
  156.    echo $nb_host.' '.$host.'<br />';  
  157. }  
  158. mysql_free_result($result);  
  159.  
  160.  
  161. // on recherche les meilleurs referer sur la journée  
  162. echo '<br />Les meilleurs referer :<br /><br />';  
  163.  
  164. $sql = 'SELECT distinct(referer), count(referer) as nb_referer FROM statistiques WHERE date LIKE "'.$date_jour.'%" AND referer!="" GROUP BY referer ORDER BY nb_referer DESC LIMIT 0,15';  
  165. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  166. while ($data = mysql_fetch_array($result)) { 
  167.    $nb_referer = $data['nb_referer']; 
  168.    $referer = $data['referer']; 
  169.    echo $nb_referer.' <a href="'.$referer.'" target="_blank">'.$referer.'</a><br />';  
  170. }  
  171. mysql_free_result($result);  
  172.  
  173.  
  174. // on recherche les navigateurs et les OS utilisés par les visiteurs (on calcule au passage le nombre de page qui ont été chargés avec ces systèmes)  
  175. echo '<br />Les navigateurs et OS :<br /><br />';  
  176.  
  177. $sql = 'SELECT distinct(navigateur), count(navigateur) as nb_navigateur FROM statistiques WHERE date LIKE "'.$date_jour.'%" GROUP BY navigateur ORDER BY nb_navigateur DESC LIMIT 0,15';  
  178. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  179. while ($data = mysql_fetch_array($result)) { 
  180.    $nb_navigateur = $data['nb_navigateur']; 
  181.    $navigateur = $data['navigateur']; 
  182.    echo $nb_navigateur.' '.$navigateur.'<br />';  
  183. }  
  184. mysql_free_result($result);  
  185. mysql_close();  
  186. ?>
  187. </body>
  188. </html> 


De même, on aura le code suivant pour la page stat_mois.php :

stat_mois.php
  1. <html>
  2. <head>
  3. <title>Statistiques</title>
  4. </head>
  5.  
  6. <body>
  7. <?php
  8. // connexion à la base de donnée  
  9. $base = mysql_connect('serveur', 'login', 'pass');  
  10. mysql_select_db('base', $base);  
  11.  
  12. // on écrit des liens permettant de naviguer entre les différentes pages de notre partie administration  
  13. echo '<a href="./stat_jour.php">Les stats du jour</a><br />';  
  14. echo '<a href="./stat_mois.php">Les stats du mois</a><br />';  
  15. echo '<a href="./stat_annee.php">Les stats de l\'année</a><br /><br />';  
  16.  
  17. echo 'Voir les statistiques d\'un autre mois :<br /><br />';  
  18.  
  19. // formulaire permettant de choisir une date afin de voir les statistiques de cette date  
  20. echo '<form action="./stat_mois.php" method="post">';  
  21. echo '<select name="mois">';  
  22. // on boucle sur 12 mois  
  23. for($i = 1; $i <= 12; $i++) { 
  24.    if ($i < "10") { 
  25.       echo '<option>0'.$i.'</option>'; 
  26.    } 
  27.    else { 
  28.       echo '<option>'.$i.'</option>'; 
  29.    }  
  30. }  
  31. echo '</select>';  
  32.  
  33. echo '&nbsp;&nbsp;';  
  34.  
  35. echo '<select name="annee">';  
  36. // on boucle sur 7 ans (à modifier à souhait)  
  37. for($i = 2003; $i <= 2010; $i++) { 
  38.    echo '<option>'.$i.'</option>';  
  39. }  
  40. echo '</select>';  
  41.  
  42. echo '<br /><br />';  
  43.  
  44. echo '<input type="submit" value="Voir">';  
  45. echo '</form>';  
  46.  
  47.  
  48. // on cherche le nombre de pages visitées depuis le début (création du site)  
  49. $select = 'SELECT id FROM statistiques';  
  50. $result = mysql_query($select) or die ('Erreur : '.mysql_error() );  
  51. $total_pages_visitees_depuis_creation = mysql_num_rows($result);  
  52. mysql_free_result($result);  
  53.  
  54. // on cherche le nombre de visiteurs depuis le début (création du site)  
  55. $sql = 'SELECT DISTINCT(ip) FROM statistiques';  
  56. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  57. $total_visiteur_depuis_debut = mysql_num_rows ($result);  
  58. mysql_free_result($result);  
  59.  
  60. echo 'Depuis la création du site, '.$total_pages_visitees_depuis_creation.' pages ont été visitées par '.$total_visiteur_depuis_debut.' visiteurs.<br /><br /><hr>';  
  61.  
  62.  
  63. // on teste si $_POST['mois'], $_POST['annee'] sont vides et déclarées : si oui, c'est que l'on veut voir les statistiques du mois en cours, sinon (elles ne sont pas vides), c'est que l'on a remplit le formulaire qui suit afin de voir les statistiques d'un autre mois  
  64.  
  65. if (!isset($_POST['mois']) || !isset($_POST['annee'])) { 
  66.    $date_mois = date("Y-m");  
  67. }  
  68. else { 
  69.    if (empty($_POST['mois']) && empty($_POST['annee'])) { 
  70.       $date_mois = date("Y-m"); 
  71.    } 
  72.    else { 
  73.       $date_mois = $_POST['annee'].'-'.$_POST['mois']; 
  74.    }  
  75. }  
  76.  
  77. // on déclare un tableau ($visite_par_jour) qui aura 31 clés : de 0 à 30, chaque élément du tableau contiendra le nombre de pages vues pendant un jour (à la clé 0, on aura le nombre de pages vues le 1 er du mois)  
  78. $visite_par_jour = array();  
  79.  
  80. $sql = 'SELECT date FROM statistiques WHERE date LIKE "'.$date_mois.'%" ORDER BY date ASC';  
  81. $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  82. while ($data = mysql_fetch_array($result)) { 
  83.    $date=$data['date']; 
  84.  
  85.    sscanf($date, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s); 
  86.  
  87.    if ($date_d < "10"){ 
  88.    $date_d = substr($date_d, -1); 
  89.    } 
  90.    $visite_par_jour[$date_d]=$visite_par_jour[$date_d]+1;  
  91. }  
  92. $total_pages_vu = mysql_num_rows($result);  
  93. mysql_free_result($result);  
  94.  
  95. sscanf($date_mois, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);  
  96.  
  97. // on affiche le nombre de pages vues en fonction des jours  
  98. echo '<br />Les statistiques du '.$date_m.'/'.$date_Y.' : <br /><br />';  
  99.  
  100. for($i = 1; $i <= 31; $i++) { 
  101.    if (!isset($visite_par_jour[$i])) { 
  102.       echo 'le '.$i.' : 0 page vue<br />'; 
  103.    } 
  104.    else { 
  105.       echo 'le '.$i.' : '.$visite_par_jour[$i].' pages vues<br />'; 
  106.    }  
  107. } &nbs