[PHP] problème d'écriture dans un fichier

problème d'écriture dans un fichier [PHP] - PHP - Programmation

Marsh Posté le 14-05-2007 à 14:57:31    

Salut à tous,
 
J'ai un petit problème...
J'ai créé un site multilingue qui inclus des fichiers de langues selon celle choisi (lang_fr.php, lang_en.php...) et chaque fichier contient des variables PHP.
Jusqu'ici tout va bien.  
J'ai créé un espace administration qui permet à l'admin de modifier les valeurs de ces constantes (pour la traduction par exemple).
Pour cela j'utilise une grosse classe "fichier"...
 
Le code de ma fonction de modification est le suivant :

Code :
  1. function modifier_ligne_numero($num, $val){
  2.  $fichier = fopen($this->chemin, "r+" ); // Ouverture du fichier en lecture/écriture
  3.  $string = "";
  4.  $txt = "";
  5.  $tmp=$this->lit_ligne($num);   // Texte avant
  6.  $delta = $this->compte_nb_caractere($tmp) - $this->compte_nb_caractere($val);
  7.  for ($i = 1; $i<$num; $i++) // On se place directement à la ligne souhaitée
  8.   $string .= fgets($fichier);
  9.  $constante = $this->donne_constante(fgets($fichier));
  10.  $string .= "define (\"" . $constante . "\", \"" . $val . "\" );\n";
  11.  while (!feof($fichier))
  12.   $string .= fgets($fichier);
  13.  fseek($fichier, 0);  // va au début du fichier
  14.  fputs($fichier, $string);
  15.  if ($delta > 0){
  16.   for ($i=0; $i<=$delta+1; $i++)
  17.    fputs($fichier, "" );
  18.  }
  19.  fclose($fichier);
  20. }


 
Lorsque l'on remplace la valeur d'une constante par une autre plus importante => pas de problèmes
Par contre si ce que l'on remplace contient moins de caractères, à la fin de mon fichier, il y a les anciens caractères (qui ne s'effacent pas)... :(
Pour éviter cela, je rajoute des espaces à la fin de mon fichier.
 
Le fichier PHP pose alors problème, mon index (qui inclut les fichiers langues) n'aime pas trop les espaces :
 

Code :
  1. Warning: Cannot modify header information - headers already sent by (output started at ***\LANGUES\lang_fr.php:115) in ***\index.php on line 22
  2. ...


 
 
Aidez-moi svp...


---------------
Achats-Ventes -- feedback
Reply

Marsh Posté le 14-05-2007 à 14:57:31   

Reply

Marsh Posté le 14-05-2007 à 16:26:56    

Je vois deux solutions :
- ne ferme pas la balise php (?> ) à la fin de ton fichier.
- utilise un algo qui consiste à lire le fichier, faire les modifications en mémoire, et le réécrire entièrement.


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 14-05-2007 à 18:58:48    

Si j'ai bien compris ton code, tu lis le fichier en entier, une fois que tu l'as lu, tu le modifie. Puis tu te remets en début de fichier pour écraser ce qui était écrit sans faire gaffe au texte qui pouvait y avoir avant.
 
Solution 1 : Fermer le fichier pour le rouvrir en mode "remplacement par un fichier vide" (mode W+ de mémoire) Vu que tu te fiches de son contenu précédant, autant repartir sur un fichier vide. :)
 
Solution 2 : utiliser file_get_contents et file_put_contents qui te permettront de lire le fichier en une fois sans boucle et de le réécrire en une fois sans avoir à te soucier de son contenu précédant.

Reply

Marsh Posté le 15-05-2007 à 10:44:04    

Merci beaucoup de vos réponses, je ne connaissait pas le mode "w+" : c'est super pratique !!
Ça marche niquel, merci encore.
 
Je vous donne le bout de code qui marche :
 

Code :
  1. function modifier_ligne_numero($num, $val){
  2.  $fichier = fopen($this->chemin, "r" ); // Ouverture du fichier en lecture/écriture
  3.  $string = "";
  4.  $txt = "";
  5.  $tmp=$this->lit_ligne($num);   // Texte avant
  6.  for ($i = 1; $i<$num; $i++) // On se place directement à la ligne souhaitée
  7.   $string .= fgets($fichier);
  8.  $constante = $this->donne_constante(fgets($fichier));
  9.  $string .= "define (\"" . $constante . "\", \"" . $val . "\" );\n";
  10.  while (!feof($fichier))
  11.   $string .= fgets($fichier);
  12.  fclose($fichier);
  13.         // Ce qui change :
  14.  $fichier = fopen($this->chemin, "w+" );
  15.  fputs($fichier, $string);
  16.                 fclose($fichier);
  17.         //-------------
  18. }


Message édité par yoleouf le 15-05-2007 à 10:53:14

---------------
Achats-Ventes -- feedback
Reply

Marsh Posté le 15-05-2007 à 18:43:22    

Merci t trop sympa !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed