Créer un compteur de visites en PHP

Novembre 2012

Avec PHP/MySQL, il est très facile de réaliser un système "fait maison" qui compte les visites et les pages vues sur un site internet.

Nous allons voir ici comment faire.

Avant de commencer, voilà quelques indications et prérequis :

  • J'utilise l'encodage UTF-8 (unicode) à la fois dans la base de données MySQL et dans le code PHP.
    Veillez donc à ce que votre éditeur de texte (ex: Notepad++) soit configuré en UTF-8.
  • Pour la connexion à la base de données, j'utilise la classe PDO (qui est la façon la plus répendue de se connecter à une base MySQL en PHP5).
    Si l'extension PDO n'est pas activez dans la configuration de votre serveur PHP (php.ini), vous aurez des erreurs.

Créer une table de statistiques dans MySQL

La première chose dont on a besoin c'est une table MySQL qui va servir à stocker les statistiques (visites) dans la base de données.

Voici la table que nous allons utiliser pour l'exemple :

CREATE TABLE `stats_visites` (
    `ip` VARCHAR(30) NOT NULL,
    `date_visite` DATE NOT NULL,
    `pages_vues` SMALLINT(5) UNSIGNED NOT NULL,
    PRIMARY KEY (`ip`, `date_visite`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

Cette table comporte 3 champs :

  • ip : C'est l'adresse IP du visiteur. Chaque personne qui visite un site a une IP différente, donc on va utiliser cette information pour différencier les visiteurs.
    Ainsi, si on reçoit la visite de 100 adresses IP différentes en une journée, cela veut dire que notre site a été visité par 100 personnes différentes pendant cette journée.
  • date_visite : Comme son nom l'indique, ça correspond à la date de la visite. C'est important de stocker cette information, car ça améliore la précision des statistiques. Au lieu de savoir simplement que l'adresse IP 92.168.14.12 a visité notre site 32 fois depuis qu'on a mis en place le système, on peut savoir quel jour le visiteur est venu, l'information est plus précise.
  • pages_vues : Ce champ permet de savoir combien de pages chaque visiteur a consultées pendant sa visite. Lors de la première visite on donne à page_vues la valeur 1 (la première page vue), puis on augmente ce nombre de 1 lors de chaque consultation de page postérieure.

Compter les visites en PHP

Avant tout, voici le code de base qui permet de se connecter à la base de données MySQL où se trouve la table stats_visites que nous venons de créer.

Je fournis ce code à titre d'exemple, mais pour intégrer ce système de statistique de fréquentation très basique que nous sommes en train de réaliser, à un site existant, vous n'aurez pas besoin de ça, puisque votre site est sensé avoir sa propre gestion de la connexion à la base de données.

<?php
// On indique au navigateur qu'on utilise l'encodage UTF-8
header('Content-type: text/html; charset=utf-8');

// Paramètres de connexion à la base
define('DB_HOST' , 'localhost');
define('DB_NAME' , 'tmp_finalclap_faq');
define('DB_USER' , 'root');
define('DB_PASS' , '');

// Connexion à la base avec PDO
try{
    $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch(Exception $e) {
    echo "Impossible de se connecter à la base de données '".DB_NAME."' sur ".DB_HOST." avec le compte utilisateur '".DB_USER."'";
    echo "<br/>Erreur PDO : <i>".$e->getMessage()."</i>";
    die();
}
?>

Bien, maintenant on peut interagir avec la base de données par l'intermédiaire de notre objet $pdo.

Il ne reste plus qu'à écrire une fonction compter_stats() qui lorsqu'elle est appelée va mettre à jour la table stats_visites.

<?php
// Fonction qui permet de mettre à jour le compteur de visites
function compter_visite(){
    // On va utiliser l'objet $pdo pour se connecter, il est créé en dehors de la fonction
    // donc on doit indiquer global $pdo; au début de la fonction
    global $pdo;
    
    // On prépare les données à insérer
    $ip   = $_SERVER['REMOTE_ADDR']; // L'adresse IP du visiteur
    $date = date('Y-m-d');           // La date d'aujourd'hui, sous la forme AAAA-MM-JJ
    
    // Mise à jour de la base de données
    // 1. On initialise la requête préparée
    $query = $pdo->prepare("
        INSERT INTO stats_visites (ip , date_visite , pages_vues) VALUES (:ip , :date , 1)
        ON DUPLICATE KEY UPDATE pages_vues = pages_vues + 1
    ");
    // 2. On execute la requête préparée avec nos paramètres
    $query->execute(array(
        ':ip'   => $ip,
        ':date' => $date
    ));
}
?>

Ce code mérite peut-être quelques explications...

La mise à jour de la table se fait en une seule requête. Normalement on aurait dû avoir 2 requêtes selon les cas :

Dans un tout autre contexte, cet article est très intéressant : masquer une colonne dans excel.

  • Première visite : INSERT INTO... pour enregistrer cette nouvelle visite dans la base de données, avec l'ip et la date
  • Pages vues suivantes : UPDATE... pour incrémenter le nombre de pages vues (champ pages_vues)

Mais MySQL permet de faire ça en une seule fois, en spécifiant l'action à effectuer si le tuple existe déjà (clé primaire ip + date), grâce à la clause ON DUPLICATE KEY. En l'occurrence, l'action à effectuer est d'incrémenter le champ page_vues de 1 pour le tuple en question (ip + date).

Cela permet d'optimiser les performances en diminuant le nombre de requêtes SQL.

Reste plus qu'à appeler cette fonction (attention à ne l'appeler qu'une seule fois à chaque chargement de page, car à chaque fois qu'elle est appelée elle augmente le nombre de pages vues, donc si vous l'appelez plusieurs fois vos statistiques seront faussées) :

// Comptabilisation de la visite
compter_visite();

Ce script n'a pas vocation à remplacer un vrai outil de mesure d'audience (web analytics) comme Google Analytics, Xiti ou Omniture, mais il permet d'avoir sa propre source de données.

De plus, contrairement aux outils analytics externes, ici le tracking n'est pas effectué côté client (en JavaScript ou à l'aide d'une image web-beacon), mais côté serveur. Ainsi il fonctionne même pour les visiteurs qui ont désactivé le JavaScript, et pour les robots d'indexation par exemple (qui n'exécutent pas le JavaScript).

Allez donc jeter un oeil sur cette page : artwork de noël rétro.

5 commentaires :
commentaire n°2758 par Keifh
Keifh samedi 1 mars 2014, 12:56
bonjour comment puis je insérer le nombre de vue dans ma page merci
commentaire n°3212 par Didas Lilandos
Didas Lilandos mardi 15 décembre 2015, 11:26
$visiteur = prepare(SELECT * FROM table_visite WHERE=:visite_online);
$visiteur->bindvalue(':visite_online', $id_online, PDO::PARAM_STR);
$visiteur->execute();
$list_visiteur = $visiteur->fetchAll(PDO::FETCH_ASSOC);

foreach($list_visiteur as $all => $each)
{
  echo $each['ip'];."<br/>";
  echo $each['pages_vues'];."<br/>";

}
...elengeafrika...
commentaire n°2870 par chinois
chinois lundi 18 août 2014, 21:50
Bonsoir, j'ai un soucis et j'ai besoins de votre aide. Voila mon soucis:
je voudrais récupérer le nombre de fois qu’un utilisateur clique sur un bouton(ex: bouton partager) et le stocker en base de donnees. Ce bouton peut etre meme le bouton fermer(d'un pop-up) par exemple.
commentaire n°4023 par bonjour
bonjour mardi 21 mai 2019, 16:57
Bonjour tout le monde.
commentaire n°4024 par bonjour
bonjour mardi 21 mai 2019, 16:58
Salut.
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré