Ecrire, effacer et réécrire dans un fichier txt

Signaler
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
-
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
-
Bonjour,

J'ai récupéré un script de compteur en php il y a quelques jours que j'ai déjà pas mal modifié, avec beaucoup de mal, pour qu'il s'adapte à mes besoins.
J'ai très peu de connaissance en php et j'essaie de me débrouiller en cherchant par moi même mais là je bloque vraiment sur un point.
J'aimerais donc avoir l'avis de plus experts que moi.
Ce script n'utilise pas de bdd et écrit des stats dans un fichier txt.
Hors, au fil des jours, ce fichier devient forcement de plus en plus lourd, aussi j'aimerais qu'il se vide chaque jour (j'y ai un accès exclusif et n'ai pas besoin de conserver les données d'un jour à l'autre).
J'ignore si ce que j'ai fait est correct et peut fonctionner.
Voici la partie de mon code:

//cette partie fonctionne - on écrit les données à la suite tout au long de la journée//

if ($dejala != 1) { 
$count=$count+1;
$dh=fopen("$dossier/log.txt","a");
$log=date("d/m/y - H\:i")." -||- IP : ".$ip." 
Provenance : ".$userreferer."
Infos : ".$useragent."
<hr>\r\n";
fputs($dh,$log);
fclose($dh);
}
//là où je bloque - si la date des dernières modifs du fichier (dans ma logique, la veille) est différente de celle d'aujourd'hui ($now), on vide le fichier et on replace le pointeur au début pour reprendre les enregistrements notés ci-dessus//

$now=date("d/m/y",filemtime("$dossier/log.txt"));	
if (date("d/m/y") != $now) { 
  $dh=fopen("$dossier/log.txt", "w+");
  ftruncate($dh,0); 
  fclose($dh);	
}


D'après vous est ce que c'est correct?
Si ce n'est pas le cas, comment dois je faire?

J'ai essayé en le supprimant et en le recréant unlink("$dossier/log.txt");
$dh=fopen("$dossier/log.txt","w");
fclose($dh);
Mais j'obtiens un message d'erreur sur la page stats avant que le fichier ne soit recréé.
Je vous remercie d'avance pour vos réponses.

17 réponses

Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

Et pourquoi pas :

<?php
unlink("fichier.txt");
touch('fichier.txt');
?>	


Y a surement plus propre à faire mais déjà c'est un bon début^^
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Bonjour Zut13,

Je te remercie pour ta réponse.
Je ne connaissais pas la fonction touch("")
Je viens donc de chercher pour m'informer et il semblerait (je me trompe peut-être) que ce soit l'équivalent de fopen("","w") non?
Hors j'ai essayé (comme dit dans mon précédent message) et ça ne fonctionne pas immédiatement.
J'obtiens un message d'erreur avant que le fichier ne soit créer, lorsque je recharge la page, tout semble rentrer dans l'ordre, le message d'erreur disparait.

J'ai quand même testé la fonction que je proposais en ignorant si c'était correct et ça semble avoir fonctionné.
Le fichier a bien été vidé, n'ai pas eu de message d'erreur et le script a bien réécrit dedans.

Après je ne sais pas si c'est la meilleure solution, je vais donc tout de même attendre si d'autre réponse se présentent avant de mettre en ligne au public. ;)
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

Oui c'est à peut près la même chose que fopen.
Par contre je n'ai pas eu de message d'erreur quand j'ai testé en local bizarre...
Quel est le message que tu a eu ?
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

En gros "impossible d'ouvrir le fichier, qu'il n'existe pas"
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

je viens d'essayer ftruncate($fichier,0); et ça marche bien.
Rajoute donc:

$date = date ("d-m-Y", filemtime($dossier.'/log.txt'));
if($date != date("d-m-Y")){
ftruncate($dh,0);
}	
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Je remplace mon code:
$now=date("d/m/y",filemtime("$dossier/log.txt"));	
if (date("d/m/y") != $now) { 
  $dh=fopen("$dossier/log.txt", "w+");
  ftruncate($dh,0); 
  fclose($dh);	
}

Par le tien?:
$date=date("d/m/Y",filemtime("$dossier/log.txt"));
if($date != date("d/m/Y")){
$dh=fopen("$dossier/log.txt", "w+");
  ftruncate($dh,0); 
  fclose($dh);
}
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

ba le tient à l'air d'être correct aussi sauf que le $dh=fopen("$dossier/log.txt", "w+"); tu le met pas dans le if mais avant, c'est juste que si la date change ça le vide mais dans tout les cas tu ouvre ton fichier donc qu'un seul fopen.
Donc en faite à la base ton code est bon, il fonctionnait non ?
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

tient ton if complet ta juste à le mettre à la place :

if ($dejala != 1) { 
$count=$count+1;
$dh=fopen("$dossier/log.txt","w+");
if($date != date("d-m-Y")){
ftruncate($dh,0);
}
$log=date("d/m/y - H\:i")." -||- IP : ".$ip." 
Provenance : ".$userreferer."
Infos : ".$useragent."
<hr>\r\n";
fputs($dh,$log);
fclose($dh);
}		
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

oups j'ai oublier la ligne $date=date("d/m/Y",filemtime("$dossier/log.txt")); avant le if
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Oui mais j'ouvrais le fichier en "a" et non en "w" pour remplir le log, c'est seulement après le tronquage que je l'ouvrait en "w".
Là, en l'ouvrant une seule fois en "w", comme tu me l'indiques, lorsque le log se remplira tout au long de la journée, ça écrasera toutes les anciennes données de la journée non?
Est ce que je peux écrire ton code en ouvrant le fichier en "a" comme je le faisais précédemment?
Est ce que ça fonctionnera comme je le souhaite?
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Voila comme se présente mon code actuellement:

if ($dejala != 1) { 
$count=$count+1;
$dh=fopen("$dossier/log.txt","a");
$log=date("d/m/y - H\:i")." -||- IP : ".$ip." 
Provenance : ".$userreferer."
Infos : ".$useragent."
<hr>\r\n";
fputs($dh,$log);
fclose($dh);
}
$now=date("d/m/y",filemtime("$dossier/log.txt"));	
if (date("d/m/y") != $now) { 
  $dh=fopen("$dossier/log.txt", "w+");
  ftruncate($dh,0); 
  fclose($dh);	
}
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

ha oui, comme ça alors ?

if ($dejala != 1) {
$date = date ("d-m-Y", filemtime($dossier.'/log.txt'));
if($date == date("d-m-Y")){

$count=$count+1;
$dh=fopen("$dossier/log.txt","a");
$log=date("d/m/y - H\:i")." -||- IP : ".$ip." 
Provenance : ".$userreferer."
Infos : ".$useragent."
<hr>\r\n";
fputs($dh,$log);
fclose($dh);

}
else{
  $dh=fopen("$dossier/log.txt", "w+");
  ftruncate($dh,0); 
  fclose($dh);	
}				
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Ok, ça donnera le même résultat?
Je vais changer mon code par le tien et, comme je ne sais pas tester en local, je verrais demain si ça fonctionne correctement.

Juste pour savoir, quelle est la différence entre : date("d/m/y", //ce que moi j'ai écris et : date("d-m-Y", //ce que toi tu as écris?
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011

aucune c'est juste que ça affiche 04/11/2011 ou 04-11-2011 faut juste qu'elles soit écrites pareil aux même endroit donc si tu prend d/m/Y tu met pareil partout
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

ok. :)
Je te dis demain ce que ça a donné.
Merci encore. ;)
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Il me semble qu'il manque une accolade de fermeture dans ton code ...
Où dois je la mettre?
Après la première ou dernière fermeture du fichier (fclose)?
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011

Bonjour Zut13,

Ton code fonctionne parfaitement, je te remercie grandement. (j'ai placé l'accolade de fermeture après la dernière fermeture de fichier, tout à la fin de ton code, je suppose que c'était correct(?))

Puis je profiter de ta gentillesse pour te demander si tu aurais une idée de comment faire pour loguer également les retours visiteurs sans les comptabiliser?
Actuellement je ne comptabilise que les nouveaux visiteurs (par ip) et le log va avec forcement.
Sans comptabiliser les retours pour n'avoir sur le compteur que les visiteurs uniques (comme actuellement) j'aimerais tout de même les loguer.

J'ai essayé en ajoutant:
if ($dejala = 1) { $back="Retour"}
if ($dejala != 1) {
... le reste du code de ton précédent message ...
et en ajoutant la variable $back dans le log pour les repérer mais ça ne fonctionne pas.

La partie du code concerne (je pense) se présente ainsi:

$comptlive=0;
$dir = "$dossier";
if ($dh = opendir($dir)){ 
while (($file = readdir($dh)) !== false){ 
if (substr_count($file,".")==3){
if ($ip == $file) {$dejala=1;}
if (date("U") - (date("U",filectime("$dossier/$file"))) < 700) {$comptlive++;}
if (date("U") - (date("U",filectime("$dossier/$file"))) > 86400){unlink("$dossier/$file");}
  }
} 
closedir($dh);
}
$dh=fopen("$dossier/$ip","w");
fclose($dh);

$fichier=file("$dossier/compt");
$count=trim($fichier[0]);
$click=trim($fichier[1]);
$click=$click+1;
if ($dejala != 1) {
$count=$count+1; $comptlive++;
$date = date ("d/m/Y", filemtime("$dossier/log.txt"));
if($date == date("d/m/Y")){
$dh=fopen("$dossier/log.txt","a");
$log=date("d/m/y - H\:i")." -||- IP : ".$ip." 
Provenance : ".$userreferer."
Infos : ".$useragent."
<hr>\r\n";
fputs($dh,$log);
fclose($dh);
}
else{
  $dh=fopen("$dossier/log.txt", "w+");
  ftruncate($dh,0); 
  fclose($dh);	
 }
}


Merci d'avance pour ta disponbilité et ton aide. :)