Compteur, iteration bizarre

Eléphant du PHP | 224 Messages

21 oct. 2007, 12:18

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 :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

21 oct. 2007, 12:53

A première vue tu y fait appel 2 fois 8-|

essaie sans passer par un include

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

21 oct. 2007, 12:57

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...
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
AB
ViPHP | 5818 Messages

21 oct. 2007, 14:33

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" :)

Invité
Invité n'ayant pas de compte PHPfrance

21 oct. 2007, 15:05

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... à+ :)

ViPHP
ViPHP | 4039 Messages

21 oct. 2007, 15:05

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;
		}
		}
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 224 Messages

21 oct. 2007, 15:10

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 :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Eléphant du PHP | 224 Messages

21 oct. 2007, 15:19

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 :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Eléphant du PHP | 443 Messages

21 oct. 2007, 16:25

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.