Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
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 alors préférable.
PHP propose de nombreuses fonctions pour manipuler les fichiers 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.
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.
Notez le formulaire qui permet de lancer l'exécution du script PHP.
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 'array' ; Chaque ligne du fichier texte devenant un élément
de ce tableau indicé.
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 !
Attention ces fonctions n'ouvrent pas le fichier. Il faut donc au préalable l'ouvrir en lecture seule.
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 dans le même dossier les fichiers
et les documents PHP qui les manipulent.
Ci-dessous les principales valeurs du paramètre mode d'ouverture de la fonction fopen().
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 début du code est identique à la page précédent : un formulaire pour appeler le script.
Le code (extrait) :
Notez l'ouverture du fichier en lecture seule.
La fonction filesize() précise la taille du fichier en octets.
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.
Cette fonction permet de lire le fichier ligne par ligne.
La fonction feof() permet de détecter la fin de fichier.
Cette fonction retourne un booléen d'où la condition du while() : while(!feof($fichier)).
Ce qui veut dire "tant que la fin de fichier n'est pas détectée"
Le rendu est très satisfaisant.
J'utilise la fonction count() qui 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.
Cette fonction permet de lire un fichier caractère par caractère.
Un espace est un caractère.
Ce script ressemble beaucoup au précédent.
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.
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.
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.
Actualisez la page puis recliquez sur le bouton de soumission.
Vous constatez que la ligne unique du fichier est modifiée.
Nous voulons que la nouvelle insertion dans 'fichier2.txt' s'ajoute à l'existant ; donc pas d'écrasement de l'existant.
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 à concaténer
le contenu de cette variable avec la nouvelle insertion.
Dans une seconde étape la chaine découlant de la concaténation écrase le contenu antérieur.
Notez l'utilisation des fonctions file_get_contents() puis file_put_contents().
Donc on est successivement en lecture pui en é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.
À chaque exécution du programme il y a affichage d'une ligne supplémentaire à la suite des données anciennes.
Je vous propose maintenant une solution plus classique.
Le fichier 'fichier2.txt' est ouvert en "a+" (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().
Si vous vous entrainez à réaliser ces différents programmes, pensez à vider régulièrement le fichier 'fichier2.txt' avec un éditeur de textes tel NotePad.
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.
Correction en fin de chapitre.
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.
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 q'un plantage.
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.
Ce programme peut ouvrir n'importe quel fichier texte du répertoire courant.
Emploi de la fonction file_exists() qui retourne true si le nom de fichier passé en argument existe.
Testez le programme en saisissant d'abord un nom de fichier inconnu tel "bidon.txt" puis des noms de fichiers existants chez mon hébergeur tels que : "liste.txt", "fichier2.txt", "fichier3.txt".
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.
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 (et non pas sous Windows).
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.
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.
Par mesure de sécurité je n'autorise pas les visiteurs à écrire dans les différents fichiers texte (sauf 'fichier2.txt).
J'utilse la solution basée sur les méthodes file_get_contents & file_put_contents.
$heure_courante = date("h:i:s") : il est très facile en PHP de créer l'heure courante.
L'instant présent généré par la fonction date() est par défaut l'heure du lieu du serveur
sauf si instruction : date_default_timezone_set('Europe/Paris')
$nouveau = $insertion . ' ' .$ancien : ansi la dernière insertion apparait en tête, devant les anciennes dates.