Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Non-Officiels > Site Web > PHP > Systèmes complets > Lecture du tutoriel

Création d'une page de statistiques simples

Avatar
Auteur : Totoj21
Créé : le 21/10/2006 15:32:27
Modifié : le 14/04/2008 23:25:28
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bonjour : je vous propose dans ce tutoriel de vous expliquer comment créer, sur votre site, une page à partir de laquelle on pourra suivre l'évolution du nombre de visiteurs. Cette page de statistiques sera composée d'un tableau récapitulant les éléments suivants :
Sommaire du chapitre :

Pré-requis

De quoi a-t-on besoin pour arriver au bout de ce tuto ?


Pour réaliser notre page de statistiques, nous avons besoin de plusieurs éléments :

Pour construire notre page, nous aurons besoin de plusieurs éléments :

Tout d'abord, pour suivre l'évolution des visiteurs, nous devons les enregistrer dans la base de données. Pour cela, il nous faudra créer une table que l'on appellera visiteurs. Voici ce que cette table comportera comme champs :

Et comme je suis gentil, je vous donne le code SQL à copier-coller dans votre console MySQL !
Code : SQL
1
2
3
4
5
6
7
CREATE TABLE `visiteurs` (
  `id` int(21) NOT NULL AUTO_INCREMENT,
  `ip` varchar(15) DEFAULT NULL,
  `timestamp` int(11) NOT NULL DEFAULT '0',
  `nb_clic` int(5) NOT NULL DEFAULT '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Nous sommes donc désormais prêts à attaquer les choses sérieuses !

Enregistrement des visiteurs

Il s'agit en fait de créer un compteur de visites. Il existe déjà, je crois, un tuto à ce sujet, mais je vais vous montrer rapidement comment est fait le mien. Voici la démarche que j'ai adoptée :

Voici le code correspondant à cette procédure. Je l'ai largement commenté (pas trop, j'espère) :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
// Connexion à MySQL (au lieu de répéter des choses que vous connaissez déjà, j'ai fait comme si on avait mis le code permettant de se connecter à la base de données dans un fichier nommé "connect_bdd.php"
include("connect_bdd.php");

// $_SERVER['REMOTE_ADDR'] -> correspond à l'IP du visiteur 
// on "fixe" le timestamp dans une variable : cela évite d'avoir des timestamp différents tout au long de la page
$timestamp = time();

