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

Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
- - Dernière réponse : cs_Chris31000
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
- 5 nov. 2011 à 11:36
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.
Afficher la suite 

17 réponses

Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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^^
Commenter la réponse de Zut13
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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. ;)
Commenter la réponse de cs_Chris31000
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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 ?
Commenter la réponse de Zut13
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
En gros "impossible d'ouvrir le fichier, qu'il n'existe pas"
Commenter la réponse de cs_Chris31000
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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);
}	
Commenter la réponse de Zut13
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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);
}
Commenter la réponse de cs_Chris31000
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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 ?
Commenter la réponse de Zut13
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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);
}		
Commenter la réponse de Zut13
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
oups j'ai oublier la ligne $date=date("d/m/Y",filemtime("$dossier/log.txt")); avant le if
Commenter la réponse de Zut13
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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?
Commenter la réponse de cs_Chris31000
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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);	
}
Commenter la réponse de cs_Chris31000
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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);	
}				
Commenter la réponse de Zut13
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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?
Commenter la réponse de cs_Chris31000
Messages postés
50
Date d'inscription
dimanche 6 mai 2007
Statut
Membre
Dernière intervention
14 novembre 2011
0
Merci
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
Commenter la réponse de Zut13
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
ok. :)
Je te dis demain ce que ça a donné.
Merci encore. ;)
Commenter la réponse de cs_Chris31000
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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)?
Commenter la réponse de cs_Chris31000
Messages postés
36
Date d'inscription
lundi 29 mars 2010
Statut
Membre
Dernière intervention
5 novembre 2011
0
Merci
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. :)
Commenter la réponse de cs_Chris31000