Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMPTEUR QUI NE COMPTE PAS LES RELOAD


Information sur la source

Catégorie :Application Niveau : Initié Date de création : 24/06/2002 Date de mise à jour : 24/06/2002 11:20:05 Vu / téléchargé: 4 422 / 257

Note :
Aucune note

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

Description

Bon, je vais reposter, visiblement, le premier est pas passé (aurais-je cliqué un peu violemment...) Donc, ce code source sert à faire un compteur honnête, c'est à dire qui ne recompte pas chaque fois que la personne recharge votre page... C'est moins drôle, mais c'est plus efficace à mon avis pour connaître la vraie fréquentation de son site (et pour moi, c'est loin d'être glorieux)
Le fonctionnement, vu du dehors, est très simple : on l'appelle comme une image, en précisant un identifiant de la page (et oui, avec un seul source, on peut mettre facilement des compteurs sur toutes ses pages :-))
<img src="compte/Bruce_count.php?clef=ma_pag_d'accueil">
La clef, ou l'identifiant de page, doit être une chaine de caractère standard (c'est à dire que je ne sais pas ce que ça fera si vous mettez des epsaces, des caractères bizarres...) Donc, on ne met que des underscores et des lettres latines, ça évite les problèmes.


 

Source

  • <?php
  • // DEFAULT VARIABLES:
  • $digit_dir = "digits"; // répertoire où sont stockées les images des chiffres
  • $log_file = "log.txt"; // fichier de log
  • $compteur = "compte.txt"; //fichier qui contient le compteur à proprement parler.
  • $lasthit = "lasthit.txt"; // sert à ne pas compter deux fois en cas de reload
  • $min_width = 5 ; // Nombre de chiffres à affihcer
  • // les infos que me passent apache pour identifier l'utilisateur
  • //global $HTTP_USER_AGENT;
  • //global $REMOTE_ADDR;
  • //global $HTTP_REFERER;
  • //global $QUERY_STRING;
  • function return_error_png($error_msg) {
  • $img = ImageCreate(strlen($error_msg)*7, 13);
  • $red = ImageColorAllocate($img, 255, 0, 0);
  • $bg = ImageColorAllocate($img, 0, 0, 0);
  • // Create background
  • ImageFilledRectangle($img, 0, 0, strlen($error_msg)*7, 13, $bg);
  • ImageString($img, 3, 0, 0, $error_msg, $red);
  • ImagePNG($img);
  • ImageDestroy($img);
  • return;
  • }
  • function create_counter_png($number) {
  • global $digit_dir, $min_width;
  • $len = strlen(strval($number));
  • if($len > $min_width) $width = $len;
  • else $width = $min_width;
  • if(!file_exists("$digit_dir/0.gif.png")) {
  • return_error_png("No pngs in $digit_dir!");
  • return;
  • }
  • $d0 = ImageCreateFrompng("$digit_dir/0.gif.png");
  • $dx = ImageSX($d0);
  • $dy = ImageSY($d0);
  • $img = ImageCreate($width*$dx, $dy);
  • ImageDestroy($d0);
  • // Now, we must take each digit and represent it
  • $xoff = $width*$dx;
  • while($xoff > 0) {
  • $digit = $number % 10; // This takes the less significant digit of the number
  • $number = $number / 10; // Remove less significant digit
  • $temp = ImageCreateFrompng("$digit_dir/$digit.gif.png"); // Get number representation
  • $xoff = $xoff - $dx;
  • ImageCopyResized($img, $temp, $xoff, 0, 0, 0, $dx, $dy, $dx, $dy);
  • ImageDestroy($temp);
  • }
  • ImagePNG($img);
  • ImageDestroy($img);
  • return;
  • }
  • function lire_compteur ($clef,$compteur) {
  • $compte=0;
  • if (file_exists($compteur)) {
  • $fd=fopen ($compteur,"r");
  • while (! feof($fd)) {
  • if (fscanf ($fd,"%s %d",&$clef_lue,&$valeur) == 2) {
  • if ($clef_lue == $clef) {
  • $compte = $valeur;
  • }
  • }
  • }
  • fclose ($fd);
  • }
  • return $compte;
  • }
  • function sauve_compteur ($clef,$compteur,$compte) {
  • if (file_exists($compteur)) {
  • $f_lis=fopen ($compteur,"r");
  • $f_ecris=fopen($compteur.".temp","w");
  • $trouve = false;
  • while (! feof($f_lis)) {
  • if (fscanf ($f_lis,"%s %d",&$clef_lue,&$valeur) == 2) {
  • if ($clef_lue == $clef) {
  • fwrite($f_ecris,"$clef $compte\n");
  • $trouve = true;
  • } else {
  • fwrite ($f_ecris,"$clef_lue $valeur\n");
  • }
  • }
  • }
  • if ($trouve == false) {
  • fwrite($f_ecris,"$clef $compte\n");
  • }
  • fclose ($f_lis);
  • fclose ($f_ecris);
  • // delete ($compteur);
  • rename ($compteur.".temp",$compteur);
  • } else {
  • $f_ecris=fopen ($compteur,"w");
  • fwrite($f_ecris,"$clef $compte\n");
  • fclose ($f_ecris);
  • }
  • }
  • function get_time_last_connection ($clef,$qui,$fichier) {
  • // printf ("<BR>quand s'est connecté $qui en dernier?<BR>\n");
  • if (!file_exists ($fichier)) {
  • $last_connect = 0;
  • }else {
  • $last_connect = 0;
  • $fd=fopen ($fichier,"r");
  • while (!feof ($fd)) {
  • if (fscanf ($fd,"%s %d",&$adresse,&$heure) == 2) {
  • //printf ("$adresse $heure");
  • if ($qui == $adresse) {
  • $last_connect = $heure;
  • }
  • }
  • }
  • fclose ($fd);
  • }
  • return $last_connect;
  • }
  • function update_connec_info ($fichier,$qui) {
  • $quand = time();
  • if (!file_exists ($fichier)) {
  • $fd=fopen ($fichier,"w");
  • fwrite($fd,"$qui $quand\n");
  • fclose ($fd);
  • } else {
  • $f_lis=fopen ($fichier,"r");
  • $f_ecris=fopen($fichier.".temp","w");
  • $trouve = false;
  • while (! feof($f_lis)) {
  • if (fscanf ($f_lis,"%s %d",&$qui_lu,&$quand_lu) == 2) {
  • if ($qui_lu == $qui) {
  • fwrite($f_ecris,"$qui $quand\n");
  • $trouve = true;
  • } else {
  • fwrite ($f_ecris,"$qui_lu $quand_lu\n");
  • }
  • }
  • }
  • if ($trouve == false) {
  • fwrite($f_ecris,"$qui $quand\n");
  • }
  • fclose ($f_lis);
  • fclose ($f_ecris);
  • rename ($fichier.".temp",$fichier);
  • }
  • return $quand;
  • } //fin de la mise à jour de la dernière connection
  • function compte_connection ($qui,$clef,$fichier_compteur,$fichier_lasthit) {
  • $trigger = 180; //180 s entre deux valeur comptées
  • $nombre=lire_compteur ($clef,$fichier_compteur);
  • $derniere = get_time_last_connection ($clef,$qui,$clef.".".$fichier_lasthit);
  • $now = update_connec_info ($clef.".".$fichier_lasthit,$qui);
  • $nombre+=((($now-$derniere)>$trigger)?1:0);
  • sauve_compteur ($clef,$fichier_compteur,$nombre);
  • // printf ("<BR>derniere connex à $derniere\n<BR>");
  • // print ("nombre de chargements $nombre\n<BR>");
  • create_counter_png($nombre);
  • }
  • Header("Content-type: image/png");
  • if (!isset ($clef)) {
  • return_error_png ("crasse $clef");
  • } else {
  • compte_connection ($REMOTE_ADDR,$clef,$compteur,$lasthit);
  • }
  • ?>
<?php


// DEFAULT VARIABLES:
$digit_dir = "digits"; // répertoire où sont stockées les images des chiffres
$log_file = "log.txt"; // fichier de log
$compteur = "compte.txt"; //fichier qui contient le compteur à proprement parler.
$lasthit = "lasthit.txt"; // sert à ne pas compter deux fois en cas de reload
$min_width = 5 ; // Nombre de chiffres à affihcer

// les infos que me passent apache pour identifier l'utilisateur
//global $HTTP_USER_AGENT;
//global $REMOTE_ADDR;
//global $HTTP_REFERER;
//global $QUERY_STRING;

function return_error_png($error_msg) {

	$img = ImageCreate(strlen($error_msg)*7, 13);
	$red = ImageColorAllocate($img, 255, 0, 0);
	$bg = ImageColorAllocate($img, 0, 0, 0);

	// Create background
	ImageFilledRectangle($img, 0, 0, strlen($error_msg)*7, 13, $bg);
	ImageString($img, 3, 0, 0, $error_msg, $red);

	ImagePNG($img);
	ImageDestroy($img);

	return;
}


function create_counter_png($number) {
	global $digit_dir, $min_width;

	$len = strlen(strval($number));
	if($len > $min_width) $width = $len;
	else $width = $min_width;

	if(!file_exists("$digit_dir/0.gif.png")) {
		return_error_png("No pngs in $digit_dir!");
		return;
	}
	
	

    $d0 = ImageCreateFrompng("$digit_dir/0.gif.png");
    $dx = ImageSX($d0);
    $dy = ImageSY($d0);
    
	$img = ImageCreate($width*$dx, $dy);
	ImageDestroy($d0);
	
	// Now, we must take each digit and represent it

	$xoff = $width*$dx;
	
	
	while($xoff > 0) {
		$digit = $number % 10; // This takes the less significant digit of the number
		$number = $number / 10; // Remove less significant digit
		$temp = ImageCreateFrompng("$digit_dir/$digit.gif.png"); // Get number representation
		$xoff = $xoff - $dx;
		ImageCopyResized($img, $temp, $xoff, 0, 0, 0, $dx, $dy, $dx, $dy);
		ImageDestroy($temp);
	}

	ImagePNG($img);
	ImageDestroy($img);

	return;
}

function lire_compteur ($clef,$compteur) {
	
	$compte=0;
	
	if (file_exists($compteur)) {
		$fd=fopen ($compteur,"r");
		while (! feof($fd)) {
			if (fscanf ($fd,"%s %d",&$clef_lue,&$valeur) == 2) {
				if ($clef_lue == $clef) {
					$compte = $valeur;
				}
			}
		}
		fclose ($fd);
	}	
	return $compte;
}

function sauve_compteur ($clef,$compteur,$compte) {
	
	if (file_exists($compteur)) {
		$f_lis=fopen ($compteur,"r");
		$f_ecris=fopen($compteur.".temp","w");
		$trouve = false;
		
		while (! feof($f_lis)) {
			if (fscanf ($f_lis,"%s %d",&$clef_lue,&$valeur) == 2) {
				if ($clef_lue == $clef) {
					fwrite($f_ecris,"$clef $compte\n");
					$trouve = true;
				} else {
					fwrite ($f_ecris,"$clef_lue $valeur\n");
				}
			}
		}
		if ($trouve == false) {
			fwrite($f_ecris,"$clef $compte\n");
		}
		fclose ($f_lis);
		fclose ($f_ecris);
		// delete ($compteur);
		rename ($compteur.".temp",$compteur);
	} else {
		$f_ecris=fopen ($compteur,"w");
		fwrite($f_ecris,"$clef $compte\n");
		fclose ($f_ecris);
	}
}

function get_time_last_connection ($clef,$qui,$fichier) {
	
	// printf ("<BR>quand s'est connecté $qui en dernier?<BR>\n");
	
	if (!file_exists ($fichier)) {
		$last_connect = 0;
	}else {
	
		$last_connect = 0;
		
		$fd=fopen ($fichier,"r");

		while (!feof ($fd)) {
			if (fscanf ($fd,"%s %d",&$adresse,&$heure) == 2) {
				//printf ("$adresse $heure");
				if ($qui == $adresse) {
					$last_connect = $heure;
				}
			}
		}
		fclose ($fd);
	}
		
	return $last_connect;
}

