Lecture fichier texte, caractères étranges...

Mammouth du PHP | 531 Messages

04 mai 2008, 01:41

Bonsoir

J'ai un étrange problème lorsque je veut mettre à jour un fichier texte, ou plutôt un fichier css, mais je pense que le format n'y ais pour rien :

La mise à jour se fait via un textarea. Dès que je fait un retour charriot, il est bien pris en compte puisque lorsque j'ouvre le fichier pas de problèmes... mais lorsque je le recharge dans le textarea j'obtiens des caractères ressemblant à un carré/rond avec un ? dedans : �

Un peu de code... ? :
if ( $_POST['yo'] )
{
$nouvelles_donnees = $_POST['yo'];
//On ouvre le fichier "mon_fichier.txt" en mode "lecture et écriture"
$file = fopen('../utilisateur/test.css', 'r+');
//On récupère les données dans le fichier
$donnees =  fgets($file,4096);
//On vide le fichier de son contenu
ftruncate($file, 0);
//Et on écrit le nouveau contenu
fwrite($file, $nouvelles_donnees);
//Fermeture du fichier
fclose($file);
}

//On ouvre le fichier "mon_fichier.txt" en mode "lecture seule"
$fd = fopen('../utilisateur/test.css', 'r');
$i=1; // compteur de ligne
// Lorsque nous atteindrons la fin du fichier
// foef($fd) retournera faux
// et la boucle while s'arrêtera
while (!feof($fd)) {
// Il est temps de lire une ligne du fichier
// et en tout cas au maximum 1024 caractères
$ligne = fgets($fd, 1024);
// Si la fin du fichier n'est pas atteinte
// On peut maintenant afficher la ligne
if (!feof($fd)) $donnees .= $ligne;
$i++;
}
// On a fini, on ferme !!
fclose($fd);
?>
<form method="post" action="test.php">
<textarea name="yo"><?php echo  $donnees; ?></textarea>
<input type="submit" value="Enregistrer" />
</form>

Eléphant du PHP | 54 Messages

04 mai 2008, 03:01

Ouai, C'est un problème de caractère Spéciaux.

Malheureusement il se produit très souvent. Il faut que tu t'assure d'utiliser le même "CHARSET" dans ta page et dans ta base de donné. Sinon il se produit un conflit et les caract`re spéciaux s'affiche avec des ? ou des carré. Quelle "Charset" utilise tu?
S'il faut vivre longtemps, vaux mieu le faire avec le sourire.

Mammouth du PHP | 531 Messages

04 mai 2008, 10:31

Salut

Mais la il ya pas du tout de communication avec la base de donnée en fait.
J'enregistre et je lis dans un fichier .css
J'utilise le même charset partout.

Mammouth du PHP | 19672 Messages

04 mai 2008, 11:06

Quel encodage as-tu indiqué dans tes en-tête HTML ? utf-8 ou iso-8859-1 ? Si tu encodes-tout en iso-859-1 et que tu mets un charset utf8, c'est ce que tu vas obtenir. À moins qu'il n'y ait rien d'indiqué dans l'en-tête et que ton navigateur utilise l'utf8 par défaut...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 531 Messages

04 mai 2008, 11:47

Quel encodage as-tu indiqué dans tes en-tête HTML ? utf-8 ou iso-8859-1 ? Si tu encodes-tout en iso-859-1 et que tu mets un charset utf8, c'est ce que tu vas obtenir. À moins qu'il n'y ait rien d'indiqué dans l'en-tête et que ton navigateur utilise l'utf8 par défaut...
Alors le fichier contenant le textarea est de l'iso.
Le fichier dans lequel j'écris n'a pas de charset puisque il est vide ou contient du texte.
Mais le problème ne se passe pas forcément sur les caractères. Des fois tout ce que j'ai écrit est bien là, mais entre mes mots j'ai ces espaces byzar qui apparaissent dans le textarea mais qui ne sont pas présent dans le fichier.
Il n'y a pas un rapport avec les retours à la ligne aussi ? :roll:

Mammouth du PHP | 19672 Messages

04 mai 2008, 12:30

Je me suis livré à quelques tests et en fait il y a plusieurs problèmes :
- le mode choisi pour l'ouverture n'est pas approprié : "w+" est préférable : du coup, plus besoin d'utiliser ftruncate()
- Au lieu de lire ligne par ligne, tu peux lire le fichier complet.
Voici ce que j'ai fait (adapte le chemin vers le fichier au besoin pour tester, début du code)
<?php
// $fichier = '../utilisateur/test.css';
$fichier = './test.css';
$donnees = '';
if (isset($_POST['yo']))
{
    // On vide les statistiques précédentes sur le fichier
    clearstatcache();
    // On récupère la taille du fichier s'il existe
    $iTaille = (file_exists($fichier)) ? filesize($fichier) : 0;
    $nouvelles_donnees = $_POST['yo'];
    // On ouvre le fichier "mon_fichier.txt" en mode "lecture et écriture" : le mode "w+" va vider le contenu avant d'écrire
    $file = fopen($fichier, 'w+');
    // On récupère les données dans le fichier s'il existe (défini plus haut)
    $donnees = ($iTaille > 0) ? fread($file, $iTaille) : '';
    // On écrit le nouveau contenu
    fwrite($file, $nouvelles_donnees);
    //Fermeture du fichier
    fclose($file);
}

//On ouvre le fichier "mon_fichier.txt" en mode "lecture seule"
if(file_exists($fichier))
{
    $fd = fopen($fichier, 'r');
    $i = 1; // compteur de ligne
    // Lorsque nous atteindrons la fin du fichier
    // foef($fd) retournera faux
    // et la boucle while s'arrêtera
    while (!feof($fd))
    {
        // Il est temps de lire une ligne du fichier
        // et en tout cas au maximum 1024 caractères
        $ligne = fgets($fd, 1024);
        // Si la fin du fichier n'est pas atteinte
        // On peut maintenant afficher la ligne
        if (!feof($fd))
        {
            $donnees .= $ligne;
        }
        $i++;
    }
    // On a fini, on ferme !!
    fclose($fd);
}
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
    <title>Ecriture d'un fichier CSS</title>
<?php
if(file_exists($fichier))
{
?>
    <link rel="stylesheet" type="text/css" href="<?php echo($fichier); ?>" />
<?php
}
?>
  </head>
  <body>
    <form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
      <fieldset>
        <textarea name="yo" cols="100" rows="20"><?php echo $donnees; ?></textarea>
        <input type="submit" value="Enregistrer" />
      </fieldset>
    </form>
  </body>
</html>
J'ai adapté les commentaires, vérifie chaque ligne.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 531 Messages

04 mai 2008, 13:43

Ah merci c'est génialement sympa.
En plus avec cette version ou tu test si le fichier existe, on peut facilement rajouter quelques lignes pour créer le fichier s'il n'existe pas.
Merci pour les commentaires sur le code ça aide à comprendre :wink: