Gribouille26 Posté 23 Novembre 2004 Posté 23 Novembre 2004 Bonjour, J'ai un nouveau pb avec mon blog!! J'ai un script ph qui lit et retranscrit sur la page le contenu d'un fichier texte. Le pb est que si ce fichier texte est vide, j'ai un message d'erreur sur la page car le script ne peut pas lire du vide... J'ai donc essayé de faire une boucle conditionnelle (ou un truc du genre) pour qu'il affiche un message si le fichier est vide. Mais comme je ne suis pas encore très douée en php, j'ai du faire des erreurs de syntaxe ou je sais pas quoi.... Voici mon code: if ($file =="") {echo "pas de commentaire"; } else { $session = fopen( $file, "r"); $contenu = fread( $session,filesize($file)); fclose ( $session ); echo $contenu; } et le message d'erreur:Warning: fread(): Length parameter must be greater than 0. in ce fichier à la ligne violette Merci
Dash Posté 23 Novembre 2004 Posté 23 Novembre 2004 a essayer : if ($file =="") {echo "pas de commentaire"; } else { $session = fopen( $file, "r"); $contenu=''; if ($session) //lecture ok { $fsize = filesize($file); $contenu = $fsize > 0 ? fread( $session, $fsize) : ''; fclose ( $session ); } echo $contenu; }
Gribouille26 Posté 23 Novembre 2004 Auteur Posté 23 Novembre 2004 Plus de message d'erreur! Mais le message ne s'affiche pas...
Titag Posté 23 Novembre 2004 Posté 23 Novembre 2004 (modifié) Tu peux aussi essayer : if ($file != "") { if ($session = fopen($file, "r") { while ($ligne = fgets($session, 2048)) { // Ce que tu veux avec un traitement par ligne } }} Modifié 23 Novembre 2004 par Titag
Gribouille26 Posté 23 Novembre 2004 Auteur Posté 23 Novembre 2004 Je comprend rien à vos codes. Vous pourriez les expliquer...svp? Ou corriger le mien...
Gribouille26 Posté 23 Novembre 2004 Auteur Posté 23 Novembre 2004 J'ai trouvé!! En fait, il fallait mettre $contenu ==""
Titag Posté 23 Novembre 2004 Posté 23 Novembre 2004 Voici le code que je t'ai donné avec un peu plus de commentaires : if ($file != "") { // Si le nom du fichier à ouvrir n'est pas vide if ($session = fopen($file, "r") { // Si l'ouverture du fichier est réussie while ($ligne = fgets($session, 2048)) { // On parcours chaque ligne du fichier // Ce que tu veux avec un traitement par ligne } }} Voili
Gribouille26 Posté 23 Novembre 2004 Auteur Posté 23 Novembre 2004 Merci, c'est beaucoup plus clair!! Juste une question: Que signifie le 2048?
Titag Posté 23 Novembre 2004 Posté 23 Novembre 2004 C'est une longueur choisie quasi-arbitrairement fgets() lit une ligne sur la longeur spécifiée. Pour être quasi certain de lire toute la ligne on donne souvent une longeur de 2048 octets (ou 1024 ca dépend) En général les lignes sont beaucoup moins longues que ca Si tu veux des précisions : Voir ici
Gribouille26 Posté 23 Novembre 2004 Auteur Posté 23 Novembre 2004 D'accord. Merci beaucoup pour les explications!!
Anonymus Posté 23 Novembre 2004 Posté 23 Novembre 2004 Bonjour, en fait, quand je ne connait pas la longueur de la ligne, je met 4096. Si je la connais, je mets la longueur exacte. Ca permet de gagner du temps. Si tu mets 1, et que tu demandes à renvoyer le contenu de la ligne, alors il ne va te renvoyer que le premier caractère.
Gribouille26 Posté 24 Novembre 2004 Auteur Posté 24 Novembre 2004 Au secours!!! En fait, ma methode ne marche pas bien!! Le message si pas de message marche bien, mais s'il y a un message, il ne l'affiche pas et reste avec le message disant qu'il n'y a pas de message.... Euh.. en gros, les messages ne s'affichent pas! Voilà mon code, si vous pouviez m'aider à le corriger, juste pour savoir où se trouve l'erreur... if ($contenu =="") {echo "Ecrivez le premier commentaire!";}else {$session = fopen( $file, "r");$contenu = fread( $session,filesize($file));fclose ( $session );echo $contenu;} Sinon, je vais essayer la méthode précedente, qui est plus courte, mais qui ne m'affiche pas de message si le fichier texte est vide ... Merci de votre aide!!
Gribouille26 Posté 24 Novembre 2004 Auteur Posté 24 Novembre 2004 Avec la méthode de Titag, j'ai: Parse error: parse error, unexpected '{' in /var/www/free.fr/0/7/gribouille26/blog/id01.php on line 45 sur cette ligne donc: if ($session = fopen($file, 'r') { // Si l'ouverture du fichier est réussie Si j'enlève la { il me dit que c'est le WHILE qui pose pb!!! De plus, il manque la ligne pour fermer la session.... Avec ma méthode, j'ai beau faire, il ne m'affiche pas le fichier texte....
Gribouille26 Posté 24 Novembre 2004 Auteur Posté 24 Novembre 2004 J'ai pondu un petit truc avec le code de Titag: <?php$session = fopen($file,"r");if (!$session) die("Impossible d'ouvrir le fichier"); // au cas ou le fichier existe paswhile (!feof($session)) {$ligne = fgets($session, 1024); // On parcours chaque ligne du fichierif (!feof($session)) echo "$ligne<br>"; // ecrit les lignes par lignes}fclose($session);?> Ca m'affiche bien les messages, mais pas de message si le fichier est vide... J'ai essayé comme ça: $session = _AT_fopen($file,"r");$contenu = fread( $session,filesize($file));if (!$contenu) die("pas message");while (!feof($session)) {$ligne = fgets($session, 1024);if (!feof($session)) echo "$ligne<br>";}fclose($session); Mais ça ne m'affiche plus le contenu du fichier texte!!
Anonymus Posté 24 Novembre 2004 Posté 24 Novembre 2004 $session = fopen($file,"r");if (!$session) die("Impossible d'ouvrir le fichier"); // au cas ou le fichier existe pas Ceci n'est pas bon. En effet, en fonction du register_globals, la variable $session est toujours définie, puisque tu fais appel à elle. Même si le premier test échoue. Or là, tu testes si elle n'est pas définie. De plus , il serait bien de ne pas confondre les sessions avec les pointeurs de fichier. Là, tu cherches un identifiant de ressources. Tu pourrais mélanger les 2 dans un programme assez long. if (!$contenu) die("pas message"); même problème que précédemment. $contenu sera toujours défini. De plus, tu as ouvert le fichier, il est bon de le fermer. Or, en executant un die(), tu échappes le fclose de fin de programme. $contenu = fread( $session,filesize($file));if (!$contenu) die("pas message");while (!feof($session)) { Là, tu commences par prendre le contenu du fichier, et ainsi tu places ton curseur à la fin du fichier. Puis, tu demandes à avoir le contenu jusqu'à la fin.. Or tu te trouves déjà à la fin du fichier. Oublies fread, travailles avec fgets. Anonymus.
Gribouille26 Posté 24 Novembre 2004 Auteur Posté 24 Novembre 2004 $session = fopen($file,"r");if (!$session) die("Impossible d'ouvrir le fichier"); // au cas ou le fichier existe pas Ceci n'est pas bon. En effet, en fonction du register_globals, la variable $session est toujours définie, puisque tu fais appel à elle. Même si le premier test échoue. Or là, tu testes si elle n'est pas définie. <{POST_SNAPBACK}> Pourtant, cette partie marche. Si je ne met pas de fichier .txt, j'ai bien ce message... if (!$contenu) die("pas message"); même problème que précédemment. $contenu sera toujours défini. <{POST_SNAPBACK}> Et si mon fichier .txt est vide? $contenu = fread( $session,filesize($file));if (!$contenu) die("pas message");while (!feof($session)) { Là, tu commences par prendre le contenu du fichier, et ainsi tu places ton curseur à la fin du fichier. Puis, tu demandes à avoir le contenu jusqu'à la fin.. Or tu te trouves déjà à la fin du fichier. <{POST_SNAPBACK}> Oh... Oublies fread, travailles avec fgets. <{POST_SNAPBACK}> C'était pour savoir si le fichier est vide... Je suis un peu perdue... En plus, j'ai dérivée entre temps pour arriver à ça: $session = _AT_fopen($file,"r");while (!feof($session)) {$ligne = fgets($session, 1024);if (!feof($session)) echo "$ligne<br>";}else {echo "pas messages";}fclose($session); Avec lequel j'ai bien les messages, mais toujours "pas messages"... C'est pas facile!!
Dash Posté 24 Novembre 2004 Posté 24 Novembre 2004 (modifié) resumons : <?php$file = './mon_fichier.txt'; //nom du fichier a traiter $contenu = ''; if ( !empty($file) ) { $fp = _AT_fopen($file, 'r'); //pointeur sur fichier if ($fp) //fichier accessible en lecture { // 1ere methode : une seule lecture $fsize = filesize($file); //taille du fichier $contenu = $fsize > 0 ? fread($fp, $fsize) : ''; /* // 2e methode (equivalente): lecture par morceaux (ici, par exemple, 2048 octets) while ($buffer = fgets($fp, 2048)) $contenu .= $buffer; // la longueur par defaut est de 1 ko ou 1024 octets // => fgets($fp) correspond a fgets($fp, 1024); // note: la concatenation de chaines volumineuses est deconseillee (->$contenu) */ fclose ($fp); } else { // fichier inaccessible en lecture } } if ( empty($contenu) ) { echo "pas de commentaire"; } else { echo $contenu; } ?> Il existe d'autres methodes equivalentes. En voici une qui a le merite d'etre tres simple (!) a mettre en oeuvre ici dans le cadre d'un fichier .txt et tres facile a comprendre : <?php$file = './mon_fichier.txt'; //nom du fichier a traiter //3e methode (PHP 4.3+, PHP 5) : file_get_contents $content = _AT_file_get_contents($file); //recupere le contenu du fichier, s'il existe if ( empty($contenu) ) { echo "pas de commentaire"; } else { echo $contenu; } ?> Modifié 24 Novembre 2004 par Dash
Gribouille26 Posté 24 Novembre 2004 Auteur Posté 24 Novembre 2004 Merci Dash!! J'ai essayé la première et la troisième méthode. La troisième ne marche pas... ou du moins, je n'arrive pas à la faire marcher C'est pas grave, la première marche très bien! Je la garde.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant