francoisch Posté 30 Juin 2009 Posté 30 Juin 2009 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/.htpasswdAuthGroupFile /dev/nullAuthName "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
captain_torche Posté 30 Juin 2009 Posté 30 Juin 2009 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).
Leonick Posté 30 Juin 2009 Posté 30 Juin 2009 si tu veux afficher tout le contenu, il faut l'entourer des balises <pre> et </pre>
jcaron Posté 30 Juin 2009 Posté 30 Juin 2009 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.
francoisch Posté 3 Juillet 2009 Auteur Posté 3 Juillet 2009 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
captain_torche Posté 3 Juillet 2009 Posté 3 Juillet 2009 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".
francoisch Posté 3 Juillet 2009 Auteur Posté 3 Juillet 2009 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
francoisch Posté 5 Juillet 2009 Auteur Posté 5 Juillet 2009 Bonjour Je lis mon fichier texte avec files(), je modifie la ligne qui mintéresse : La ligne : require user francoisDevient : 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
captain_torche Posté 5 Juillet 2009 Posté 5 Juillet 2009 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
francoisch Posté 6 Juillet 2009 Auteur Posté 6 Juillet 2009 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
captain_torche Posté 6 Juillet 2009 Posté 6 Juillet 2009 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.
jcaron Posté 6 Juillet 2009 Posté 6 Juillet 2009 Tu peux aussi utiliser rtrim: http://us2.php.net/manual/en/function.rtrim.php Jacques.
captain_torche Posté 6 Juillet 2009 Posté 6 Juillet 2009 Effectivement, je n'y avais pas pensé. Mais le pire, c'est que j'utilise moi-même trim() à chaque fois que j'utilise file()
francoisch Posté 6 Juillet 2009 Auteur Posté 6 Juillet 2009 (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é 6 Juillet 2009 par francoisch
captain_torche Posté 6 Juillet 2009 Posté 6 Juillet 2009 Tu peux utiliser strpos() pour vérifier qu'une chaîne se trouve bien dans une autre.
francoisch Posté 6 Juillet 2009 Auteur Posté 6 Juillet 2009 Oui, je vais faire ça, merci encore de ton aide Captain. Francois
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant