Comment faire un script de statistiques en PHP

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.sql
CREATE TABLE statistiques (
id int(11) NOT NULL auto_increment,
date datetime NOT NULL default '0000-00-00 00:00:00',
page varchar(250) NOT NULL default '',
ip varchar(15) NOT NULL default '',
host varchar(60) NOT NULL default '',
navigateur varchar(100) NOT NULL default '',
referer varchar(250) NOT NULL default '',
PRIMARY KEY (id)
) 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
<?php
// récupération de l'heure courante
$date_courante = date("Y-m-d H:i:s");

// récupération de l'adresse IP du client (on cherche d'abord à savoir si il est derrière un proxy)
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
}
// récupération du domaine du client
$host = gethostbyaddr($ip);

// récupération du navigateur et de l'OS du client
$navigateur = $_SERVER['HTTP_USER_AGENT'];

// récupération du REFERER
if (isset($_SERVER['HTTP_REFERER'])) {
if (eregi($_SERVER['HTTP_HOST'], $_SERVER['HTTP_REFERER'])) {
$referer ='';
}
else {
$referer = $_SERVER['HTTP_REFERER'];
}
}
else {
$referer ='';
}

// récupération du nom de la page courante ainsi que ses arguments
if ($_SERVER['QUERY_STRING'] == "") {
$page_courante = $_SERVER['PHP_SELF'];
}
else {
$page_courante = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
}

// connexion à la base de données
$base = mysql_connect('serveur', 'login', 'pass');
mysql_select_db('base', $base);

// insertion des éléments dans la base de données
$sql = 'INSERT INTO statistiques VALUES("", "'.$date_courante.'", "'.$page_courante.'", "'.$ip.'", "'.$host.'", "'.$navigateur.'", "'.$referer.'")';
mysql_query($sql) or die('Erreur : '.$sql.'<br />'.mysql_error());

// fermeture de la connexion à la base de données
mysql_close();
?>


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
<html>
<head>
<title>Statistiques</title>
</head>

<body>
<?php
// connexion à la base de donnée
$base = mysql_connect('serveur', 'login', 'pass');
mysql_select_db('base', $base);

// on écrit des liens permettant de naviguer entre les différentes pages de notre partie administration
echo '<a href="./stat_jour.php">Les stats du jour</a><br />';
echo '<a href="./stat_mois.php">Les stats du mois</a><br />';
echo '<a href="./stat_annee.php">Les stats de l\'année</a><br /><br />';

echo 'Voir les statistiques d\'un autre jour :<br /><br />';

// formulaire permettant de choisir une date afin de voir les statistiques de cette date
echo '<form action="./stat_jour.php" method="post">';
echo '<select name="jour">';
// on boucle sur 31 jours
for($i = 1; $i <= 31; $i++) {
if ($i < "10") {
echo '<option>0'.$i.'</option>';
}
else {
echo '<option>'.$i.'</option>';
}
}
echo '</select>';

echo '&nbsp;&nbsp;';

echo '<select name="mois">';
// on boucle sur 12 mois
for($i = 1; $i <= 12; $i++) {
if ($i < "10") {
echo '<option>0'.$i.'</option>';
}
else {
echo '<option>'.$i.'</option>';
}
}
echo '</select>';

echo '&nbsp;&nbsp;';

echo '<select name="annee">';
// on boucle sur 7 ans (à modifier à souhait)
for($i = 2003; $i <= 2010; $i++) {
echo '<option>'.$i.'</option>';
}
echo '</select>';

echo '<br /><br />';

echo '<input type="submit" value="Voir">';
echo '</form>';


// on cherche le nombre de pages visitées depuis le début (création du site)
$select = 'SELECT id FROM statistiques';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$total_pages_visitees_depuis_creation = mysql_num_rows($result);
mysql_free_result($result);

