Compteur php/fichier .txt

Nouveau WRInaute
Bonjour, j'aimerais améliorer un compteur php qui fonctionne avec un .txt

Je précise que je n'y connais pratiquement rien en php...Je travaille à partir de quelquechose qu'on m'a fait :)

Comment faire pour demander de changer la variable si elle atteint un certain nombre?
Puis effectuer une autre opération en fonction ce cette variable...

exemple: le fichier .txt affiche 10 et je veux que "lorsque c'est 10 ca repasse à 0".

j'ai le début:

$file=@fopen ( ".txt" "r+" )
fscanf etc...
if ( $chiffre == 10 )

--->mais pas la suite! (comment demander de mettre a 0)


ensuite lorsque la variable est changée ou pas selon sa valeur initiale je lui applique autre chose:

$nb++
rewind etc....
fclose // j'incrémente de 1 et je ferme

if ( $chiffre == 10 )
header ("location:ça")
else header ("location:eek:u ça") //en fonction du résultat j'envoie vers 2 endroits différents.

exit;


-->Est- ce que je dois "ouvrir et fermer" le fichier .txt avant chaque "if" ? ou l'ouvrir avant le 1er "if" et le fermer à la fin?

Merci d'avance et désolé c'est pas très clair :?
N'hésitez pas à me dire si j'ai écrit n'importe quoi!!
 
WRInaute passionné
Tu ouvres ton fichier.
Tu fais tes traitements (lecture, écriture)
Tu le ferme.

Pour ton chiffre remis à zéro, si tu sais écriture le chiffre incrémenté, tu sais écrire 0.

Sinon (pas testé, mais en gros) :
Code:
rewind($file);
if ($chiffre >=  10) {
  fwrite($file,"0");
} else {
  fwrite($file,++$chiffre);
}
 
WRInaute accro
ouvre le fichier, met le contenu dans $chiffre, test si c'est egal a 10 et remet le fichier a 0 si oui.
Code:
<?php

if (!($f=fopen("fichier.txt","r+")))
exit("Impossible d'ouvrir le fichier."); 
if(file_exists($f)) {
    $chiffre = file($f);
    echo $chiffre;
}
$chiffre_nul = 0;
if ( $chiffre == 10 )  fwrite($f, $chiffre_nul);
fclose($f);

?>
 
Nouveau WRInaute
Merci beaucoup pour vos réponses!

