Aller au menu - Aller au contenu

Icône Lire et écrire dans un fichier

Mise à jour : 03/04/2010
Difficulté : Intermédiaire Intermédiaire Creative Commons BY-NC-SA
133 390 visites depuis 7 jours, dont 2 890 sur ce chapitre classé 2/786
Les variables sont simples à utiliser, mais ce sont des informations temporaires. La durée de vie d'une variable n'est en effet jamais très longue. Or, vous aurez certainement besoin sur votre site de stocker des informations définitivement.

Par exemple, il est impossible de stocker les messages d'un forum dans des variables... puisque celles-ci seront supprimées à la fin de l'exécution de la page ! Pour stocker ces informations longtemps, il faut les écrire sur le disque dur. Quoi de plus logique pour cela que de créer des fichiers ?

PHP permet justement d'enregistrer des données dans des fichiers sur le disque dur du serveur.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Autoriser l'écriture de fichiers (chmod)

Pour que PHP puisse créer des fichiers, il doit avoir accès à un dossier qui autorise la création de fichiers par PHP. Il faut en effet donner le droit à PHP de créer et modifier les fichiers, sinon celui-ci ne pourra rien faire.

Pour créer ces droits, on dit en général qu'on doit modifier le CHMOD du fichier ou du dossier. C'est le nom de la commande qui permet de modifier les droits sous Linux.

Sous Windows, vous n'en avez probablement jamais entendu parler, tout simplement parce que ça n'existe pas. Mais le serveur de votre site, lui, est le plus souvent sous Linux. Et sous Linux, on utilise ce qu'on appelle le CHMOD pour gérer les droits.


Le CHMOD est un nombre à 3 chiffres que l'on attribue à un fichier (par exemple 777). Selon la valeur de ce nombre, Linux autorisera (ou non) la modification du fichier.
Le problème, c'est qu'en général Linux n'autorise pas les modifications de fichiers par un script PHP. Or, c'est justement ce qu'on veut faire. Alors, comment on va faire pour s'en sortir ? En modifiant le CHMOD pardi ! :D

Il va falloir passer par... votre logiciel FTP ! Oui, celui-là même qui vous sert à envoyer vos pages sur le web. ;)
En ce qui me concerne, j'utilise Filezilla (vous utilisez celui que vous voulez, la manipulation est quasiment la même).

Connectez-vous à votre serveur, et faites un clic-droit sur l'un des fichiers du serveur :

Modifier les permissions d'un fichier


En général, vous devriez avoir un menu "CHMOD" ou "Permissions de fichier" (comme moi).
Cela devrait ouvrir une fenêtre qui ressemble à peu près à ceci :

CHMOD à 777 pour activer l'écriture


Et c'est là que se trouve la solution à tous nos problèmes ! :waw:
Bon, sans rentrer dans les détails parce qu'il n'est pas question de faire un cours de Linux ici, voilà comment ça fonctionne : il y a 3 types de personnes qui ont le droit de lire/modifier des fichiers.
  • Le propriétaire : c'est l'utilisateur sous Linux qui a créé le fichier. Lui, il a en général tous les droits : lire, écrire, exécuter.
    Selon les droits qu'il possède, le premier chiffre du CHMOD change. Ici, c'est 7 : ça veut dire qu'il a tous les droits.
  • Le groupe : bon ça ne nous concerne pas trop là non plus. Ce sont les droits du groupe d'utilisateurs auquel appartient le propriétaire du fichier. Cela correspond au 2° chiffre du CHMOD (ici : 7).
  • Permissions publiques : ah ! Là ça devient intéressant. Les permissions publiques concernent tout le monde, c'est-à-dire même vos fichiers PHP. C'est le troisième chiffre du CHMOD (par défaut 5, il faut mettre cette valeur à 7).

Si vous rentrez 777 comme valeur pour le CHMOD, ça veut dire que tous les programmes du serveur ont le droit de modifier le fichier, notamment PHP. Il faut donc rentrer 777 pour que PHP puisse modifier le fichier en question.

Vous pouvez aussi modifier le CHMOD d'un dossier. Cela déterminera si on a le droit de lire/écrire dans ce dossier.
Cela vous sera notamment utile si vous avez besoin d'écrire des fichiers dans un dossier en PHP.


Pour ceux qui veulent en savoir plus sur les CHMOD, je traite le sujet beaucoup plus en détail dans mon cours sur Linux (car c'est un truc de Linux ;) ). N'hésitez pas à aller lire le chapitre si le sujet vous intéresse.

Ouvrir et fermer le fichier

Avant de lire/écrire dans un fichier, il faut d'abord l'ouvrir.

Commencez par créer un fichier compteur.txt (par exemple). Envoyez-le sur votre serveur avec votre logiciel FTP, et appliquez-lui un CHMOD à 777 comme on vient d'apprendre à le faire.

Maintenant, on va créer un fichier PHP qui va travailler sur compteur.txt.
Votre mission, si vous l'acceptez : compter le nombre de fois qu'une page a été vue sur votre site et enregistrer ce nombre dans ce fichier.

Voici comment on va procéder :

Code : PHP
1
2
3
4
5
6
7
8
9
<?php
// 1 : on ouvre le fichier
$monfichier = fopen('compteur.txt', 'r+');

// 2 : on fera ici nos opérations sur le fichier...

// 3 : quand on a fini de l'utiliser, on ferme le fichier
fclose($monfichier);
?>


Il y a 3 étapes à respecter :
  1. On ouvre le fichier avec fopen. Cette fonction renvoie une information que vous devez mettre dans une variable (ici : $monfichier). Cela nous sera utile tout à l'heure pour fermer le fichier.
    On indique à fopen tout d'abord le fichier qu'on veut ouvrir (compteur.txt), et comment on veut l'ouvrir (ici j'ai mis 'r+'). Voici les principales possibilités qu'on a :

    ModeExplication
    r Cela ouvre le fichier en lecture seule. Cela veut dire que vous ne pourrez que lire le fichier.
    r+ Cela ouvre le fichier en lecture / écriture. Vous pourrez non seulement lire le fichier, mais aussi écrire dedans (on l'utilisera assez souvent en pratique).
    a Ouvre le fichier en écriture seule. Mais il y a un avantage : si le fichier n'existe pas, ça le crée automatiquement.
    a+ Ouvre le fichier en lecture et écriture. Si le fichier n'existe pas il est créé automatiquement. Attention : le répertoire doit avoir un CHMOD à 777 dans ce cas ! A noter que si le fichier existe déjà, le texte sera rajouté à la fin.

    Ici, on a créé le fichier avant, donc pas besoin d'utiliser a+.
  2. On fait nos opérations de lecture / écriture sur le fichier. Nous allons voir comment ça fonctionne un peu plus loin.
  3. Enfin, quand on a fini d'utiliser le fichier, on fait un fclose pour le fermer. On doit préciser quel fichier on doit fermer : mettez-y la variable $monfichier pour que PHP sache duquel il s'agit, et c'est bon. :)


Vous n'êtes absolument pas obligés de donner l'extension .txt à votre fichier. Vous pouvez l'appeler comme vous voulez : compteur.cpt, compteur.num, ou même compteur tout court.

Lire et écrire dans le fichier

Maintenant que nous savons ouvrir et fermer notre fichier, nous allons apprendre à le lire et à le modifier.

Lire



Pour lire, on a 2 possibilités :
  • Lire caractère par caractère avec la fonction fgetc
  • Lire ligne par ligne avec fgets

En général, on se débrouillera pour mettre une information par ligne dans notre fichier. On utilise donc assez peu fgetc qui est assez lourd à utiliser (il faudrait faire une boucle pour lire caractère par caractère).

Dans notre cas, on va supposer que notre fichier ne contient qu'une ligne : le nombre de pages qui ont été vues sur le site.
Pour récupérer ce nombre, il faudra procéder comme ceci :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
// 1 : on ouvre le fichier
$monfichier = fopen('compteur.txt', 'r+');
 
// 2 : on lit la première ligne du fichier
$ligne = fgets($monfichier);
 
// 3 : quand on a fini de l'utiliser, on ferme le fichier
fclose($monfichier);
?>


Il faut indiquer à fgets le fichier à lire. On lui donne notre variable $monfichier qui lui permettra de l'identifier.
fgets renvoie toute la ligne (la fonction arrête la lecture au premier saut de ligne). Donc, notre variable $ligne devrait contenir la première ligne du fichier. :)

Et si mon fichier fait 15 lignes, comment je fais pour toutes les lire ?


Il faut faire une boucle. Un premier fgets vous donnera la première ligne. Au second tour de boucle, le prochain appel à fgets renverra la deuxième ligne, et ainsi de suite.

C'est un peu lourd, mais si on stocke assez peu d'informations dans le fichier cela peut suffire. Sinon, si on a beaucoup d'informations à stocker, on préfèrera utiliser une base de données (on en parlera dans la prochaine partie).

Ecrire



Pour l'écriture, on n'a qu'une seule possibilité : utiliser fputs.
Cette fonction va écrire la ligne que vous voulez dans le fichier.

Elle s'utilise comme ceci :

Code : PHP
1
<?php fputs($monfichier, 'Texte à écrire'); ?>


Toutefois, il faut savoir où on écrit le texte. En effet, le fonctionnement d'un fichier est assez bizarre :

  1. Vous l'ouvrez avec fopen
  2. Vous lisez par exemple la première ligne avec fgets.
  3. Oui mais voilà, maintenant le "curseur" de PHP se trouve à la fin de la première ligne (vu qu'il vient de lire la première ligne).

    Image utilisateur


    Si vous faites un fputs juste après, il va écrire à la suite ! Pour éviter ça, on va utiliser la fonction fseek qui va replacer le curseur où on veut dans le fichier. En l'occurence, on va replacer le curseur au début du fichier en faisant :
    fseek($monfichier, 0);
    Notre curseur sera alors repositionné au début :

    Image utilisateur


    Si vous avez ouvert le fichier avec le mode 'a' ou 'a+', toutes les données que vous écrirez seront toujours ajoutées à la fin du fichier. La fonction fseek n'aura donc aucun effet dans ce cas.

  4. Ouf, notre curseur est au début du fichier, on peut faire un fputs. La ligne va s'écrire par-dessus l'ancienne, ce qui fait que l'ancien texte sera écrasé (remplacé par le nouveau).


Pour y voir un peu plus clair, je vous propose ce code source qui compte le nombre de fois que la page a été vue :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
$monfichier = fopen('compteur.txt', 'r+');
 
$pages_vues = fgets($monfichier); // On lit la première ligne (nombre de pages vues)
$pages_vues++; // On augmente de 1 ce nombre de pages vues
fseek($monfichier, 0); // On remet le curseur au début du fichier
fputs($monfichier, $pages_vues); // On écrit le nouveau nombre de pages vues
 
fclose($monfichier);
 
echo '<p>Cette page a été vue ' . $pages_vues . ' fois !</p>';
?>




Ce n'était pas si dur, vous voyez. ^^

Voici la description des 4 lignes du milieu (les plus importantes) :

  1. On récupère la première ligne du fichier, qui est le nombre de pages qui ont été vues pour le moment sur le site.
  2. On ajoute 1 à la variable $pages_vues. Si elle valait 15, elle vaudra désormais 16.
  3. On replace notre fameux "curseur" au début du fichier (parce que sinon il se trouvait à la fin de la première ligne et on aurait écrit à la suite).
  4. On écrit notre nouveau nombre de pages vues dans le fichier, en écrasant l'ancien nombre.

Si vous avez oublié de mettre un CHMOD à 777 sur le fichier compteur.txt, vous aurez l'erreur suivante :
Warning: fopen(compteur.txt): failed to open stream: Permission denied
Ici, PHP essaie de vous dire qu'il n'a pas réussi à ouvrir le fichier car il n'a pas le droit d'écrire dedans. Il faut donc absolument faire ce CHMOD si vous voulez pouvoir toucher au fichier !

Voilà, vous venez de voir comment on se sert d'un fichier : ouverture, lecture, écriture, fermeture.
Pour un gros fichier cela devient vite compliqué, mais pour un petit fichier comme celui-ci, cela convient très bien.

Q.C.M.

Quelle fonction permet d'ouvrir un fichier ?
S'il y a 3 lignes dans mon fichier, est-ce que ce code est bon et fonctionne correctement ?
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
$monfichier = fopen('fichier.txt', 'r+');

for ($ligne = 1 ; $ligne <= 3 ; $ligne++)
{
        $texte = fgets($monfichier);
        echo $texte . '<br />';
}

fclose($monfichier);
?>
Que fait cette ligne de code ?
Code : PHP
1
2
3
<?php
fseek($monfichier, 1);
?>
Si on a l'erreur 'Permission denied', qu'est-ce que ça veut dire ?
Si j'ouvre un fichier avec le paramètre 'r+', qu'est-ce que je peux faire ?

Statistiques de réponses au QCM

Et voilà, vous savez désormais travailler avec des fichiers !

Comme vous avez pu le voir, c'est pratique et rapide du temps qu'on ne stocke pas grand chose dans le fichier. Si vous avez beaucoup d'informations à stocker, il est préférable de faire appel à une base de données. Nous allons justement découvrir les bases de données dans la prochaine partie. :)
Chapitre précédent Sommaire Chapitre suivant

Partager

106 commentaires pour "Lire et écrire dans un fichier"
Note moyenne : 3.61 / 4 (2518 votes)
Pseudo Commentaire
Hors ligne jbtb # Posté le 13/03/2012 à 19:41:34

salut a tous
je ne travail pas avec wamp , je travail avec easyphp et je n'ai pas compris ce chapitre conçernant (FTP,creation de fichier,Filezilla).
Hors ligne buzut # Posté le 15/03/2012 à 09:08:19
Critiquer, c'est aviser.

Avis : Bon

M@teo21 pourquoi s'embêter à faire un boucle avec fgets pour lire tout un fichier texte alors que la fonction file_get_contents le fait tout aussi bien et en moins contraignant ?

Citation : Schopenhauer
Le monde dans lequel chacun vit dépend de la façon de la concevoir
 
Hors ligne kichnifou # Posté le 06/05/2012 à 12:14:31

Avis : Bon

J'ai essayé le code, mais ça n'a pas marché...
j'ai alors remplacé : $pages_vues++;
par : $pages_vues=pages_vues+1;

Résultat : ça marche!
Explication? O.o
Hors ligne kikililou # Posté le 13/05/2012 à 15:38:15

Petite remarque valable pour l'ensemble des cours:
il serait bon de donner une phonétique pour les termes nouveaux, les abréviations et
acronymes histoire de ne pas avoir l'air trop crétin dans une soirée webmasters. :'(
exemple :
CHMOD, ça se prononce "ch'mode", "C-H-Mod", C-H-M-O-D? Che-ai-mode ...
Voilà, c'était histoire d'envoyer un post qui ne sert à rien... :) mais quand-même!
Hors ligne yok8k # Posté le 20/05/2012 à 17:09:04

Avis : Très bon

Il serait bien aussi de modifier ce cours , en mettant vers la ligne:

Lire et écrire dans le fichier

Un tableau qui récapitule ce qu'on sait:
fopen = ouvrir
fgets = lire 1ère ligne
fgetc = lire caractère par caractère
fseek = replacer le curseur où on veut dans le fichier
fputs = écrire
fclose = fermer


Car sinon on est dans le brouillard

html 5 , 47 effets en action 47 Amazing CSS3 Animation Demos
 

Voir tous les commentaires