Accueil

Traduction

Débuter en programmation web - sommaire

Débuter en programmation web - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

PHP et les fichiers texte

Une base de données permet de stocker de façon permanente et structurée un grand nombre de données. Or pour certains traitements il suffit de stocker qu'un nombre limité de données. Dans ce cas utiliser une base de données c'est "tuer une mouche avec un canon" ; le recours à un fichier texte est préférable.

Lire la totalité d'un fichier texte

Le fichier texte

Il se nomme "liste.txt" et comprend la liste des poissons observés sur un site de plongée.
Le contenu de ce fichier texte :

requins	petite roussette
requins	grande roussette
plats	plie
plats	sole
gadidés	morue
gadidés	tacaud

Sur une ligne le groupe et le nom de l'espèce. Donc il faut lire que le petite roussette appartient au groupe des requins et que la plie est un (poisson) plat et la morue appartient au groupe des gadidés.

Programme pour lire ce fichier

PHP n'est pas avare d'outils. Trois fonctions permettent de lire la totalité d'un fichier. Ces trois fonctions ne se contentent pas de lire la totalité du fichier, elle l'ouvre au préalable puis le ferme. Il s'agit donc de fonctions de haut niveau.

Le script

Les fonctions file_get_contents() & readfile() retournent le contenu du fichier sous forme d'une chaine.

Avec la première fonction il faut ensuite un echo pour afficher cette chaine alors que la deuxième fonction produit la chaine et l'affiche.

La fonction file() retourne le contenu du fichier sous forme d'un tableau indicé ; Chaque ligne du fichier texte devenant un élément de la liste.
On peut donc utiliser ensuite la fonction print_r() ou une boucle foreach() pour afficher chaque élément du tableau. Dans l'exemple je fais les deux !

Le rendu

Lire une partie d'un fichier texte

Attention ces fonctions n'ouvrent pas le fichier. Il faut donc au préalable l'ouvrir en lecture seule.

Ouvrir un fichier texte

Pour ouvrir un fichier (et uniquement ouvrir) il faut utiliser la fonction fopen(cheminFichier,mode d'ouverture).
Pour que le chemin se résume au nom du fichier texte je vous recommande de placer le fichiers et ses programmes PHP dans le même dossier.

Mode d'ouverture d'un fichier

Ci-dessous les principales valeurs du paramètre mode d'ouverture de la fonction fopen().

L'argument retenu doit être entre quotes.

Il existe d'autres options possibles. Je n'ai cité que les plus fréquentes.

La fonction fread()

Cette fonction accepte deux arguments. Le premier est le fichier à lire et le deuxième précise le nombre d'octets qu'il faut lire.

Le script basé sur la fonction fread()

Notez l'ouverture du fichier en lecture seule.
La fonction filesize() précise la taille du fichier en octets.

Le rendu

Autre solution pour le script

Ce script est maladroit car il y a trois instructions fopen().
Il suffit d'une seule ouverture (en lecture seule) puis à chaque fois il faut gérer le curseur pour pointer de nouveau le début de fichier. Il faut donc utiliser la fonction fseek() qui déplace le curseur.

Le script amélioré (extrait) :

L'instruction fopen() est remplacée 2 fois par l'instruction fseek(). Le deuxième argument de cette fonction est 0 ; ce qui signifie "pointer le début de fichier".
Notez l'instruction pour fermer le fichier ouvert.

la fermeture du fichier n’est pas obligatoire mais conseillée : libère des ressources.

La fonction gets()

Cette fonction permet de lire le fichier ligne par ligne.

Le script

La fonction feof() permet de détecter la fin de fichier.
Cette fonction retourne un booléen d'où la syntaxe du test : while(!feof($fichier)). Ce qui veut dire "tant que la fin de fichier n'est pas détectée"

Le rendu

Joli affichage du fichier.

Autre solution

J'utilise la fonction count() qui ne peut s'appliquer qu'à un objet array. Aussi dois-je alors ouvrir le fichier avec la fonction file() qui, je le rappelle, retourne le contenu du fichier sous forme d'un tableau indicé.

La fonction nl2br() crée un saut de ligne.

La fonction fgetc()

Cette fonction permet de lire un fichier caractère par caractère.
Un espace est un caractère.

Le script

Ce script ressemble beaucoup au précédent.

Le rendu

Écrire dans un fichier

Passons maintenant à l'écriture dans un fichier.
Thème : un nombre entier est généré de façon aléatoire. Ce nombre doit être inséré dans un fichier texte.

La fonction file_put_contents()

Pour écrire dans un fichier nous pouvons utiliser la fonction file_put_contents() qui ouvre et écrit dans le fichier.

Cette fonction va accepter en argument le chemin vers le fichier et les données à écrire.
Si le fichier spécifié n’existe pas, alors il sera créé et s'il existe les données existantes seront écrasées.

Le script

Je génère un entier de façon aléatoire compris entre 100 et 999.
Cette valeur est écrite dans le fichier 'fichier2.txt'.
Ce fichier n'existant pas il sera créé lors du premier essai.
Pour les essais suivants, le contenu sera écrasé et remplacé par une nouvelle chaine.

Le rendu

Exécutez plusieurs fois ce script, vous verrez qu'à chaque fois la ligne unique qu'il contient est modifiée.

Ajouter dans un fichier texte

Nous voulons que la nouvelle insertion dans 'fichier2.txt' s'ajoute à l'existant.

Première solution

Nous allons utiliser la fonction file_put_contents() mais avec une astuce. Pour sauvegarder l'existant, l'astuce consiste à récupérer le contenu d’origine dans une variable, puis à le concaténer avec le nouvel entier généré.
Dans une seconde étape la chaine découlant de la concaténation écrase le contenu antérieur.

Le script

Notez l'utilisation des fonctions file_get_contents() (lecture) puis file_put_contents() (écriture).
Et entre les deux la concaténation de l'ancien contenu avec l'insertion.
J'insère un saut de ligne : \n
Il faut que ces sauts de ligne soient pris en compte lors de l'affichage du contenu d'où l'emploi de la balise double PRE.

Et oui, pour développer avec PHP il faut maitriser le HTML.

Le contenu de "fichier2.txt"


À chaque exécution du programme il y a affichage d'une ligne supplémentaire à la suite des données anciennes.

Solution plus orthodoxe

Je vous propose désormais une solution plus classique ...

Le fichier 'fichier2.txt' est ouvert en ajout et lecture.
Un nombre aléatoire est généré ainsi qu'un saut de ligne.
Cette chaine est ajoutée au fichier grâce à la fonction fputs() et au mode d'ouverture du fichier (a).
Puis la totalité du contenu est affichée avec prise en compte des sauts de ligne (emploi de la balise double PRE).

fputs() est un alias de fwrite(). En d'autres termes j'aurais pu utiliser la fonction fwrite().

Consignes

Si vous vous entrainez à réaliser ces différents programmes, pensez à vider régulièrement le fichier 'fichier2.txt'.
En ouvrant ce fichier texte vous observerez les sauts de ligne.

Exercice

Afin de vérifier vos connaissances, je vous demande de réaliser le script qui insère en première ligne l'instant présent dans le fichier "fichier3.txt". Les données anciennes ne sont pas écrasées mais apparaissent à la suite.

C'est l'occasion de réviser la fonction date() et ses paramètres.
Vous devez imaginer deux solutions (l'astuce et la solution orthodoxe).

Le contenu de "fichier3.txt"

Il est exactement 07:26:48 
 Il est exactement 07:04:27 
 Il est exactement 07:04:13 
 Il est exactement 07:03:50 
 Il est exactement 07:03:48 
 Il est exactement 07:03:46 
 Il est exactement 07:03:44 
 Il est exactement 07:03:30 
 Il est exactement 07:03:27 

L'heure la plus récente apparait en tête. C'est donc l'ordre antéchronologique.

Des scripts plus professionnels

Si le programme tente d'ouvrir un fichier qui n'existe pas (ou n'existe plus) il y aura plantage. Il faut mieux afficher un message d'erreur.
Par ailleurs il faut concevoir un programme générique capable d'ouvrir et lire n'importe quel fichier texte. Il faut donc que l'utilisateur puisse saisir le nom du fichier via un formulaire.

Ecriture améliorée du premier programme de ce chapitre

C'est l'occasion de reviser le traitement en PHP des données adressées par le formulaire.

Ce programme peut ouvrir n'importe quel fichier texte du répertoire.
Une même page web contient le formulaire et le traitement PHP des données soumissionnées d'où le test pour éviter un message d'erreur (tant que la variable $_POST[] n'existe pas encore).

Nouveauté : emploi de la fonction file_exists() qui retourne true si le nom de fichier passé en argument existe.

Le rendu

Testez le programme en saisissant d'abord un nom de fichier inconnu tel "bidon.txt" puis des noms de fichiers existants tels "liste.txt", "fichier2.txt", "fichier3.txt".

Autres fonctions de manipulation des fichiers

Il existe une fonction qui permet de renommer un fichier : rename(ancienNom, nouveauNom).
Si le nouveau nom choisi est le nom d’un fichier qui existe déjà, alors ce fichier sera écrasé et remplacé par notre fichier renommé.

La fonction unlink() permet d’effacer le fichier passé en paramètre.
Cette fonction retourne un booléen : true en cas de succès et false en cas d'échec.

Le CHMOD sous Linux

Dès que vous allez héberger vos fichiers texte il va se poser un problème. En effet le serveur de votre hébergeur de sites est en général sous LINUX. Or avec ce système d'exploitation le visiteur n'a pas forcément le droit d'écire dans un fichier texte.

Le CHMOD est un nombre à trois chiffres que l'on attribue à un fichier. Selon la valeur de ce nombre, Linux autorisera (ou pas) la modification d'un fichier.

Procédure

  1. Démarrer le logiciel FTP, par exemple FileZila
  2. connectez vous à votre serveur
  3. faites un clic droit sur l'un des fichiers texte hébergé
  4. sélectionnez dans le menu contextuel "Droits d'accès au fichier".

Vous obtenez la boite de dialogue ci-dessous :

Dans la zone de texte légendée "valeur numérique" saisissez 777 pour que PHP puisse modifier le fichier texte en question.

Remarque

Par mesure de sécurité je ne vous autorise pas à écrire dans les différents fichiers texte. Par contre vous pouvez les lire.