// tentative de mise à jour du champ correspondant au visiteur avec une incrémentation de nb_clic
mysql_unbuffered_query('UPDATE visiteurs SET  timestamp = ' .$timestamp. ' , nb_clic = nb_clic +1 WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' AND timestamp > ' .(time() - 86400)) or die(mysql_error());

// la modification a échoué : le visiteur n'est pas dans la base de données OU sa dernière visite date de plus de 24h, on ajoute alors une nouvelle entrée dans la table
if(mysql_affected_rows() == 0)
{
        mysql_unbuffered_query('INSERT INTO visiteurs (ip, timestamp, nb_clic) VALUES(\'' .$_SERVER['REMOTE_ADDR']. '\', ' .time(). ', 1 )');
}
?>

Merci à Jérémie pour ce code

Et ce code, on le met où ?

Pour que chaque visiteur soit pris en compte, ainsi que chaque page affichée, il faut que ce petit bout de code soit lancé dans chaque page. Pour nous faciliter la tâche, nous allons utiliser un include. Pour cela, nous allons enregistrer ce morceau de code dans un fichier : compteur.php, par exemple.
Puis dans chaque page (en début de page, de préférence), vous devrez mettre :
Code : PHP
1
include("compteur.php");

Pour savoir combien de visiteurs ont visité votre site, il vous suffit donc maintenant d'utiliser la requête suivante :

Code : PHP
1
2
$compteur  = mysql_fetch_array(mysql_query('SELECT COUNT(*) AS nb_visite FROM visiteurs '));
echo $compteur['nb_visite'] ;

Trier les visiteurs

À partir de maintenant, notre base de données commence à se remplir au fur et à mesure que les visiteurs viennent surfer sur votre site. Pour ne rien vous cacher, nous avons fait le plus facile ! ^^
L'étape suivante est la création de notre page de statistiques. Nous l'appellerons statistique.php.

Avant d'attaquer directement le code, je vais vous expliquer comment nous allons procéder.
Deux solutions s'offrent à nous :

Nous utiliserons cette dernière méthode car elle limite considérablement le nombre de connexions avec la base de données (imaginez le travail demandé si vous avez plus de 100 000 visiteurs enregistrés !).

Pour trouver le nombre de personnes qui ont visité votre site au mois de janvier 2006 par exemple, la démarche sera la suivante :

Eh ! Tu nous avais dit qu'on chercherait entre le 1er et le dernier jour de chaque mois !

Eh bien, à une seconde près, c'est ce que l'on fait ! Je prends du 1er au 1er pour une raison très simple, c'est que certains mois ont 31 jours, d'autres 30 et je ne vous parle pas du mois de février ! Avec cette méthode, on se moque de savoir combien de jours il y a dans le mois.
Et pourquoi à 00h00min01s ?

Pour être sûrs que le timestamp corresponde bien à celui du 1er janvier au matin, par exemple, et non pas celui du premier janvier au soir. (Je pense que ça fonctionnerait si on mettait 00h00min00s, mais je me sens plus sûr en faisant de cette façon. Libre à vous maintenant de tenter le coup à minuit pile !)

Reprenons.
Nous avons le timestamp du 1er et du dernier jour de janvier.
Il ne nous reste plus qu'à faire une requête qui nous donne le nombre de visiteurs correspondant à cette plage de temps :
Code : SQL
1
SELECT count(*) AS visite FROM visiteurs WHERE timestamp BETWEEN $timestamp1  AND $timestamp2

(Avec $timestamp1 correspondant au timestamp du premier jour du mois et $timestamp2 le timestamp du premier jour du mois suivant.)

Et voilà, le tour est joué ! Il ne nous reste plus qu'à faire pareil pour tous les mois de l'année, et également sur plusieurs années...
À partir de ces données, nous pourrons aussi calculer le nombre cumulé de visiteurs pour chaque mois, et le nombre quotidien moyen de visiteurs.

Et pour le nombre de pages affichées ?

Comme je l'ai dit plus haut, on ne peut pas prendre en compte chaque visiteur un par un. On va devoir utiliser une requête qui compte le nombre total de pages affichées sur 1 mois. Pour cela, il existe la fonction SUM de mysql. (Je vous invite à faire une petite recherche sur le net pour plus d'informations.)
La requête SQL sera donc :
Code : SQL
1
SELECT SUM(nb_clic) FROM visiteurs WHERE timestamp BETWEEN $timestamp1 AND $timestamp2

Mais voyons maintenant au niveau du code ce que cela représente :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
//initiation de variables
$tabl_mois = array ("Janvier", "Fevrier", "Mars","Avril", "Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre");
$total=0; // le nombre total de visiteurs sur la durée de vie totale du site
$max_visiteurs=0;//le nombre maximum de visiteurs obtenus en 1 mois
$max_clic=0;//le nombre maximum de clics obtenus en 1 mois
$info=1;//cette variable sera incrémentée à chaque fois que l'on ajoutera un mois
$tabl_info = array();//tableau contenant les informations sur chaque mois

