<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nicolas Nunge : le Blog &#187; Compteur</title>
	<atom:link href="http://blog.nicolasnunge.net/tag/compteur/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nicolasnunge.net</link>
	<description>Un blog utilisant WordPress</description>
	<lastBuildDate>Thu, 16 Jul 2009 18:31:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Créer un compteur de visiteurs</title>
		<link>http://blog.nicolasnunge.net/2009/07/16/creer-un-compteur-de-visiteurs/</link>
		<comments>http://blog.nicolasnunge.net/2009/07/16/creer-un-compteur-de-visiteurs/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 18:31:47 +0000</pubDate>
		<dc:creator>Nicolas</dc:creator>
				<category><![CDATA[Portions PHP]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[Compteur]]></category>
		<category><![CDATA[connectés]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Portion]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://blog.nicolasnunge.net/?p=46</guid>
		<description><![CDATA[Inauguration d&#8217;une nouvelle catégorie sensiblement pareille que les portions PHP à la seule différence qu&#8217;ici, les codes sont plus développés, sont expliqués afin de permettre à ceux qui le souhaitent de comprendre son fonctionnement. Donc ici nous allons voir comment créer un simple compteur de visiteurs connectés fonctionnant avec PHP et MySQL. Tout d&#8217;abord, on [...]]]></description>
			<content:encoded><![CDATA[<p>Inauguration d&#8217;une nouvelle catégorie sensiblement pareille que les <a href="http://blog.nicolasnunge.net/category/portions-php/">portions PHP</a> à la seule différence qu&#8217;ici, les codes sont plus développés, sont expliqués afin de permettre à ceux qui le souhaitent de comprendre son fonctionnement.</p>
<p>Donc ici nous allons voir comment créer un simple compteur de visiteurs connectés fonctionnant avec PHP et MySQL. Tout d&#8217;abord, on va un peu tuer les idées reçues &#8230; Un compteur &laquo;&nbsp;live&nbsp;&raquo; n&#8217;affiche pas réellement les visiteurs connectés à un instant T précis mais plutôt les personnes ayant visité la page dans un intervalle de temps relativement court (dans notre exemple, on va considérer qu&#8217;une personne est hors ligne à partir de 15 minutes d&#8217;inactivité. Cela peut bien évidemment être modifié, nous allons voir comment).</p>
<p><span id="more-46"></span><strong>1. <span style="text-decoration: underline;">Structure du projet</span></strong></p>
<p>On pourrait tout aussi bien se lancer tête baissée dans la conception du script. Cependant, pour ceux dont c&#8217;est la première approche de PHP, on va étudier d&#8217;abord la structure du compteur, l&#8217;ordre dans lequel les actions seront effectuée, etc.</p>
<p>On peut se poser la question : qu&#8217;est ce que fait un compteur ? (il compte &#8230; oui, mais encore ?)</p>
<p>En détail, un compteur &#8211; dans notre cas &#8211; dois en premier lieu récupérer les information de la visite en cours (adresse IP du visiteur et la date à l&#8217;instant de la visite), puis vérifier si elles sont déjà enregistrées dans la base de donnée. Vient alors deux cas distincts :</p>
<p>&gt; Le visiteur <strong>est déjà enregistré</strong> dans la base de donnée, étant donné qu&#8217;il surfe sur le site : on se contente alors de mettre à jour la date.</p>
<p>&gt; Le visiteur <strong>n&#8217;est pas dans la base de donnée</strong> : car il peut s&#8217;agir de sa première visite ou d&#8217;une visite précédée de plus qu&#8217;un quart d&#8217;heure d&#8217;inactivité. Dans ce cas, on ajoute une nouvelle entrée correspondant à ce visiteur.</p>
<p>Maintenant que le visiteur actuelle est enregistré, on peut effectuer un léger ménage afin de supprimer les personnes ayant quitté le site depuis 15 minutes (ou plus). Puis, une fois ces opérations faites, on compte le nombre de ligne puis on l&#8217;affiche. Voilà en résumé ce que fera notre compteur.</p>
<p><strong>2. <span style="text-decoration: underline;">Création de la base de donnée</span></strong></p>
<p>Afin de stocker les informations sur les visites, on va créer une table à l&#8217;intérieur d&#8217;une base de donnée MySQL. Dans l&#8217;exemple, j&#8217;ai appelé la table <em>compteur</em> et je l&#8217;ai conçue à l&#8217;aide de deux champs : adresse_ip (Varchar(15), Unique, Not Null) et derniere_activite (Int(16), Not Null).</p>
<pre name="code" class="sql">CREATE TABLE  `compteur` (
`adresse_ip` varchar(15) NOT NULL,
`derniere_activite` int(16) NOT NULL,
UNIQUE KEY `adresse_ip` (`adresse_ip`)
);</pre>
<p><strong>3. <span style="text-decoration: underline;">Création du script</span></strong></p>
<p>Le script en lui même, dans sa forme la plus basique, ne se constitue que de quelques étapes. Dans la première étape (sur laquelle nous n&#8217;allons pas trop nous attarder), on va se connecter au serveur MySQL:</p>
<pre name="code" class="php">mysql_connect("hote", "nom_dutilisateur", "mot_de_passe");
mysql_select_db("base_de_donnee");</pre>
<p><em>Remplacez les paramètres des fonctions par les informations correspondantes à votre hébergeur.</em></p>
<p>Dans la seconde partie du script, on va traiter les informations concernant la visite actuelle. Comme précisé dans la section où nous avons vu la structure du script, on va s&#8217;occuper de deux informations : la date et l&#8217;adresse IP.</p>
<p>On récupère l&#8217;adresse IP</p>
<pre name="code" class="php">$adresse_ip = $_SERVER['REMOTE_ADDR'];</pre>
<p>Puis on la traite dans une requête un petit peu complexe &#8230;</p>
<pre name="code" class="php">mysql_query("INSERT INTO compteur VALUES ('$adresse_ip',UNIX_TIMESTAMP()) ON DUPLICATE KEY UPDATE derniere_activite=UNIX_TIMESTAMP()");</pre>
<p>Alors &#8230; que signifie cette longue requête ?</p>
<p>On peut tout d&#8217;abord y distinguer deux parties. La première correspond à une instruction d&#8217;insertion banale (INSERT INTO compteur VALUES (&#8216;$adresse_ip&#8217;,UNIX_TIMESTAMP())), et une seconde un peu plus complexe que nous allons voir en détail &#8230;</p>
<p>Alors en fait, pour comprendre cette requête il suffit simplement de la traduire de l&#8217;anglais. Pour les moins anglicistes, <em>&laquo;&nbsp;ON DUPLICATE KEY, UPDATE&#8230;&nbsp;&raquo; </em>peut se traduire par : <em>SI LA CLEF EST DUPLIQUEE, ON MET A JOUR &#8230; </em>Aussi, cette instruction va insérer un nouvel enregistrement si l&#8217;IP n&#8217;est pas déjà présente dans la base de donnée, et si elle l&#8217;est, elle va simplement mettre à jour la date <img src='http://blog.nicolasnunge.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  !</p>
<p>Bon ! La partie la plus dure est passée ! Maintenant on va supprimer les visiteurs n&#8217;ayant pas eu d&#8217;activité depuis au moins quinze minutes. Dans ce script, nous ne travaillons pas avec une date au format <em>aaaa-mm-jj hh:mm:ss</em> (exemple : 2009-07-17 17:55:22) mais avec un timestamp unix (nombre de secondes écoulées depuis le 1er Janvier 1970 à 0h00): cela facilite considérablement les calculs.</p>
<p>Donc dans un premier temps, on calcule le timestamp unix d&#8217;il y a un quart d&#8217;heure.  Pour cela, on peut utiliser deux méthodes.</p>
<p>Première méthode : on utilise la fonction strtotime, qui va traduire une chaine de caractères (en anglais) en un timestamp unix.</p>
<pre name="code" class="php">$est_hors_ligne = strtotime("-15 minutes");</pre>
<p>Deuxième méthode : on utilise nos bonnes vieilles connaissances mathématiques et, sachant que dans une minutes il y a 60 secondes, on effectue le calcul :</p>
<pre name="code" class="php">$est_hors_ligne = time() - 15*60;</pre>
<p>Une fois le timestamp calculé, on envoie la requête, qui est une banale instruction DELETE :</p>
<pre name="code" class="php">mysql_query("DELETE FROM compteur WHERE derniere_activite <= $est_hors_ligne");</pre>
<p>La partie "cachée" du compteur, celle qui traite les données est faite. Si vous souhaitez utiliser votre compteur en arrière plan, vous pouvez vous arrêter la et stopper la connexion MySQL. Si vous souhaitez aller jusqu'au bout et afficher le nombre de visiteur, on continue par une instruction de sélection.</p>
<pre name="code" class="php">$nombre_visiteurs = mysql_query("SELECT COUNT(adresse_ip) FROM compteur");
echo mysql_result($nombre_visiteurs, 0);</pre>
<p>Voila ... pour finir, on ferme la connexion <img src='http://blog.nicolasnunge.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre name="code" class="php">mysql_close();</pre>
<p>Et vous avez maintenant un joli compteur ! Maintenant vous pouvez bien sûr le compléter en rajoutant des champs dans la base de données, en l'affichant que sur certaines pages, etc...</p>
<p>Vous pouvez <a href="http://fichiers.nicolasnunge.net/tutos/compteur/demo.php" target="_blank">tester le compteur</a> ou en <a href="http://fichiers.nicolasnunge.net/tutos/compteur/source.txt" target="_blank">télécharger la source</a>.</p>
<p>Voila <img src='http://blog.nicolasnunge.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Nico.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nicolasnunge.net/2009/07/16/creer-un-compteur-de-visiteurs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