Code:
rewind($file);
if ($chiffre ==  10) {
  fwrite($file,"0");

et

Code:
rewind($file);
$chiffre_nul = 0;
if ( $chiffre == 10 )  
  fwrite($f, $chiffre_nul);


marchent tout les deux...

J'ai mis 1 des 2 apres ça:

Code:
if ($count == 10) {
  header("Location:10.html");
} else {
  header("Location:20.html");
}

et
Code:
fclose($file);
exit; 
?>
a la fin


et tout marche très bien.
Encore merci! Je commence à piger le fonctionnement^^

Ps:savez-vous si 1 des 2 codes est meilleur que l'autre et pourquoi?
 
Nouveau WRInaute
Ah?
C'est du à quoi?

Voilà ce que ça donne au final (j'ai décrémenté au lieu d'incrémenter et ça repasse à 5 lorsque le compteur arrive à 0):

Code:
<?php
header("Pragma: no-cache");
$file=@fopen("fichier.txt", "r+");
fscanf($file, "%d", $count);
$count--;
rewind($file);
fputs($file, $count);
rewind($file);
$final=5;
if ($count <= 0) {
 fwrite($file,"$final");
}
rewind($file);
if ($count == 0) {
  header("Location:10.html");
} else {
  header("Location:20.html");
}
fclose($file);
exit; 
?>

Ets-ce que c'est correct?

J'ai l'impression que le changement de 0 à 5 s'effectue avant la redirection...Ou alors au moment de fclose?

fclose risque de ne pas s'exécuter? Est-ce embêtant?

j'en profite pour vous demander ce que veut dire:
Code:
fscanf($file, "%d", $count);

Encore merci!
 
WRInaute accro
%d fonctionne comme un masque et capture selon la valeur du masque. "d" est traité comme un entier donc c'est parfait pour ce que tu veux faire.
Le résultat de cette capture est placé dans la variable $count.

Pour ton code, remplace le dernier rewind($file) (qui ne sert a rien au passage) par fclose($file)
Le fichier doit être fermé avant la redirection sinon il reste ouvert en écriture.

essaye aussi en enlevant tout ces rewind, par defaut ton curseur sera toujours sur le premier élément.. pour moi ils sont inutiles.

Code:
<?php

header("Pragma: no-cache");
$file=@fopen("fichier.txt", "r+");
fscanf($file, "%d", $count);
$count--;
fwrite($file,"$count");
if ($count== 0)  fwrite($file,"5"); 
fclose($file);

if ($count == 0) header("Location:10.html");
else  header("Location:20.html");
exit;

?>
 
Nouveau WRInaute
D'accord.
J'ai dû laisser les 2 premiers rewind sinon ca rajoutait des chiffres a la suite des autres..
J'ai mis fclose avant la redirection.

Les { ne servent à rien: C'est une ancienne écriture?

Ah je viens de remarquer un petit souci: si je décrémente a partir de 10 ca donne 90 !
J'ai lu quelque part une histoire de nombre de caractères à préciser mais je ne retrouve plus la source !
 
WRInaute passionné
Passer un peu de temps à faire de l'agorithmique ça peut aider pas mal hein?; )

Les '{' sont optionnel si tu as qu'une seule instruction à réaliser après une condition. Mais généralement il est préférable de les mettre par souci de lisibilité.
 
WRInaute accro
djon77 a dit:
Ah je viens de remarquer un petit souci: si je décrémente a partir de 10 ca donne 90 !
J'ai lu quelque part une histoire de nombre de caractères à préciser mais je ne retrouve plus la source !

sry, je n'avais pas vu le mode...

enleve les rewind() et change de mode :
fopen("fichier.txt", "w+")

w : réduit la taille du fichier à 0 (ca le vide)

.. en meme temps tu n'auras plus ce probleme de 0 puisque lorsque tu vas decrementer de 10 a 9, tu ne laisseras plus le 0 derriere toi.
 
Nouveau WRInaute
euh....du coup ça redirige a chaque fois vers 10.html.
Code:
<?php
header("Pragma: no-cache");
$file=@fopen("fichier.txt", "w+");
fscanf($file, "%d", $count);
$count--;
fwrite($file,"$count");
if ($count== 0)  fwrite($file,"12");
fclose($file);
if ($count == 0) header("Location:10.html");
else  header("Location:20.html");
exit;
?>

Apparemment ça prend directement $count=0 et re-écrit le fichier à 12.

J'ai fait une erreur ou oublié quelque chose?
 
WRInaute accro
Code:
<?php

if (file_exists($fichier_text))
  {
  if($res = fopen($fichier_text,"r+"))
  {
  while(!feof($res))
  { $result[]= fgets($res,1000000); }
  fclose($res);
  $tab=$result;
  $result=$tab[0];
  }
  }

$result--;

$file = fopen($fichier_text, "w");

if ($result == 0) { fwrite($file,"12"); }
else { fwrite($file,"$result"); }

fclose($file); 

if ($result == 0) header("Location:10.html");
else  header("Location:20.html"); 

?>

j'ai repris un de mes codes pour aller + vite, en theorie ca devrait fonctionner du premier coup!

important: ouvre ton fichier en ecriture -> chmod 777
 
Nouveau WRInaute
Merci c'est parfait! :D

J'avoue que je commençais à désespérer un peu..
Je me doutais que le mode "w" devait s'appliquer uniquement à une partie mais ne m'y connaissant pas j'étais un peu perdu..

Alors quand j'ai lu "chmod 777" j'me suis dit que j'allais abandonner...Mais finalement j'ai compris vaguement le principe.
Par contre en laissant a 644 ça marche (peut-être que chez moi?), faut-il mettre qd même le fichier txt à 777?

En tout cas merci pour toutes ces explications et votre patience, je n'y serais jamais arrivé tout seul!
 
WRInaute accro
Le probleme des fichiers textes est du aux differents serveurs(Linux, Windows...), qui handle les fichiers textes differement. Sur certain serveur, si tu n'ouvres pas, ca plante, sur d'autres c'est l'inverse.

Tu peux ajouter ces 2 lignes de code avant l'ouverture et aprés, encore une fois, tout depend du serveur car pour commencer certain serveurs ne supportent même pas la fonction chmod ci dessous:

Code:
  chmod ($fichier_text, 0777); 
  $f = fopen($fichier_text, "w"); 
  fwrite($f,"blablabla"); 
  fclose($f); 
  chmod ($fichier_text, 0755);
 
WRInaute impliqué
cree un fichier compteur.txt et mettre 0 a l'interieure



<?
$fp = fopen("compteur.txt","r+"); // 1.On ouvre le fichier en lecture/écriture
$nbvisites = fgets($fp,11); // 2.On récupère le nombre dans le fichier
$nbvisites++; // 3.On incrémente le nombre de visites(+1)
fseek($fp,0); // 4.On se place en début de fichier
fputs($fp,$nbvisites); // 5.On écrit dans le fichier le nouveau nb
fclose($fp); // 6.On ferme le fichier
print("$nbvisites visiteurs"); // 7.On affiche le compteur à l'écran
?>
 
Nouveau WRInaute
D'accord, donc a priori s'il n'y pas de problèmes sur mon serveur je peux laisser en 644.

Pour les lignes à rajouter:
Code:
chmod ($fichier_text, o777); (debut et fin)
Ca met le fichier a 777 avant son ouverture puis le passe a 755 après sa fermeture, c'est bien ça?

Je ne vais pas m'en servir si ça marche sans, mais c'est bon à savoir.


Pour "mahdivitche":

Merci mais c'est ce que j'avais en gros au départ (quoique ton code m'ait l'air plus simple).
Mais finalement grâces aux explications que j'ai eues je l'ai fait en décrémentant et j'ai fait revenir à "x" à chaque fois que ca tombe à "0".

merci tout le monde!
 
Discussions similaires
Haut