Compteur de connectés

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 537 fois - Téléchargée 30 fois

Contenu du snippet

Ceci est un compteur de connectés (eh oui, encore un !).
Celui-ci récupère deux variables, l'une qui contient le nombre de connectés sur le site, et l'autre qui contient ceux de la page courante.
Ce script utilise MySQL (1 table est nécessaire avec 3 champs : Id utilisateur, heure et page visitée), mais vous n'aurez qu'à préciser vos coordonnées et il se charge du reste (création de la table).
Sinon, comme d'habitude, le temps pendant lequel l'utilisateur est considéré comme connecté est paramétrable (par défaut 5 minutes).

Le principal avantage de ce script est qu'il est très léger ! (supprimez les commentaires et vous verrez)

J'ai aussi inclus une fonction bonus, get_ip(), qui permet de connaître la vraie IP du client...

Voilà, c'est tout !

Source / Exemple :


<?php
/*****************************************************************************

  • Compteur de connectés
  • Copyright © 2002 Dean
*
  • Contact : -
*
                                                                                                                                                          • /
/*
  • string get_ip()
  • Retourne la vraie adresse IP du client, même si celui-ci est sous proxy
  • /
function get_ip() { if($_SERVER) { if($_SERVER['HTTP_X_FORWARDED_FOR']) $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; elseif($_SERVER['HTTP_CLIENT_IP']) $ip = $_SERVER['HTTP_CLIENT_IP']; else $ip = $_SERVER['REMOTE_ADDR']; } else { if(getenv('HTTP_X_FORWARDED_FOR')) $ip = getenv('HTTP_X_FORWARDED_FOR'); elseif(getenv('HTTP_CLIENT_IP')) $ip = getenv('HTTP_CLIENT_IP'); else $ip = getenv( 'REMOTE_ADDR'); } return $ip; } // Définit un identifiant pour le client (ici son adresse IP) $client_id = get_ip(); // Définit l'intervalle de temps pendant lequel le client est considéré comme connecté (en secondes) $client_delay = 300; // Récupère l'heure courante sous la forme d'un timestamp Unix $time = time(); // Ouvre une connection à MySQL et sélectionne la base mysql_select_db("database", mysql_connect("localhost", "root", "")); // Supprime de la table les entrées invalides par rapport à l'heure courante if(!mysql_query("DELETE FROM clients WHERE client_time_request < $time - $client_delay")) // En cas d'échec, crée la table mysql_query("CREATE table clients(client_id VARCHAR(64) NOT NULL, client_location VARCHAR(128) NOT NULL, client_time_request INT NOT NULL)"); // Insère l'adresse IP du client et la page où il se trouve mysql_query("INSERT INTO clients VALUES('$client_id', '$REQUEST_URI', '$time')"); // Définit les clients connectés sur la page en cours $current_num_clients = mysql_num_rows(mysql_query("SELECT DISTINCT client_id FROM clients WHERE client_location = '$REQUEST_URI'")); // Définit les clients connectés sur le site $global_num_clients = mysql_num_rows(mysql_query("SELECT DISTINCT client_id FROM clients")); // Ferme la connection à MySQL mysql_close(); ?>

Conclusion :


Je ne pense pas qu'il y ait de problèmes avc ce script, quoi qu'il faut peut-être la version 4.1 (ou plus) de PHP pour faire fonctionner get_ip(). Sinon utilisez $REMOTE_ADDR pour la valeur de client_id.

Ah oui, j'allais oublier :

Pour afficher les connectés, il faut faire appel aux variables $global_num_clients et $current_num_clients.

Si vous avez des questions ou des remarques , n'hésitez pas à ajouter des commentaires.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
21
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
15 septembre 2007

Hey les gens, réagissez, il y a au moins 2 failles de sécurité là déjà ! En tout cas je n'en ai vue que 2 pour l'instant.
La première concerne l'injection SQL, heureusement que frakosun a proposé une solution mais manque de pot, Dean n'a pas jugé utile de le corriger dans la source, donc plein de gens continueront à trouer leur sécurité en copiant cette source.
La deuxième est que même si le script vérifie bien la cohérence de l'adresse IP donnée en HTTP_X_FORWARDED_FOR ou en HTTP_CLIENT_IP (ce qui n'est déjà pas le cas), je peux quand même générer un petit script qui enverra une fausse IP aléatoire dans l'en-tête de la requête HTTP et donc faire exploser le compteur de chez moi même sans aucun proxy.
Messages postés
392
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
26 septembre 2009

Tres joli script :)
Messages postés
10
Date d'inscription
lundi 7 août 2006
Statut
Membre
Dernière intervention
11 janvier 2008

En fait il existe plusieurs solutions plus ou moins 'correctes' on va dire.
Par ex. la méthode de kankrelune donné plus haut fonctionne, mais pourquoi faire compliqué (htmlspecialchars + addslashes) alors que mysq_real_escape_string est une fonction sql donc 100% adaptée?

Il faut l'utiliser avant toute interaction avec la bdd (select, update & co.) sans exception ;)

Par contre si les "magic quotes" sont activés sur le serveur cela va échapper 2 fois certains caractères comme les ' ou " donc c'est pas top. Il existe une fonction qui s'occupe d'y remédier, qui va vérifier si les magic quotes sont sur ON ou OFF et qui va agir en conséquence (par contre désolé je ne l'utilise pas donc je ne l'ai pas...).

Pis pour peaufiner avec une bonne dose de parano pour l'affichage un 'int($current_num_clients)' ne peut pas faire de mal :P
Messages postés
500
Date d'inscription
mardi 16 avril 2002
Statut
Membre
Dernière intervention
2 août 2004

>> pour la faille un 'mysql_real_escape_string($_SERVER['REQUEST_URI'])' devrait suffire, pas besoin d'en mettre 12 tonne ;)

Merci, je me demandais justement si l'on pouvait "préparer" les requêtes SQL avec PHP (de façon sécurisée), cela répond à ma question.
Messages postés
10
Date d'inscription
lundi 7 août 2006
Statut
Membre
Dernière intervention
11 janvier 2008

pour la faille un 'mysql_real_escape_string($_SERVER['REQUEST_URI'])' devrait suffire, pas besoin d'en mettre 12 tonne ;)
Afficher les 35 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.