//On commence par faire une boucle qui commencera en 2005 pour finir à l'année en cours
for     ($annee = 2005; $annee <= strftime("%Y", time() ); $annee++)
{
        //chaque variable $ligne correspond en fait à 1 mois : 0=janvier; 1=février... ; 11=décembre
        for ($ligne = 0; $ligne <= 11; $ligne++)
        {
                $mois =$ligne+1; //pour retrouver le numéro réel du mois
                //On cherche le timestamp du premier jour de janvier => $timetamp1
                $timestamp1 = mktime(00, 00, 1, $mois, 1, $annee);
                //on cherche combien de jours il y a dans ce mois
                $nb_jours = date('t', $timestamp1);
               
                //Il nous faut chercher le timestamp du 1er jour du mois suivant
                $mois2=$mois+1;
                //On vérifie si le mois suivant n'est pas le mois de janvier de l'année suivante
                if ($mois2>12)
                {
                        //si c'est le cas, on incrémente la valeur courante de l'année
                        $annee2=$annee+1;
                        //et on remet à 1 le numéro du mois
                        $mois2=1;
                        //On cherche ensuite le timestamp correspondant
                        $timestamp2 = mktime(00, 00, 1, $mois2, 1, $annee2); 
                }
                //sinon, on cherche ensuite le timestamp normalement
                else $timestamp2 = mktime(00, 00, 1, $mois2, 1, $annee);

                //on initialise la variable contenant le nombre de visiteurs de ce mois
                $nb_visiteurs =0;
                //On compte combien il y a eu de visites durant ce mois
                $som_visites = mysql_fetch_array(mysql_query('SELECT count(*) AS visite FROM visiteurs WHERE timestamp BETWEEN "' . $timestamp1 . '" AND "' . $timestamp2 . '"'));

                $nb_visiteurs = $som_visites['visite'];
                //$total contiendra le nombre cumulé de visiteurs de chaque mois
                $total=$total+$nb_visiteurs;
               
                //On vérifie s'il y a des visiteurs enregistrés dans le mois en question
                if ($nb_visiteurs!=0)
                {
                        //On crée un tableau à 2 dimensions
                        //dans la première colonne, on affichera le nom du mois suivi de l'année
                        $tabl_info[$info]['mois']=$tabl_mois[$ligne] . ' ' . $annee; 
                        //colonne 2 : on affiche le nombre cumulé de visiteurs
                        $tabl_info[$info]['v_total']=$total;
                        //colonne 3 : on affiche le nombre de visiteurs total de ce mois
                        $tabl_info[$info]['v_mois']=$nb_visiteurs;
                        //colonne 4 : on affiche le nombre quotidien moyen de visiteurs
                        $tabl_info[$info]['v_jour']=ceil($nb_visiteurs/$nb_jours);

                        //On compte le nombre total de pages affichées dans le mois
                        $som_clic = 'SELECT SUM(nb_clic) FROM visiteurs WHERE timestamp BETWEEN "' . $timestamp1 . '" AND "' . $timestamp2 . '"'; 
                        $result = mysql_query($som_clic) or die(mysql_error());
                        $row = mysql_fetch_array($result);

                        //colonne 5 : on affiche le nombre de pages affichées par mois
                        $tabl_info[$info]['clic_mois']=$row['SUM(nb_clic)'];
                        //colonne 6 : on affiche le nombre de pages affichées par jour
                        $tabl_info[$info]['clic_jour']=ceil($row['SUM(nb_clic)']/$nb_jours);

                        $info++;//on prépare l'enregistrement dans la ligne suivante du tableau
                       
                        //On garde en mémoire le nombre maximal de visiteurs et de pages affichées.
                        if($nb_visiteurs>$max_visiteurs) $max_visiteurs=$nb_visiteurs;
                        if($row['SUM(nb_clic)']>$max_clic) $max_clic=$row['SUM(nb_clic)'];
                }
        }
}
?>


Et voilà pour cette partie !

Il y a peut être quelques éléments qui ne paraissent pas très clairs, je vais en soulever quelques-uns :
Que signifie ceil($nb_visiteurs/$nb_jours) ?

La fonction ceil() est une fonction php qui permet de renvoyer la valeur entière la plus proche d'un nombre par excès. (Ex. : ceil(3,6)=4 mais ceil(4,2)=5.)
Que se passe-t-il s'il n'y a aucun visiteur durant 1 mois ?

Eh bien ce mois n'apparaîtra tout simplement pas dans le tableau final. En effet, l'enregistrement des données se fait à condition qu'il y ait au moins 1 visiteur dans le mois. Cela permet d'éliminer de notre tableau les mois suivants de l'année qui ne nous intéressent pas (pourquoi afficher les mois de janvier à décembre si l'on est encore qu'au mois de février ?).
Pourquoi enregistrer les données dans un tableau au lieu de les afficher directement ?

C'est vrai qu'il serait possible d'afficher chaque mois puis de chercher les informations sur le mois suivant. J'ai procédé de cette façon pour une seule et unique raison : pour connaître le maximum de visiteurs qui a pu être atteint sur 1 mois ($max_visiteurs), ainsi que le nombre max de pages affichées ($max_clic).
Et pourquoi a-t-on besoin de connaître ces valeurs ?

La réponse à cette question nous amène directement à la suite du tutoriel. Cette valeur est nécessaire pour l'affichage des informations. Je vous rappelle que nous allons créer un graphique en bâtons : il nous faut alors décider d'une échelle, et ce sont ces valeurs max qui vont nous la donner !

Vous remarquerez que si vous exécutez ce code, rien ne se passe (à moins qu'il y ait des erreurs). C'est tout à fait normal car nous n'avons encore rien affiché. Passons donc à l'affichage de notre page de statistiques.

Afficher les statistiques

J'ai fait cela sous la forme d'un tableau ; libre à vous de faire ceci à votre sauce : ce n'est que de la mise en page.


Le plus important ici est de retrouver nos données que nous avons enregistré dans le tableau tabl_info[] à 2 dimensions. Pour cela, nous allons faire une boucle qui ira chercher chaque élément.

Une fois qu'on est capables d'extraire chacune des informations, il nous faut alors construire le graphique. Celui-ci représentera l'évolution des visiteurs et du nombre de pages affichées en fonction des mois.
Pour cela, on va utiliser des images. Je vous donne les miennes comme exemples, mais il est très facile de faire les vôtres, avec Paint par exemple.
Image 1 : Image utilisateur
Image 2 : Image utilisateur
Image 3 : Image utilisateur

Les images 1 et 3 correspondent aux extrémités du bâton. Nous allons faire varier la longueur de l'image 2 en fonction du nombre de visiteurs. C'est là que rentrent en jeu les valeurs max. mises de coté plus haut !

Pour le graphiqe des visiteurs



Pour calculer la longueur de chaque barre, nous allons faire un peu de maths ! Afin d'optimiser l'affichage du graphique, le mois qui a le plus de visiteurs aura la longueur maximale. Ensuite, par relation de proportionnalité, on obtiendra la longueur des autres barres.

Donc pour un mois quelconque, la longueur de la barre se définit par :

longueur de la barre = nb visites * longueur max. / nb visites max.

Maintenant libre à vous de définir la longueur maximale que pourra atteindre une barre. Dans le code ci-dessous, j'ai pris une longueur de 300 pixels.

Pour le graphique des pages affichées



Eh bien c'est pareil, sauf que l'on prend cette fois-ci en compte le nombre de pages affichées et la valeur max. associée. ^^

Alors voyons un peu ce que le code donne :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<h2>Statistiques</h2>   
<table><tr>
<th>Mois</th>
<th>Cumul</th>
<th>Visites / Mois<br/><em>(Visites/jour)</em></th>
<th>Clics / Mois<br/><em>(Clic/Jour)</em></th>
<th>Graphique</th>
</tr>   
<?php //On commence par afficher le titre des colonnes

//on va maintenant prendre ligne par ligne
for($i = 1; $i < $info; $i++)
{
//On va récupérer dans le tableau à dimensions chaque information une par une et l'afficher dans le tableau
?>
        <tr>
        <td > <?php echo $tabl_info[$i]['mois'] ; ?> </td>
        <td ><?php echo $tabl_info[$i]['v_total'] ; ?></td>
        <td ><?php echo $tabl_info[$i]['v_mois'] ; ?><br/><em>(<?php echo  $tabl_info[$i]['v_jour'] ; ?>)</em></td>
        <td ><?php echo  $tabl_info[$i]['clic_mois'] ; ?><br/><em>(<?php echo  $tabl_info[$i]['clic_jour'] ; ?>)</em></td>
        <td >
        <?php
        //on calcule la longueur de la barre, puis on affiche les images en modifiant la largeur de l'image centrale.
                
        $barre1 = ceil($tabl_info[$i]['v_mois']*300/$max_visiteurs) ;
        $barre2 = ceil($tabl_info[$i]['clic_mois']*300/$max_clic) ;?>
                
        <img src="images/bar_left.gif" style="padding:0px; margin:0px"alt="("/><img src="images/bar.gif" style="padding:0px; margin:0px; width:<?php echo $barre1; ?>px; height:14px " alt="-"/><img src="images/bar_right.gif" style="padding:0px; margin:0px" alt=")"/><br/>
        <img src="images/bar_left.gif" style="padding:0px; margin:0px"alt="("/><img src="images/bar.gif" style="padding:0px; margin:0px; width:<?php echo $barre2; ?>px; height:14px " alt="-"/><img src="images/bar_right.gif" style="padding:0px; margin:0px" alt=")"/>
        </td>
        </tr>
        <?php
}
?>
</table>


Vous remarquerez que je n'ai pas mis de retour à la ligne pour l'affichage des images, sinon un espace se crée entre elles (je sais pas si c'est normal, mais ça me faisait ça chez moi).

Le résultat n'est pas forcément des plus esthétiques au premier abord, mais je compte sur vous pour créer vos propres images et faire preuve d'imagination avec le CSS ! ^^

Q.C.M.

Où faut-il placer le code permettant de compter les visiteurs ?
Quelle est la date recherchée ici ? &lt;code type="php"&gt;
mktime(00, 00, 2, 1, 1, 2006)
&lt;/code&gt;
ceil(5.1) + ceil(3.6) = ?


Eh bien nous voilà arrivés au bout de ce tuto. Si vous avez des questions, n'hésitez pas à laisser un commentaire ou à m'envoyer un MP, j'y répondrai au plus vite.
Auteur : Totoj21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 67 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1158s (0.1021s)