Presentation

Les fichiers et dossiers sont tres souvent utilises en PHP. Nous verrons plus loin qu'il existe d'autres manieres de stocker les donnees en utilisant ce qu'on appelle une base de donnees, qui est une autre forme de stockage tres couramment utilisee.

Nous allons apprendre pour ce chapitre a manipuler des fichiers existants (ouvrir un fichier, enregistrer des donnees et fermer le fichier).

Ouvrir un fichier en PHP

Nous supposerons que vous avez deja un fichier qui se nomme "test.txt" (fichier texte donc) sur votre disque dur, dans le repertoire courant que vous utilisez pour travailler en PHP. Vous savez ce qu'est une fonction, donc je ne vais pas mettre plus de temps a vous dire que pour ouvrir un fichier, plusieurs fonctions sont disponibles en fonction de ce que l'on souhaite faire.

La plus simple est la fonction file_get_contents(). Elle prend comme parametre le nom du fichier (nous ne detaillerons pas les autres parametres possibles de cette fonction ici, ils ne nous seront pas utiles pour la suite). On recupere le contenu du fichier ouvert dans une variable. Voici comment ca se passe :

<?php
     $fichier 
file_get_contents('test.txt'); //recupere le contenu du fichier et le place dans la variable $fichier

     
echo $fichier//affiche le contenu du fichier
?>

Vous n'avez pas a fermer le fichier quand vous utilisez cette fonction, qui a mon avis est adaptee quand vous ne souhaitez pas lire les donnees du fichier d'une certaine facon. Vous verrez qu'avec une autre fonction que nous allons voir maintenant, vous allez pouvoir faire plus de choses. La fonction que nous allons utiliser porte le doux nom de fopen() et demande au minimum deux parametres devant etre renseignes. Le premier parametre est le nom du fichier (ce qui ne change pour le moment pas avec la fonction file_get_contents()), et le deuxieme est un peu particulier. En effet, ce deuxieme parametre va etre utile pour determiner le mode d'ouverture du fichier. Voici un recapitulatif des modes disponibles :

mode Description
r Ouvre le fichier en lecture seule, le pointeur de fichier est place au debut du fichier.
r+ Ouvre le fichier en lecture + ecriture, le pointeur de fichier est place au debut du fichier.
w Ouvre le fichier en ecriture seule; le pointeur de fichier est place au debut du fichier et ecrase les donnees du fichier existant (si il existe). Si le fichier n'existe pas, ce mode permet de creer le fichier.
w+ Ouvre le fichier en lecture et ecriture; le pointeur de fichier est place au debut du fichier et ecrase les donnees du fichier existant (si il existe). Si le fichier n'existe pas, ce mode permet de creer le fichier.
a Ouvre le fichier en ecriture seule; place le pointeur de fichier a la fin du fichier. Si le fichier n'existe pas, il est cree.
a+ Ouvre le fichier en lecture et ecriture; le pointeur de fichier est place a la fin du fichier. Si le fichier n'existe pas, il est cree.
x Cree et ouvre le fichier en lecture seule; le pointeur de fichier est place au debut du fichier. Si le fichier existe deja, fopen() va echouer. Si le fichier n'existe pas, fopen() tente de le creer. Cette option est supportee a partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.
x+ Cree et ouvre le fichier en lecture et ecriture; place le pointeur de fichier au debut du fichier. Si le fichier existe deja, fopen() va echouer. Si le fichier n'existe pas, il est cree. Cette option est supportee a partir de PHP 4.3.2, et fonctionne uniquement avec des fichiers locaux.

Vous vous demandez peut-etre ce qu'est un pointeur de fichier. En fait, prenons un exemple simple avec un fichier contenant "123456". Le pointeur de fichier peut etre represente comme un curseur que vous placeriez a une certaine position. Si vous ecrivez a partir de cette position, vous remplacerez les caracteres qui suivent. Le pointeur de fichier commence a la position 0, cette position correspond a un curseur place juste avant le premier caractere du fichier. Voici comment on peut representer ca :

PHP et les pointeurs dans les fichiers

Si votre pointeur de fichier est en position 0, tout ce que vous ecrirez remplacera les caracteres 1, 2, 3 etc ... alors que si vous aviez place votre curseur en position 6, vous auriez ecrit apres et votre fichier aurait donc ete "prolonge".

Maintenant nous allons mettre en pratique tous ces exemples. Si nous souhaitons ouvrir le fichier "test.txt" en lecture, on regarde d'abord le mode que nous allons utiliser. Ici, il s'agit du mode r, voici donc la syntaxe a utiliser pour ouvrir le fichier :

<?php
     $ressource_fichier 
fopen('test.txt''r'); //Ouvre le fichier en lecture seule
?>

Notez le nom de la variable que j'ai utilisee, ici on ne recupere pas le contenu du fichier mais une ressource qui va permettre de controler ce fichier. On va donc ensuite pouvoir dire a PHP "utilise cette ressource et recupere le contenu du fichier". Pour recuperer le contenu du fichier, il y a plusieurs manieres :

Lire un fichier caractere par caractere

Nous allons commencer par la methode consistant a recuperer un (ou plusieurs caracteres) du fichier. La fonction permettant de retourner un seul caractere s'appelle fgetc() et prend en parametre la fameuse ressource de fichier dont je vous ai parle tout a l'heure.

<?php
     $ressource_fichier 
= fopen('test.txt', 'r'); //Ouvre le fichier en lecture seule, on supposera qu'il existe sous peine d'avoir une erreur

     if($ressource_fichier) //Si $ressource_fichier ne vaut pas FALSE on peut continuer
     {
          $carac1 = fgetc($ressource_fichier); //Place le chiffre 1 dans la variable $carac1
          $carac2 = fgetc($ressource_fichier); //Place le chiffre 2 dans la variable $carac2

          
fclose($ressource_fichier);
     }
?>

Vu que notre fichier contient "123456" si vous faites des fgetc() successivement, vous allez pouvoir recuperer le "1" puis le "2", etc ...

A chaque fois que vous utilisez la fonction fgetc(), PHP incremente le pointeur de fichier d'une position, voila pourquoi vous ne lisez pas le meme caractere a chaque fois (ce qui ne serait pas forcement ce qu'on souhaite).

Vous imaginez bien que vous ne savez pas forcement le nombre de caracteres d'un fichier, et que cette methode n'est valable pour des fichiers contenant un nombre tres restreint de caracteres. On peut deja se dire que l'on pourrait utiliser une boucle pour recuperer tous les caracteres du fichier, mais il y a un probleme. En effet, quoi mettre dans la condition de continuite de la boucle ? On doit dire a la boucle "arrete-toi des que tu atteints la fin du fichier" et nous ne connaissons pour le moment aucune condition a placer pour lui dire cela. Heureusement, PHP vient a notre secours avec la fonction feof qui renvoie TRUE si le pointeur se trouve a la fin du fichier (et donc qu'il n'y a plus aucun caractere a lire). Nous utilisons egalement la fonction fclose() qui permet de fermer le fichier et est indispensable.

Voici donc ce que ca donne :

<?php
     $ressource_fichier 
= fopen('test.txt', 'r'); //Ouvre le fichier en lecture seule, on supposera qu'il existe sous peine d'avoir une erreur

     if($ressource_fichier) //Si $ressource_fichier ne vaut pas FALSE on peut continuer
     {
          $contenu_fichier   = '';

          while(!feof($ressource_fichier)) //Tant que l'on est pas a la fin du fichier
          {
               $contenu_fichier .= fgetc($ressource_fichier); //Recupere le caractere en cours et l'ajoute au contenu de la variable $contenu_fichier
          }
          fclose($ressource_fichier);

          echo $contenu_fichier; //affiche le contenu du fichier
     }
?>

Un petit rappel : $variable .= 'valeur'; est equivalent a $variable = $variable . 'valeur'; sauf que PHP interprete la premiere solution plus rapidement, vous y gagnez en clarte et en performances generales.

Concernant la solution de lire le fichier caractere par caractere, nous venons de le voir a titre purement pedagogique. On evitera cette solution pour des scripts couramment utilises. Il vaut mieux lire le fichier d'une traite ou ligne par ligne, vous minimiserez ainsi les appels aux fonctions qui sont gourmands en ressources systeme.

Lire un fichier ligne par ligne

Deuxieme methode, cette fois-ci plus adaptee a de gros fichiers, la lecture ligne par ligne. On utilise la fonction fgets() qui permet de lire une ligne d'une seule traite. Voici ce que ca donne, je pense que vous comprendrez car cela ne change presque pas par rapport a l'exemple precedent :

<?php
     $ressource_fichier 