// on cherche le nombre de visiteurs depuis le début (création du site)
$sql = 'SELECT DISTINCT(ip) FROM statistiques';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$total_visiteur_depuis_debut = mysql_num_rows ($result);
mysql_free_result($result);

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


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

if (!isset($_POST['jour']) || !isset($_POST['mois']) || !isset($_POST['annee'])) {
$date_jour = date("Y-m-d");
}
else {
if (empty($_POST['jour']) && empty($_POST['mois']) && empty($_POST['annee'])) {
$date_jour = date("Y-m-d");
}
else {
$date_jour = $_POST['annee'].'-'.$_POST['mois'].'-'.$_POST['jour'];
}
}

// 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)
$visite_par_heure = array();

$sql = 'SELECT date FROM statistiques WHERE date LIKE "'.$date_jour.'%" ORDER BY date ASC';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$date=$data['date'];

sscanf($date, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);

if ($date_H < "10"){
$date_H = substr($date_H, -1);
}

$visite_par_heure[$date_H]=$visite_par_heure[$date_H]+1;
}
$total_pages_vu = mysql_num_rows($result);
mysql_free_result($result);

sscanf($date_jour, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);

// on affiche le nombre de pages vues en fonction des tranches horaires
echo '<br />Les statistiques du '.$date_d.'/'.$date_m.'/'.$date_Y.' : <br /><br />';

for($i = 1; $i <= 24; $i++) {
$j = $i-1;
if (!isset($visite_par_heure[$j])) {
echo $j.'H - '.$i.'H : 0 page vue<br />';
}
else {
echo $j.'H - '.$i.'H : '.$visite_par_heure[$j].' pages vues<br />';
}
}


// on calcule le nombre de visiteurs de la journée
$sql = 'SELECT DISTINCT(ip) FROM statistiques WHERE date LIKE "'.$date_jour.'%" ORDER BY date ASC';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$total_visiteur = mysql_num_rows ($result);
mysql_free_result($result);

echo '<br />Soit un total de '.$total_pages_vu.' pages vues par '.$total_visiteur.' visiteurs.<br /><br />';


// 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)
echo '<br />Les pages les plus vues :<br /><br />';

$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';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_page = $data['nb_page'];
$page = $data['page'];
echo $nb_page.' '.$page.'<br />';
}
mysql_free_result($result);


// 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é)
echo '<br />Les visiteurs les plus connectés :<br /><br />';

$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';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_host = $data['nb_host'];
$host = $data['host'];
echo $nb_host.' '.$host.'<br />';
}
mysql_free_result($result);


// on recherche les meilleurs referer sur la journée
echo '<br />Les meilleurs referer :<br /><br />';

$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';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_referer = $data['nb_referer'];
$referer = $data['referer'];
echo $nb_referer.' <a href="'.$referer.'" target="_blank">'.$referer.'</a><br />';
}
mysql_free_result($result);


// 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)
echo '<br />Les navigateurs et OS :<br /><br />';

$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';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_navigateur = $data['nb_navigateur'];
$navigateur = $data['navigateur'];
echo $nb_navigateur.' '.$navigateur.'<br />';
}
mysql_free_result($result);
mysql_close();
?>
</body>
</html>


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

stat_mois.php
<html>
<head>
<title>Statistiques</title>
</head>

<body>
<?php
// connexion à la base de donnée
$base = mysql_connect('serveur', 'login', 'pass');
mysql_select_db('base', $base);

// on écrit des liens permettant de naviguer entre les différentes pages de notre partie administration
echo '<a href="./stat_jour.php">Les stats du jour</a><br />';
echo '<a href="./stat_mois.php">Les stats du mois</a><br />';
echo '<a href="./stat_annee.php">Les stats de l\'année</a><br /><br />';

echo 'Voir les statistiques d\'un autre mois :<br /><br />';

// formulaire permettant de choisir une date afin de voir les statistiques de cette date
echo '<form action="./stat_mois.php" method="post">';
echo '<select name="mois">';
// on boucle sur 12 mois
for($i = 1; $i <= 12; $i++) {
if ($i < "10") {
echo '<option>0'.$i.'</option>';
}
else {
echo '<option>'.$i.'</option>';
}
}
echo '</select>';

echo '&nbsp;&nbsp;';

echo '<select name="annee">';
// on boucle sur 7 ans (à modifier à souhait)
for($i = 2003; $i <= 2010; $i++) {
echo '<option>'.$i.'</option>';
}
echo '</select>';

echo '<br /><br />';

echo '<input type="submit" value="Voir">';
echo '</form>';


// on cherche le nombre de pages visitées depuis le début (création du site)
$select = 'SELECT id FROM statistiques';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$total_pages_visitees_depuis_creation = mysql_num_rows($result);
mysql_free_result($result);

// on cherche le nombre de visiteurs depuis le début (création du site)
$sql = 'SELECT DISTINCT(ip) FROM statistiques';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$total_visiteur_depuis_debut = mysql_num_rows ($result);
mysql_free_result($result);

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


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

if (!isset($_POST['mois']) || !isset($_POST['annee'])) {
$date_mois = date("Y-m");
}
else {
if (empty($_POST['mois']) && empty($_POST['annee'])) {
$date_mois = date("Y-m");
}
else {
$date_mois = $_POST['annee'].'-'.$_POST['mois'];
}
}

// 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)
$visite_par_jour = array();

$sql = 'SELECT date FROM statistiques WHERE date LIKE "'.$date_mois.'%" ORDER BY date ASC';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$date=$data['date'];

sscanf($date, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);

if ($date_d < "10"){
$date_d = substr($date_d, -1);
}
$visite_par_jour[$date_d]=$visite_par_jour[$date_d]+1;
}
$total_pages_vu = mysql_num_rows($result);
mysql_free_result($result);

sscanf($date_mois, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);

// on affiche le nombre de pages vues en fonction des jours
echo '<br />Les statistiques du '.$date_m.'/'.$date_Y.' : <br /><br />';

for($i = 1; $i <= 31; $i++) {
if (!isset($visite_par_jour[$i])) {
echo 'le '.$i.' : 0 page vue<br />';
}
else {
echo 'le '.$i.' : '.$visite_par_jour[$i].' pages vues<br />';
}
}


// on calcule le nombre de visiteurs du mois
$sql = 'SELECT DISTINCT(ip) FROM statistiques WHERE date LIKE "'.$date_mois.'%" ORDER BY date ASC';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$total_visiteur = mysql_num_rows ($result);
mysql_free_result($result);

echo '<br />Soit un total de '.$total_pages_vu.' pages vues par '.$total_visiteur.' visiteurs.<br /><br />';


// on recherche les pages qui ont été les plus vues sur le mois (on calcule au passage le nombre de fois qu'elles ont été vu)
echo '<br />Les pages les plus vues :<br /><br />';

$sql = 'SELECT distinct(page), count(page) as nb_page FROM statistiques WHERE date LIKE "'.$date_mois.'%" GROUP BY page ORDER BY nb_page DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_page = $data['nb_page'];
$page = $data['page'];
echo $nb_page.' '.$page.'<br />';
}
mysql_free_result($result);


// on recherche les visiteurs qui ont été les plus connectes au site sur le mois (on calcule au passage le nombre de page qu'ils ont chargé)
echo '<br />Les visiteurs les plus connectés :<br /><br />';

$sql = 'SELECT distinct(host), count(host) as nb_host FROM statistiques WHERE date LIKE "'.$date_mois.'%" GROUP BY host ORDER BY nb_host DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_host = $data['nb_host'];
$host = $data['host'];
echo $nb_host.' '.$host.'<br />';
}
mysql_free_result($result);


// on recherche les meilleurs referer sur le mois
echo '<br />Les meilleurs referer :<br /><br />';

$sql = 'SELECT distinct(referer), count(referer) as nb_referer FROM statistiques WHERE date LIKE "'.$date_mois.'%" AND referer!="" GROUP BY referer ORDER BY nb_referer DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_referer = $data['nb_referer'];
$referer = $data['referer'];
echo $nb_referer.' <a href="'.$referer.'" target="_blank">'.$referer.'</a><br />';
}
mysql_free_result($result);


// 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)
echo '<br />Les navigateurs et OS :<br /><br />';

$sql = 'SELECT distinct(navigateur), count(navigateur) as nb_navigateur FROM statistiques WHERE date LIKE "'.$date_mois.'%" GROUP BY navigateur ORDER BY nb_navigateur DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_navigateur = $data['nb_navigateur'];
$navigateur = $data['navigateur'];
echo $nb_navigateur.' '.$navigateur.'<br />';
}
mysql_free_result($result);
mysql_close();
?>
</body>
</html>


Enfin, écrivons maintenant la page stat_annee.php.
On aura :

stat_annee.php
<html>
<head>
<title>Statistiques</title>
</head>

<body>
<?php
// connexion à la base de donnée
$base = mysql_connect('serveur', 'login', 'pass');
mysql_select_db('base', $base);

// on écrit des liens permettant de naviguer entre les différentes pages de notre partie administration
echo '<a href="./stat_jour.php">Les stats du jour</a><br />';
echo '<a href="./stat_mois.php">Les stats du mois</a><br />';
echo '<a href="./stat_annee.php">Les stats de l\'année</a><br /><br />';

echo 'Voir les statistiques d\'une autre année :<br /><br />';

// formulaire permettant de choisir une date afin de voir les statistiques d'une autre année
echo '<form action="./stat_annee.php" method="post">';
echo '<select name="annee">';
// on boucle sur 7 ans (à modifier à souhait)
for($i = 2003; $i <= 2010; $i++) {
echo '<option>'.$i.'</option>';
}
echo '</select>';

echo '<br /><br />';

echo '<input type="submit" value="Voir">';
echo '</form>';


// on cherche le nombre de pages visitées depuis le début (création du site)
$select = 'SELECT id FROM statistiques';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$total_pages_visitees_depuis_creation = mysql_num_rows($result);
mysql_free_result($result);

// on cherche le nombre de visiteurs depuis le début (création du site)
$sql = 'SELECT DISTINCT(ip) FROM statistiques';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$total_visiteur_depuis_debut = mysql_num_rows ($result);
mysql_free_result($result);

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


// on teste si $_POST['annee'] est vide et déclarée : si oui, c'est que l'on veut voir les statistiques de l'année en cours, sinon (elle n'est pas vide), c'est que l'on a remplit le formulaire qui précède afin de voir les statistiques d'une autre année

if (!isset($_POST['annee'])) {
$date_annee = date("Y");
}
else {
if (empty($_POST['annee'])) {
$date_annee = date("Y");
}
else {
$date_annee = $_POST['annee'];
}
}

// on déclare un tableau ($visite_par_mois) qui aura 12 clés : de 0 à 11, chaque élément du tableau contiendra le nombre de pages vues pendant un mois (à la clé 0, on aura le nombre de pages vues au mois de janvier)
$visite_par_mois = array();

$sql = 'SELECT date FROM statistiques WHERE date LIKE "'.$date_annee.'%" ORDER BY date ASC';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$date=$data['date'];

sscanf($date, "%4s-%2s-%2s %2s:%2s:%2s", $date_Y, $date_m, $date_d, $date_H, $date_i, $date_s);

if ($date_m < "10"){
$date_m = substr($date_m, -1);
}
$visite_par_mois[$date_m]=$visite_par_mois[$date_m]+1;
}
$total_pages_vu = mysql_num_rows($result);
mysql_free_result($result);


// on affiche le nombre de pages vues en fonction des mois
echo '<br />Les statistiques de l\'année '.$date_annee.' : <br /><br />';

for($i = 1; $i <= 12; $i++) {
if (!isset($visite_par_mois[$i])) {
echo 'Mois : '.$i.' : 0 page vue<br />';
}
else {
echo 'Mois : '.$i.' : '.$visite_par_mois[$i].' pages vues<br />';
}
}


// on calcule le nombre de visiteurs du mois
$sql = 'SELECT DISTINCT(ip) FROM statistiques WHERE date LIKE "'.$date_annee.'%" ORDER BY date ASC';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$total_visiteur = mysql_num_rows ($result);
mysql_free_result($result);

echo '<br />Soit un total de '.$total_pages_vu.' pages vues par '.$total_visiteur.' visiteurs.<br /><br />';


// on recherche les pages qui ont été les plus vues sur le mois (on calcule au passage le nombre de fois qu'elles ont été vu)
echo '<br />Les pages les plus vues :<br /><br />';

$sql = 'SELECT distinct(page), count(page) as nb_page FROM statistiques WHERE date LIKE "'.$date_annee.'%" GROUP BY page ORDER BY nb_page DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_page = $data['nb_page'];
$page = $data['page'];
echo $nb_page.' '.$page.'<br />';
}
mysql_free_result($result);


// on recherche les visiteurs qui ont été les plus connectes au site sur le mois (on calcule au passage le nombre de page qu'ils ont chargé)
echo '<br />Les visiteurs les plus connectés :<br /><br />';

$sql = 'SELECT distinct(host), count(host) as nb_host FROM statistiques WHERE date LIKE "'.$date_annee.'%" GROUP BY host ORDER BY nb_host DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_host = $data['nb_host'];
$host = $data['host'];
echo $nb_host.' '.$host.'<br />';
}
mysql_free_result($result);


// on recherche les meilleurs referer sur l'année
echo '<br />Les meilleurs referer :<br /><br />';

$sql = 'SELECT distinct(referer), count(referer) as nb_referer FROM statistiques WHERE date LIKE "'.$date_annee.'%" AND referer!="" GROUP BY referer ORDER BY nb_referer DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_referer = $data['nb_referer'];
$referer = $data['referer'];
echo $nb_referer.' <a href="'.$referer.'" target="_blank">'.$referer.'</a><br />';
}
mysql_free_result($result);


// 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)
echo '<br />Les navigateurs et OS :<br /><br />';

$sql = 'SELECT distinct(navigateur), count(navigateur) as nb_navigateur FROM statistiques WHERE date LIKE "'.$date_annee.'%" GROUP BY navigateur ORDER BY nb_navigateur DESC LIMIT 0,15';
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($result)) {
$nb_navigateur = $data['nb_navigateur'];
$navigateur = $data['navigateur'];
echo $nb_navigateur.' '.$navigateur.'<br />';
}
mysql_free_result($result);
mysql_close();
?>
</body>
</html>


Et voila :)

On a enfin terminé d'écrire notre script de statistiques.
Alors bien sur, ce ne sont pas des statistiques serveur, mais tout de même, cela peut vous donner une idée des visiteurs qui se rendent dur votre site.

Que faire en plus ?

Et bien, a priori, à part le design, il n'y pas grand-chose à modifier sur ce script.

Cependant, vous pouvez très bien stocker dans des fichiers textes des résultats, comme par exemple le nombre de pages vues les mois et les années précédents à la date actuelle.

En effet, ces résultats ne bougeront plus (si on est au mois de janvier 2003, les statistiques de décembre 2002 sont "figées" et "terminées"), et il serait intéressant de stocker ces résultats dans des fichiers textes afin de ne pas surcharger vos requêtes SQL.

De plus, en faisant ces stockages, vous aller pouvoir "vider" une partie de votre table, ce qui est également bénéfique.
LoadingChargement en cours