Compteur de visites

Eléphant du PHP | 287 Messages

19 mars 2009, 10:49

Bonjour,
J'ai un compteur de visite me permettant de savoir combien de visiteurs sont en ligne sur mon site, mais je voudrais avoir le total de visiteurs.
Faut-il créer une autre table dans ma BDD, ou adapter la première.
Merci de votre aide

Eléphanteau du PHP | 15 Messages

19 mars 2009, 11:15

Je te conseil de créer une autre table qui créera un enregistrement pour chaque visite. Avec peut-être une récupération de leur IP pour pouvoir différencier les visiteurs uniques par jour. Mais tu as des systèmes gratuit qui te font ça automatiquement.

Tu n'as qu'à placer un script en bas de ta page.
Tu as, par exemple, google analytics
Modifié en dernier par Poulpe le 19 mars 2009, 12:51, modifié 1 fois.

Eléphant du PHP | 287 Messages

19 mars 2009, 12:30

Par rapport à l'aure table il faut que je rajoute 1 champ ID et je supprime le champ timestamp ?

Eléphanteau du PHP | 15 Messages

19 mars 2009, 13:02

Le champs ID est vraiment utile si tu souhaites recherches des enregistrements en particuliers.

Pour ton cas, ça sera des groupes d'enregistrements que tu rechercheras en fonction de la date.

Pour le nombre de visite, il te faut une notion de distinction qui peut se faire par IP :
'IP' varchar : pour pouvoir savoir qui se connecte et donc faire un comptage de visiteur unique
'date' date : pour te permettre de récupérer les enregistrements d'un jour bien précis.

Tu peux nous donner la structure de ta table d'origine ?

ViPHP
ViPHP | 1996 Messages

19 mars 2009, 13:10

Une bonne table de ce type devrait être constitué de :

ID - adresse IP - Timestamp avec ID en clé primaire.

Tu vérifies que l'IP n'existe pas pour la date du jour (car la personne peut revenir plusieurs fois) et tu l'insert dans la table. Cela pose quand même un problème quand plusieurs personnes passent par un routeur qui cache leur IP respective : tu auras la même IP pour tout le monde et donc qu'une seule insertion.
Aussi, utilises les cookies pour réduire ce problème : avant l'insertion tu envoi un cookie pour une journée à une personne. Tu testes (avant l'envoi) si ce cookie est présent et si il ne l'est pas : envoi cookie + insertion sinon pas d'insertion + pas d'envoi. Cependant, il se peut que la personne refuse les cookies.
Dernière chose : tu peux utiliser d'autres variables $_SERVER pour différencier plusieurs utilisateurs qui ont la même adresse IP ($_SERVER["REMOTE_ADDR"]) : le navigateur utilisé par exemple via $_SERVER["HTTP_USER_AGENT"]. Mais même chose ils peuvent utiliser le même type de navigateur....
Enfin tu peux faire uns fonction AJAX pour être sûr que tous cela fonction mais il se peut que l'utilisateur désactive JAVASCRIPT

Résultats des courses : je ferai cookie + table.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 287 Messages

19 mars 2009, 13:37

table d'origine:
ip (varchar)
timestamp (int)

Eléphanteau du PHP | 15 Messages

19 mars 2009, 15:44

Et comme fais-tu pour ressortir ceux qui sont en ligne ?

Eléphant du PHP | 287 Messages

20 mars 2009, 09:47

Voici mon code PHP pour afficher le nombre de connectés :
<?php
// Connexion à MySQL
mysql_connect("localhost", "root", "");
mysql_select_db("bdd");

// -------
// ETAPE 1 : on vérifie si l'IP se trouve déjà dans la table
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "ip" est l'adresse ip du visiteur
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
{
    mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}
else // L'ip se trouve déjà dans la table, on met juste à jour le timestamp
{
    mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}

// -------
// ETAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 5 minutes

// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :
$timestamp_5min = time() - (60 * 5); // 60 * 5 = nombre de secondes écoulées en 5 minutes
mysql_query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);

// -------
// ETAPE 3 : on compte le nombre d'ip stockées dans la table. C'est le nombre de visiteurs connectés
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_array($retour);


//On n'a plus qu'à afficher le nombre de connectés !
echo '<div id="center">';
echo 'Actuellement, il y a ' . $donnees['nbre_entrees'] . ' visiteur(s) !';
echo '</div>';
?>