La Homepage de Floppy
v3.00 - Tutoriaux PHP + MySQL



Nombre de visiteurs sur le site (en pseudo temps-réel)
(PHP4 uniquement)

 


Vous pouvez accèder directement à la partie qui vous intéresse en cliquant ci-dessous :
  • Paramétrage du tutorial
  • Information sur le tutorial
  • Principe du tutorial
  • Création de la table dans MySQL
  • Création du fichier global.inc.php
  • Création du fichier fonction.inc.php
  • Création du fichier de test visiteurs.php
  • Conclusion



  • Paramétrage du tutorial
     


    Ce tutorial utilise des Valeurs par défaut
    Si vous n'utilisez pas les mêmes valeurs, veuillez les changer et appuyer sur le bouton de validation des modifications
    Pour remettre un champ à sa valeur initiale, cliquez sur sa description
    Modification des paramètres
    Nom de la base de données  : 
    Nom de la table dans la base  : 
    Remarque : ces valeurs apparaitront dans le tutorial sous cette forme : lfa



    Information sur le tutorial
     


    Ce tutorial explique comment utiliser un compteur de visiteurs sur le site, en accèdant à une table de la base mySQL

    Pour illustrer le tutorial, nous allons créer
  • 1 table dans la base MySQL pour stocker les informations utiles au compteur
  • 1 fichier include contenant les variables globales au tutorial
  • 1 fichier include contenant les fonctions utilisées dans le tutorial
  • 1 fichier permettant de tester le compteur de visiteurs

    Vous pouvez vous rendre compte du résultat en cliquant ici : résultat du tutorial

    Au préalable, vous devez avoir installé Apache, PHP4 et MySQL (cf. tutorial sur l'installation d'apache + PHP4 + MySQL)
    Eventuellement, vous devez avoir installé phpMyAdmin (cf. tutorial sur l'installation de phpMyAdmin (pour PHP4))
    Vous devez également avoir un minimum de connaissances sur les bases de données et le SQL (sujets non abordés dans ce tutorial)

    Pour tout complément d'information ou pour toutes questions, vous pouvez me laisser un mail ou poster un message dans le forum

    Merci de ne pas réutiliser ce tutorial sans citer mon site : La homepage de Floppy

    Bonne lecture...



    Principe du tutorial
     


    En fait, le principe est très simple car tout fonctionne grâce à une seule table MySQL.
    A chaque page ouverte depuis votre site par un visiteur (qui a une adresse IP unique), vous stockez son adresse IP dans la table en lui calculant une date d'expiration (ici, ce temps sera de 1 minute, d'où le pseudo temp-réel).

    Avant d'afficher la page, l'astuce consiste
  • à supprimer tous les enregistrements qui ont expirés
  • à insérer (ou modifier) la date limite de l'actuel visiteur
  • à compter le nombre d'enregistrements restant dans la table et qui correspond au nombre de visiteurs



    Création de la table dans MySQL
     


    Etape Description
    1 Si vous souhaitez récupérer le fichier de création de la table, il se trouve dans l'archive visiteurs.zip (fichier visiteurs.sql)
    2 Créez une base de donnée lfa à l'aide de phpMyAdmin
    3 Créez la table visiteurs dans votre base de données lfa, à l'aide de phpMyAdmin
    Cette table est définie ainsi :
    #
    # Structure de la table 'visiteurs'
    #
    CREATE TABLE visiteurs (
        ip char(15) NOT NULL,
        limite timestamp(14),
        PRIMARY KEY (ip)
    );
    Explication : voici l'explication des champs de la table :
  • ip : clé primaire de la table, identifiant un visiteur unique (par son adresse IP)
  • limite : date et heure limite de validité du visiteur
  • 4 Vous n'aurez plus besoin de phpMyAdmin pour la suite du tutorial




    Création du fichier global.inc.php
     


    Etape Description
    1 Si vous souhaitez récupérer le fichier global.inc.php, il se trouve dans l'archive visiteurs.zip
    2 Créer un fichier d'include global.inc.php, contenant les variables globales d'accès à votre base
    Ce fichier est prévu pour un usage en local et un usage sur le serveur de votre hébergeur (Free par exemple), d'où le test sur le HTTP_HOST
    Ce fichier contient ces lignes :
    <?
    if (getenv("HTTP_HOST") == "localhost") {
        // variables globales localhost
        $host = "localhost";
        $base = "lfa";
        $login = "";
        $pass = "";
    } else {
        // variables globales Free
        $host = "sql.free.fr";
        $base = "laurent.fagot";  // à changer
        $login = "laurent.fagot"; // à changer
        $pass = "xxxxxxxx";       // à changer
    }
    ?>
    Explication : voici l'explication des variables utilisées :
  • $host : nom du host (serveur) hébergeant la base
  • $base : nom de la base sur le serveur
  • $login : login pour accèder à la base
  • $pass : mot de passe pour accèder à la base
    Attention : selon si vous utilisez le fichier en local ou sur le serveur, vous devez faire des modifications :
  • Pour la partie variables globales localhost, il ne devrait pas y avoir de modification à effectuer (mise à part $base)
  • Pour la partie variables globales Free, il vous faut modifier les valeurs des lignes marquées par '// à changer' comme suit :
        - $base : votre identifiant de connexion sur Free
        - $login : votre identifiant de connexion sur Free (le même que $base)
        - $pass : votre mot de passe sur Free
    Remarque : si vous utilisez un autre fournisseur d'accès que Free, veuillez adapter les valeurs aux variables




  • Création du fichier fonction.inc.php
     


    Etape Description
    1 Si vous souhaitez récupérer le fichier fonction.inc.php, il se trouve dans l'archive visiteurs.zip
    2 Créer un fichier d'include fonction.inc.php, contenant les fonctions d'accès à votre base
    Ce fichier est découpé en foncions (d'où son nom), et il ne contient que du code PHP
    Ajoutez donc la ligne en début de fichier :
    <?
    3 Fonction connecte() : connexion à la base
    Ajoutez ces lignes au fichier :
    function connecte() {
        global $base, $host, $login, $pass;
        $conn = mysql_connect($host, $login, $pass);
        mysql_select_db($base);
        return $conn;
    }
    Utilise les variables globales $base, $host, $login et $pass, définies dans le fichier global.inc.php
    Retourne l'identifiant de la connecion ($conn) et précise sur quelle base on travaille
    4 Fonction deconnecte($conn) : déconnexion de la base
    Ajoutez ces lignes au fichier :
    function deconnecte($conn) {
        mysql_close($conn);
    }
    Utilise la variable de connexion $conn, passée en argument et issue de la fonction connecte()
    5 Fonction getNbVisiteurs : retourne le nombre de visiteurs sur le site
    Ajoutez ces lignes au fichier :
    function getNbVisiteurs() {
        $result = mysql_query("select count(*) as res from visiteurs");
        $row = mysql_fetch_object($result);
        if ($row) {
            $res = $row->res;
            if ($res == 0) $res = 1;
        } else {
            $res = 1;
        }
        mysql_free_result($result);
        return $res;
    }
    Retourne le nombre de visiteurs actuellement sur le site
    6 Fonction updateNbVisiteurs() : met à jour la table des visiteurs
    Ajoutez ces lignes au fichier :
    function updateNbVisiteurs() {
        $ip = getenv("REMOTE_HOST");
        if (!$ip) $ip = getenv("REMOTE_ADDR");
        
        mysql_query("delete from visiteurs where limite < " . date("YmdHis"));
        $dateLimite = date("YmdHis", mktime(date("H"), date("i") + 1 , date("s"), date("m"), date("d"), date("Y")));
        
        $result = mysql_query("select * from visiteurs where ip = '$ip'");
        $row = mysql_fetch_object($result);
        if ($row)
            mysql_query("update visiteurs set limite = $dateLimite where ip = '$ip'");
        else
            mysql_query("insert into visiteurs (ip, limite) values ('$ip', $dateLimite)");
        mysql_free_result($result);
    }
    Explication : voici les explications de ces lignes
  • Récupération de l'adresse IP de l'utilisateur (par REMOTE_HOST ou REMOTE_ADDR)
  • Suppression de tous les enregistrements qui ont expirés
  • Détermination de la date limite de validité
  • Recherche de l'adresse IP de l'utilisateur dans la table
  • Si l'adresse IP est dans la table, on met à jour la date limite avec dateLimite calculée précédemment
  • Sinon, on ajoute l'enregistrement dans la table avec dateLimite calculée précédemment
    Remarque : vous pouvez changer la durée de la date limite en changeant la valeur (ici 'date("i") + 1' pour 1 minute), mais ne mettez pas de valeurs trop grandes, sinon cela ne voudrait plus rien dire...
  • 7 Fermez le fichier PHP en ajoutant cette ligne en fin de fichier :
    ?>




    Création du fichier de test visiteurs.php
     


    Etape Description
    1 Si vous souhaitez récupérer le fichier visiteurs.php, il se trouve dans l'archive visiteurs.zip
    Pour plus de clarté, le fichier et les explications sont séparés en plusieurs parties
    2 Créer un fichier visiteurs.php contenant le code d'affichage du test
    Voici le début du fichier :
    <?
    include "global.inc.php";
    include "fonction.inc.php";
    $conn = connecte();

    if (isset($HTTP_GET_VARS["action"]))
        $action = $HTTP_GET_VARS["action"];
    else
        $action = "";

    if ($action == "add") {
        srand((double)microtime()*1000000);
        $ip = rand(1, 255) . "." . rand(1, 255) . "." . rand(1, 255) . "." . rand(1, 255);
        mysql_query("delete from visiteurs where ip = '$ip'");
        $dateLimite = date("YmdHis", mktime(date("H"), date("i") + 1 , date("s"), date("m"), date("d"), date("Y")));
        mysql_query("insert into visiteurs (ip, limite) values ('$ip', $dateLimite)");
    } else
        $ip = "";

    updateNbVisiteurs();

    // ------------------------------------

    function getDateFormatee($date) {
        // converti date "AAAAMMJJHHmmSS" en "AAAA/MM/JJ HH:mm:SS"
        $res = substr($date, 0, 4);                 // Année
        $res = $res . "/" . substr($date, 4, 2);    // Mois
        $res = $res . "/" . substr($date, 6, 2);    // Jour
        $res = $res . " " . substr($date, 8, 2);    // Heure
        $res = $res . ":" . substr($date, 10, 2);   // Minute
        $res = $res . ":" . substr($date, 12, 2);   // Seconde
        return $res;
    }
    ?>
    Explication : voici les explication de ces lignes
  • Chargement du fichier d'include global.inc.php contenant les variables de l'application
  • Chargement du fichier d'include fonction.inc.php contenant les fonctions de l'application
  • Connexion à la base
  • Récupération de la variable $action passée en paramètre
  • Test de la variable $action qui permet de savoir s'il faut ou non rajouter un utilisateur fictif dans la table
  • Si $action vaut "add", on génère une adresse IP au hasard, on la supprime de la base (si elle y était déjà), on détermine la date limite de validité (ici, 1 minute) et on ajoute l'adresse IP avec la date limite dans la base
  • On lance la fontion de mise à jour des visiteurs (updateNbVisiteurs())
  • On définit la fonction de convertion de date de type 'AAAAMMJJHHmmSS' vers 'AAAA/MM/JJ HH:mm:SS'
  • 3 Voici la suite du fichier :
    <html>
    <head>
        <title>Nombre de visiteurs</title>
    </head>
    <body>
    <center>
    <font face="Trebuchet MS, Comic Sans MS" size=2>
    Nous sommes le <b><? echo getDateFormatee(date("YmdHis")) ?></b><br>
    <? if ($action == "add") echo "<font color=red>IP <b>$ip</b> ajoutée</font><br>"; ?>
    Il y a <b><? echo getNbVisiteurs() ?></b> personne(s) sur le site :<br><br>
    <table width=400>
    <tr>
        <td bgcolor="08119a" align=center><font face="Trebuchet MS, Comic Sans MS" size=2 color="ffffff">Adresse IP</font></td>
        <td bgcolor="08119a" align=center><font face="Trebuchet MS, Comic Sans MS" size=2 color="ffffff">Limite</font></td>
    </tr>
    Explication : voici les explication de ces lignes
  • Début du fichier HTML
  • Affichage de la date et l'heure courante
  • Affichage de l'adresse IP qui a été ajoutée (si $action vaut "add")
  • Affichage du nombre de visiteurs sur le site (grâce à la fonction getNbVisiteurs())
  • Préparation du tableau qui va contenir les adresses IP et les dates limites
  • 4 Voici la suite du fichier :
    <?
    $ligne = 1;
    $result = mysql_query("select * from visiteurs order by limite");
    while ($row = mysql_fetch_object($result)) {
        $limite = getDateFormatee($row->limite);
        ?>
        <tr>
            <td align=center bgcolor="<? if ($ligne > 0) echo 'ffffff'; else echo 'eeeeff' ?>"><font face="Trebuchet MS, Comic Sans MS" size=2<? if ($ip == $row->ip) echo " color=red"; ?>><? echo $row->ip ?></font></td>
            <td align=center bgcolor="<? if ($ligne > 0) echo 'ffffff'; else echo 'eeeeff' ?>"><font face="Trebuchet MS, Comic Sans MS" size=2<? if ($ip == $row->ip) echo " color=red"; ?>><? echo $limite ?></font></td>
        </tr>
        <?
        $ligne = -$ligne;
    }
    mysql_free_result($result);
    Explication : voici les explication de ces lignes
  • On lance la requête de selection qui va récupérer tous les enregistrements de la table (triés par date limite)
  • Pour chaque enregistrement, on ajoute une ligne qui contient l'adresse IP et la date limite
  • Si une nouvelle adresse IP est ajoutée, elle apparait en rouge
  • 5 Voici la suite du fichier :
    deconnecte($conn);
    ?>
    </table>
    <br>
    [<a href="visiteurs.php">Rafraichir</a>] - [<a href="visiteurs.php?action=add">Ajouter une adresse IP fictive</a>]
    </center>
    </font>
    </body>
    </html>
    Explication : voici les explication de ces lignes
  • Deconnexion de la base
  • Affichage des choix (rafraichir ou ajouter un nouvelle adresse IP fictive)
  • Fermeture du fichier HTML




  • Conclusion
     


    Vous avez maintenant tous les exemples pour gérer le nombre de visiteurs sur votre site, avec accès à une base MySQL :
  • accès à la base de données (connexion et deconnexion)
  • accès à des enregistrement d'une table

    Rappels :

    Avant de commencer votre développement :
  • Lancez le serveur Apache
  • Lancez le serveur MySQL

    Pendant le développement :
  • Déposez vos sources dans la racine de votre site web ou dans un sous-répertoire de cette racine

    Avant de quitter :
  • Arrêtez le serveur MySQL
  • Arrêtez le serveur Apache


    © Floppy /AD - 10/2002