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

cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011 - 2 nov. 2011 à 15:45
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.

17 réponses

Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 15:34
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^^
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 15:53
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. ;)
0
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 16:10
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 ?
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 16:12
En gros "impossible d'ouvrir le fichier, qu'il n'existe pas"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 16:35
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);
}	
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 16:43
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);
}
0
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 16:49
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 ?
0
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 16:51
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);
}		
0
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 16:53
oups j'ai oublier la ligne $date=date("d/m/Y",filemtime("$dossier/log.txt")); avant le if
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 17:00
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?
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 17:02
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);	
}
0
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 17:04
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);	
}				
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 17:14
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?
0
Zut13 Messages postés 50 Date d'inscription dimanche 6 mai 2007 Statut Membre Dernière intervention 14 novembre 2011
4 nov. 2011 à 17:17
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
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 17:23
ok. :)
Je te dis demain ce que ça a donné.
Merci encore. ;)
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
4 nov. 2011 à 18:03
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)?
0
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 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. :)
0
Rejoignez-nous