Page 1 sur 1

Compteur, iteration bizarre

Posté : 21 oct. 2007, 12:18
par FredoMkb
Bonjour à tous :)

Voici mon souci du jour...

Je tente de réaliser un compteur de visites des plus basiques (au fait, il s'agit plutôt d'un compteur de rechargement des pages), qui sauvegarde la valeur du compteur dans un simple fichier texte.

J'ai un souci que je n'arrive pas à résoudre, je m'explique :

Lorsque j'affiche ou recharge la page, pas de problème, le compteur augmente, mais pas de manière "noramale", puisqu'il le fait en ajoutant 2 au lieu de 1 :(

J'ai mis pas mal de "echo" un peu partout pour voir où cette addition empbêttante ce pruduit, mais je n'ai rien trouvé d'anormal, sauf que, en regardant le fichier texte contenant la valeur du compteur, celui-ci contient toujours une valeur additionnée de 2 et non de 1 comme il devrait... bref, je n'y comprends plus rien :(

Voici le bout de code que j'utilise, en espèrant que qulqu'un pourra me dire où est l'erreur, car là je coince grâve :
<?php
// Fonction qui genere et incremente le compteur
function f_compteur($nom, $incr=1) {
	$doc = trim($nom).'.txt'; // Nom du fichier texte
	$nbr = f_lire($doc); // Lecture des donnees memorisees
	$nbr = $incr + $nbr; // Incrementation du compteur
	$ok = f_ecrire($doc, $nbr); // Ecriture de la nouvelle valeur du compteur
	if($ok) { return $nbr; } else { return ''; } // Retourne la nouvelle valeur du compteur ou rien
}
// Fonction pour lire le fichier contenant le compteur
function f_lire($thePath) {
	$theData = ''; // Initialisation
	// Si le fichier existe, alors on lit son contenu et on le concatene pour eviter d'avoir une liste
	if (@file_exists($thePath)) { $theData = @implode("", file($thePath)); }
	return $theData; // Retourne le resultat
}
// Fonction pour ecrire dans le fichier contenant le compteur
function f_ecrire($thePath, $theData) {
	$long = strlen((string)$theData); // Longueur de la chaine pour verification finale
	// Creation ou ouverture du fichier en ecriture seule, son eventuel contenu est efface
	$fileOpen = @fopen($thePath, "wb");
	$res = @fwrite($fileOpen, $theData); // Ecriture des nouvelles valeurs
	@fclose($fileOpen); // Fermeture du fichier
	return ($res == $long); // Comparaison de la longeur des donnees ecrites avec celles fournies
}
?>
J'apelle ce code par un simple "include" et je lance la fonction par un "echo f_compteur('mon_fichier');"...

Donc, au début, le code retourne bien "1", puis, bizarrement, il retourne "3", "5", "7", etc... pourquoi ? :shock:

Merci à tous pour vos lumières :)

Posté : 21 oct. 2007, 12:53
par Truc
A première vue tu y fait appel 2 fois 8-|

essaie sans passer par un include

Posté : 21 oct. 2007, 12:57
par @rthur
Bonjour,

C'est là qu'on apprécie PHP pour ses fonctions "clé-en-main" ;-)
http://fr.php.net/file_get_contents
http://fr.php.net/file_put_contents
<?php
// Fonction qui genere et incremente le compteur
function f_compteur($nom, $incr=1) {
    $doc = trim($nom).'.txt'; // Nom du fichier texte
    $nbr = file_get_contents($doc); // Lecture des donnees memorisees
    $nbr = $incr + $nbr; // Incrementation du compteur
    $ok = file_put_contents($doc, $nbr); // Ecriture de la nouvelle valeur du compteur
    if($ok) { return $nbr; } else { return ''; } // Retourne la nouvelle valeur du compteur ou rien
}
?>
Et je rejoint l'avis de Truc à savoir que ton code semble tout à fait correct.
Vérifie que tu n'as pas deux include() et sinon effectue des tests directement en appelant ta page de compteur et en ajoutant ton echo dedans...

Posté : 21 oct. 2007, 14:33
par AB
Bonjour,

Juste une petite précision pour ceux qui testeraient le code d'@rthur sans se documenter sur la fonction file_put_contents() : C'est là qu'on apprécie PHP 5 pour ses nouvelles fonctions "clé-en-main" :)

Posté : 21 oct. 2007, 15:05
par Invité
Re...

Merci à tous pour vos réponses... :)

J'ai donc essayé sur un simple fichier, et là, ça fonctionne correctement, alors que sur le fichier où je souhaite l'utiliser, me fait toujours ce problème...

Bien-sûr, j'ai regardé s'il y avait deux inclusions, mais non, j'ai même regardé s'il y avait deux appels à la fonction, non plus... c'est vraiment étrange :shock:

D'autant plus bizarre que lorsque je mets des "echo" pour voir l'évolution de la variable "$nbr", rien d'anormal ne se présente, c'est tout bon quoi, mais lorsque je regarde la valeur contenue par le fichier texte contenant le comptuer, celui-ci affiche toujours une valeur supérieure, du coup, ça produit une itération avec un incrément de 2 au lieu de 1...

Bon, je ne sais pas, y'a une cou*** dans le pôtage, mais où :?:

Enfin, je finirais bien par trouver, en attendant, si jamais quelqu'un avait une idée lumineuse, n'hésitez pas...

Merci aux autres propositions, tout-à-fait intéressantes mais comme je dois rester compatible Php 4.x, elles ne s'y prètent pas très bien sur ce coup...

Merci encore... à+ :)

Posté : 21 oct. 2007, 15:05
par Berzemus
Sinon j'ai une fonction file_get_contents qui traine (j'en ais quelques-unes comme ça, pour éviter de me retrouver bête ^-^)
	function file_get_contents($page) {
		if ($handle = fopen ($page, "r")) {
			$contents = fread ($handle, filesize ($page));
			fclose ($handle);
			return $contents;
		} else {
			return FALSE;
		}
		}

Posté : 21 oct. 2007, 15:10
par FredoMkb
Merci Berzemus pour ton code, je vais l'essayer... mais j'ai peur que ça ne change pas le comportement bizarre que j'ai... enfin, on verra...

Désolé pour mon message "invité" précédent, j'ai oublié de me connecter au forum avant de répondre...

Merci à tous :)

Posté : 21 oct. 2007, 15:19
par FredoMkb
Re...

Bon bon, je viens de trouver mon problème, et je dois dire que je trouve ça bien bizarre...

En fait, sur le code des en-têtes de la page il y avait ceci qui traînait :

Code : Tout sélectionner

<script type="text/javascript" src=""></script>
Et oui, en supprimant ce bout de code "inutile", tout vien d'entrer dans l'ordre, c'est à dire que le compteur a retrouvé un comportement normal avec une itération par 1... cooooool :D

Maintenant, pourquoi ce bout de code "anodin" produisait cette erreur, je suis incapable de vous dire, peut-être qu'un spécialiste pourrait donner quelques pistes ou explications... à voir...

Encore merci à tous de votre aide :)

Posté : 21 oct. 2007, 16:25
par Tracker
Le principe de ton compteur, pour fonctionner, doit locker le fichier lors de la LECTURE des infos (flock(...)).
Si tu ne le fais pas, tôt ou tard deux utilisateurs incrémenteront ton compteur en même temps, donc liront la même valeur... et c'est le dernier qui enregistrera qui aura raison ... :-k


Tracker.