function update_connec_info ($fichier,$qui) {
	$quand = time();

	if (!file_exists ($fichier)) {
		$fd=fopen ($fichier,"w");
		fwrite($fd,"$qui $quand\n");
		fclose ($fd);
	} else {
		$f_lis=fopen ($fichier,"r");
		$f_ecris=fopen($fichier.".temp","w");
		$trouve = false;
		
		while (! feof($f_lis)) {
			if (fscanf ($f_lis,"%s %d",&$qui_lu,&$quand_lu) == 2) {
				if ($qui_lu == $qui) {
					fwrite($f_ecris,"$qui $quand\n");
					$trouve = true;
				} else {
					fwrite ($f_ecris,"$qui_lu $quand_lu\n");
				}
			}
		}
		if ($trouve == false) {
			fwrite($f_ecris,"$qui $quand\n");
		}
		fclose ($f_lis);
		fclose ($f_ecris);
		rename ($fichier.".temp",$fichier);
	}
	return $quand;
} //fin de la mise à jour de la dernière connection

function compte_connection ($qui,$clef,$fichier_compteur,$fichier_lasthit) {
	$trigger = 180; //180 s entre deux valeur comptées

	$nombre=lire_compteur ($clef,$fichier_compteur);
	$derniere = get_time_last_connection ($clef,$qui,$clef.".".$fichier_lasthit);
	$now = update_connec_info ($clef.".".$fichier_lasthit,$qui);
	$nombre+=((($now-$derniere)>$trigger)?1:0);
	sauve_compteur ($clef,$fichier_compteur,$nombre);
	
	// printf ("<BR>derniere connex à $derniere\n<BR>");
	// print ("nombre de chargements $nombre\n<BR>");
	create_counter_png($nombre);

}


Header("Content-type: image/png");
if (!isset ($clef)) {
	return_error_png ("crasse $clef");
} else {
	compte_connection ($REMOTE_ADDR,$clef,$compteur,$lasthit);
}
?>

Conclusion

Le fonctionnement du script est très simple :  il est appelé comme une image, donc il doit rendre une image (c'est le rôle du header à la fin). Ensuite, il vous identifie par votre ip. Il va voir dans compte combien de fois la page a été chargée, puis il va voir dans le fichier $clef.lasthit.txt à quand remonte votre dernière connexion. Si elle date de plus que $trigger secondes (réglé par défaut à 180), il compte, et dans tous les cas, il met à jour le fihcier lasthit.
Pour marcher, il vous faudra :
* un interpréteur php4 (à cause de la fonction fscan)
* gd d'installé (avec une version qui peut lire les .png - chez Free, ça marche très bien)
* un sous répertoire, précisé ar $digit_dir, qui contient 10 fichiers en .png, de même taille et de nom 0.gif.png =&gt; 9.gif.png (ils sont livrés dans le fichier zip joint)
Pour le moment, pas de bug connu, mais si vous en trouvez, vous avez des questions, vous voulez causer, vous pouvez toujours me contacter par mail à florent.revvelut@free.fr ou aller voir mon site (qui se construit petit à petit) http://florent.revelut.free.Fr
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Romuald le 24/06/2002 17:57:14

Un système un peu plus simple mais sans doute moins puissant que tu peux utiliser est de mettre un cookie "de session"
Du style setcookie("visiteok", "1");

signaler à un administrateur
Commentaire de Bruce314 le 24/06/2002 19:47:53

L'avantage de cette version est :
* d'éviter les cookies inutiles (g des copains qui détestent ça)
* de stocker les ip et les heures de connexion sur ton site... toujours intéressant
Ceci dit, l'avantage du cookie est évident sur la lourdeur de la page... Chacun son choix :-))

signaler à un administrateur
Commentaire de OriOn le 25/06/2002 08:57:39 administrateur CS

à kan un script de stats sur le site ??
J'ai bientôt finit le mien ;-) y me reste plus qu'à terminer ma partie graph.

signaler à un administrateur
Commentaire de Zenith le 09/02/2004 22:06:05

c'est exactement ce que je cherchais, enfin, me reste k'a tester :p mais bon, le concept est malade, je vais etudier le code et essayer de le comprendre :p
merci encor !!!!

signaler à un administrateur
Commentaire de Zenith le 09/02/2004 22:53:22

arf...
peux tu expliquer en detail commen cela fonctionne stp parce que j'y arrive pas ....? merci beaucoup ....

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.