Aller au contenu

Lire un fichier texte en Php


Sujets conseillés

Posté

Bonjour

Je débute dans ce sujet de lecture / écriture dun fichier texte en Php.

Jai ce fichier :

AuthUserFile /homez.110/fctest/www/esp1/ferme/.htpasswd
AuthGroupFile /dev/null
AuthName "Accès à esp1"
AuthType Basic
<Limit GET POST>
require user xxx
</Limit>

Avec ce code de test :

$handle = _AT_fopen($fichier, "r+");
if ($handle)
{
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
echo $buffer."<br>";
}
fclose($handle);
}

à la lecture, jaffiche :

ArrayserFile /homez.110/fctest/www/esp1/ferme/.htpasswd 
AuthGroupFile /dev/null
AuthName "Accès à esp1"
AuthType Basic

require user xxx

Première question : comment se fait-il que je ne lise les deux lignes avec <Limit> ?

Ensuite, comment prendre en compte les données lues ?

Jai essayé :

$buffer[3]

pour lire, puis modifier, une ligne à la fois mais sans succès.

Merci par avance de votre aide tolérante.

Francois

Posté

Pourquoi les balises <limit> ne s'affichent pas ? C'est tout simple : elles ne sont pas interprétées par ton navigateur.

Ces balises sont formées comme des balises HTML, mais ton navigateur ne les reconnaît pas : il ne les affiche donc pas. Mais rassure-toi, elles sont bien là : regarde le code source de ta page ;)

Quant à lire le contenu d'un fichier, ligne par ligne, j'utiliserais la fonction file(), qui me semble toute indiquée.

Il te suffira de modifier chaque ligne du tableau obtenu à ta convenance, puis il faudra écraser le contenu de l'ancien fichier par celui généré par tes modifications (prends soin d'en faire une sauvegarde, une bourde est vite arrivée).

Posté

Et profitons-en pour rappeler que le <Limit GET POST> vient d'un exemple mal choisi de la doc Apache, il convient de les éviter, ils signifient que les directives dans ce bloc ne s'appliquent qu'aux requête GET ou POST (et donc pas au HEAD par exemple).

Jacques.

Posté

bonjour et merci de vos réponses.

Pour lire, j'avais commencé avec file() qui fonctionne très facilement.

Simplement, ensuite, je n'avais pas trouvé le moyen d'écrire après modification.

Captain, quand tu parles d'écraser, pourrais tu détailler un peu que je voie comment m'y prendre?

Merci encore.

Francois

Posté

Tu peux imaginer quelque chose du genre (pas testé, mais fonctionnel si je ne me suis pas planté) :

<?php
$fichier = 'mon_fichier';
$tab_contenu = file($fichier);

$flux = fopen($fichier, 'w+');
foreach($tab_contenu as $ligne) {
fwrite($flux, $ligne);
}
fclose($flux);
?>

Attention : le paramètre 'w+' pour la commande fopen, réduira la taille du fichier à 0 (ça videra le fichier). Très pratique pour réécrire son contenu, très dangereux si on n'a pas fait de sauvegarde du fichier avant.

Il faut également savoir que chaque ligne de ton tableau $tab_contenu contiendra un retour chariot à la fin. Si jamais tu rajoutes des lignes, n'oublie pas de les finir par un retour chariot "\r\n".

Posté

Grand merci Captain de ta réponse.

Ce sujet est mon principal sujet actuellement.

Ta réponse correspond exactement à ma question; je vais l'exploiter avec intérêt.

Merci encore.

Francois

Posté

Bonjour

Je lis mon fichier texte avec files(), je modifie la ligne qui mintéresse :

La ligne : require user francois
Devient : require user francois cccccccccccc

ce que je vérifie en mettant des Echo, mais, quand je lécris, en utilisant le code de Captain (merci), dans le fichier sur le site, cette ligne devient :

require user francois
cccccccccccc

et je narrive pas à la faire tenir en une seule ligne.

Merci par avance de vos conseils à un débutant en fichiers texte.

Francois

Posté

J'imagine que tu ajoutes le texte à la ligne de ton tableau sans manipulation supplémentaire.

Comme je te l'ai dit, chaque ligne se finit par un retour chariot. Si tu veux ajouter quelque chose AVANT le retour chariot, tu as deux solutions :

- Réécrire la totalité de la ligne

- Supprimer le retour chariot à la fin de la ligne avant de la compléter

Dans les deux cas, n'oublie pas d'ajouter le retour ligne à la fin ;)

Posté

bonjour Captain

En résumant : je lis chaque ligne du fichier avec files(), je rallonge la ligne qui convient avec la valeur de la variable $id, jécris chaque ligne en utilisant ton code ; ça donne ça :

$lines = file($fichier); foreach ($lines as $line_num => $line) 
{echo 'Ligne No <strong>' . $line_num . '</strong> :'. $line . '<br />'."\n"; }
if ($choix == "ajout")
{
$lines[5] = $lines[5]." ".$id."\r\n";
// ecriture du fichier modifié
$flux = fopen($fichier, 'w+');
foreach($lines as $ligne) { fwrite($flux, $ligne);}
fclose($flux);
}

De toute évidence, jai raté qqechose.

Merci par avance de ton aide.

Francois

Posté

Tu penses bien à ajouter le retour chariot, t'as déjà fait la moitié du boulot ;)

Il suffit juste de supprimer le retour chariot déjà existant dans la ligne, ça peut donner quelque chose comme ça :

$lines[5] = str_replace("\r\n", '', $lines[5])." ".$id."\r\n";

Attention toutefois : dans ton exemple, tu modifies la ligne 5 uniquement, sans vérifier son contenu. Dans l'idéal, il faudrait déterminer de manière dynamique quelles sont les lignes à éditer.

Posté (modifié)

Merci de vos réponses.

Oui, je n'avais simplement pas pensé qu'il avait un retour à la ligne qui trainait là; ma modification de ligne se ferait alors avec:

$lines[5] = rtrim($lines[5])." ".$id."\r\n";

puisque rtrim() supprime tout seul /n, /t et d'autres.

Pour le choix de la ligne, dans ce fichier du moins, je n'ai pas de problème, c'est tjs cette ligne là.

Sinon, pour un autre fichier, je vais devoir identifier la bonne ligne en cherchant un string de caractères, genre tototo; quelle serait la bonne méthode pour identifier cette ligne, à votre avis?

Merci encore.

Francois

Modifié par francoisch

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...