= fopen('test.txt', 'r');

     if($ressource_fichier) //Si $ressource_fichier ne vaut pas FALSE on peut continuer
     {
          $contenu_fichier   = '';

          while(!feof($ressource_fichier)) //Tant que l'on est pas a la fin du fichier
          {
               $contenu_fichier .= fgets($ressource_fichier); //Recupere la ligne en cours et l'ajoute au contenu de la variable $contenu_fichier
          }

          fclose($ressource_fichier);

          echo $contenu_fichier; //affiche le contenu du fichier
     }
?>
Lire un fichier sous forme de tableau

Vous avez deja vu ce que sont les tableaux. Et bien PHP va vous permettre de recuperer le contenu d'un fichier dans un tableau, chaque ligne du tableau correspondra a une ligne du fichier. Ceci est tres pratique quand vous avez besoin d'une ligne en particulier dans votre fichier (dont vous connaissez le numero) ou encore pour faire des operations de tri alphabetiques, numeriques ou que sais-je encore. En tout cas, sachez que c'est egalement tres utilise ;)

La fonction que nous allons utiliser s'appelle file(). Comme son nom ne l'indique pas, elle va vous retourner un tableau contenant tout votre fichier. Voici comment on l'utilise :

<?php
     $tableau 
file('test.txt'); //Place le contenu du fichier dans un tableau, on a suppose ici que le fichier existe sous peine d'avoir une erreur.
?>

Et voila, c'est aussi simple que ca. Maintenant, il faut se souvenir d'une des fonctions que l'on peut utiliser pour parcourir un tableau :p

Bon allez je vous le dit, on peut prendre par exemple la fonction foreach(). Pour placer le contenu du fichier dans une variable sous forme de chaine et afficher le fichier (comme nous l'avons fait pour les exemples precedents) on procedera de cette facon :

<?php
     $tableau 
file('test.txt'); //Place le contenu du fichier dans un tableau, on suppose que le fichier existe sous peine d'avoir une erreur

     
if(is_array($tableau)) //Si la variable $tableau est bien un tableau, on peut continuer
     {
          
$contenu_fichier '';

          foreach(
$tableau AS $ligne)
          {
               
$contenu_fichier .= $ligne;
          }

          echo 
$contenu_fichier//Affiche le contenu du fichier, notez que l'on a pas besoin d'utiliser fclose() ici
     
}
?>
ecrire dans un fichier

Nous allons voir une seule methode pour ecrire dans un fichier, il s'agit d'utiliser la fonction fputs() disponible sur toutes les versions de PHP. Il faut d'abord ouvrir le fichier a l'aide de la fonction fopen() et un mode d'ecriture approprie, ensuite on utilise fputs() pour ecrire les donnees, et ensuite on ferme le fichier. Voici un exemple pour ecrire les donnees "7654321" dans le fichier "test.txt" que nous avons utilise tout au long de cette page :

<?php
     $ressource_fichier 
= fopen('test.txt', 'w');

     if($ressource_fichier AND is_writable('test.txt')) //Si $ressource_fichier ne vaut pas FALSE et que le fichier est accessible en ecriture alors on peut continuer
     {
          fputs($ressource_fichier'7654321'); //Si une erreur a lieu, fputs() renverra FALSE, il faudra dans ce cas utiliser l'operateur triple egal pour le savoir

          fclose($ressource_fichier);
     }
?>
Quelques fonctions utiles

Si vous souhaitez verifier qu'un fichier existe, vous utiliserez pour cela la fonction file_exists() qui renverra TRUE ou FALSE si le fichier existe ou non. Elle prend en parametre le nom du fichier. Voici un exemple :

<?php
     
if(file_exists('test.txt'))
     {
          echo 'Le fichier existe';
     }
     else
     {
          echo 
'Le fichier n\'existe pas';
     }
?>

Il faut toujours avant d'ouvrir un fichier, verifier si il existe, ce que je n'ai pas fait dans mes exemples precedents, voila pourquoi je vous mettais a chaque fois "on supposera que le fichier existe sous peine d'avoir une erreur". En effet, si vous tentez d'effectuer une ouverture d'un fichier inexistant, PHP vous renverra une erreur, ce qui serait facheux en terme de programmation.

Vous aurez peut-etre egalement besoin de savoir comment effacer un fichier. En PHP, on utilise la fonction unlink() avec comme parametre le nom du fichier a effacer. Voici comment on l'utilise :

<?php
     if
(file_exists('test.txt'))
     {
          unlink('test.txt');
     }
?>
Chapitre suivant

Expressions regulieres