Leçons PHP - leçon 2 - Travail avec les fichiers : ouverture, écriture, lecture.
Dans la leçon précédente, nous avons créé la structure de notre livre d’or, blog ou chat. Il ne reste plus qu’à ajouter des fonctionnalités. Dans cette leçon, nous allons écrire nos entrées dans des fichiers et afficher les entrées depuis ces fichiers.
PHP offre de nombreuses fonctions pour travailler avec les fichiers, nous en verrons quelques-unes. Très probablement, votre site enregistrera les données dans une base de données (j’en suis sûr), pas dans des fichiers, donc nous verrons seulement quelques fonctions pour comprendre le principe. Le travail avec la base de données sera abordé plus tard.
Donc, si vous n’avez pas les fichiers que nous avons faits dans la leçon précédente, retournez à la leçon précédente et téléchargez-les.
Passons au formulaire d’ajout d’entrée :
/index.php?admin=1
Avec ce formulaire, nous allons ajouter nos entrées. Pour traiter ces entrées, il faut vérifier dans la page index.php (où les données du formulaire sont envoyées) si la variable $_POST contient des valeurs. Cela se vérifie très simplement :
if($_POST){ }
Simple, non ? Maintenant, dans les accolades, il faut placer le traitement du tableau $_POST. Nous n’écrirons pas le code directement dans les accolades, mais le sortirons dans notre classe, et appellerons la méthode de l’objet. Dans index.php, on appelle la méthode :
if($_POST){ $obj->write($_POST); }
Dans simpleCMS.php, nous aurons l’implémentation de la méthode write() :
public function write($p) { // méthode pour écrire un message }
Pourquoi fait-on cela ? Pour réduire le code dans index.php. Ce fichier sert seulement à la gestion, tandis que le traitement des tableaux et l’affichage des données doivent être effectués dans un autre fichier, ici celui de notre classe simpleCMS. Cette séparation augmente l’efficacité du code. Si quelqu’un d’autre regarde notre code, il comprendra immédiatement où se trouve quoi. Et cela vous facilite aussi la tâche en ayant tout bien organisé.
Commençons par écrire un traitement simple : afficher notre tableau $_POST reçu du formulaire. Pour cela, insérez ce code :
public function write($p) { // méthode pour écrire un message print_r($p); }
Comme vous voyez, nous utilisons la variable locale $p, bien que la variable superglobale soit transmise en paramètre. Nous n’utilisons pas directement la superglobale car dans d’autres cas, nous pourrions vouloir enregistrer dans le blog non pas via un formulaire mais par exemple via des données reçues d’un fichier XML. Utiliser une variable locale permet d’unifier la méthode pour plusieurs cas.
Remplissez donc le formulaire et envoyez-le. Voici les données que j’ai obtenues :
Array ( [title] => Иван [bodytext] => Привет, Мир! )
Si vous avez rempli autrement, le tableau sera différent. Nous affichons le tableau pour voir quelles clés utiliser. Ici, ce sont $p['title'] et $p['bodytext']. Maintenant que nous connaissons les données, il reste à les écrire dans un fichier. Commençons par écrire dans un fichier.
PHP : écrire dans un fichier
Avant d’écrire dans un fichier, il faut l’« ouvrir en écriture ». Ouvrir en écriture signifie lier le fichier à une variable PHP. Tout travail sur un fichier en PHP se fait par des actions sur une variable de type resource. Voici ce que cela signifie :
public function write($p) { // méthode pour écrire un message $message = fopen("messages/file.txt","w"); print_r($message); }
Pour cela, j’ai créé un fichier file.txt dans le dossier messages. Si vous remplissez le formulaire et l’envoyez, vous obtenez :
Resource id #4
Resource est le type de variable $message, 4 est son identifiant parmi les autres variables resource. Maintenant, toute action sur la variable $message affectera automatiquement le fichier. Nous allons écrire ligne par ligne, pour pouvoir ensuite lire ligne par ligne :
public function write($p) { // méthode pour écrire un message $message = fopen("messages/file.txt","w"); fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); }
Les caractères \r\n en guillemets doubles (en simples ça peut ne pas marcher) signifient saut de ligne, donc dans file.txt on aura :
Иван
Привет, Мир!
Après avoir fini avec le fichier, il faut fermer la variable fichier pour libérer la mémoire :
public function write($p) { // méthode pour écrire un message $message = fopen("messages/file.txt","w"); // ouvrir le fichier fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); fclose ($message); // fermer le fichier }
Vous avez sûrement remarqué qu’à chaque écriture le fichier est réécrit à zéro. Cela dépend du paramètre de fopen. On peut aussi ajouter à la fin du fichier ou juste ouvrir pour lecture, par exemple :
$message = fopen("messages/file.txt","r"); // ouvrir fichier en lecture seulement
- r – ouverture en lecture seule.
- r+ - ouverture en lecture et écriture.
- w – création d’un nouveau fichier vide. Si le fichier existe déjà, il est détruit.
- w+ - comme r+, mais si le fichier existe, son contenu est supprimé.
- a – ouvre un fichier existant en écriture, le curseur est placé à la fin du fichier.
- a+ - ouvre un fichier en lecture/écriture, curseur placé à la fin, contenu non supprimé.
Comme dit plus haut, ouvrir un fichier avec w crée un nouveau fichier dont le nom est donné en premier paramètre. Créons donc un nom de fichier correspondant au temps obtenu avec la fonction time().
La fonction time() retourne le nombre de secondes depuis le 1er janvier 1970.
Voici ce que cela donne :
public function write($p) { // méthode pour écrire un message $message = fopen('messages/'.time(),"w"); // ouvrir fichier fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']. "\r\n"); fputs ($message, time()); fclose ($message); // fermer fichier }
Ainsi, chaque seconde, la fonction time() renvoie un nombre croissant, donc les noms des fichiers seront de plus en plus grands. Vous pouvez essayer d’ajouter de nouvelles entrées et voir les fichiers apparaître dans le dossier messages. Il reste maintenant à lire les fichiers et afficher nos entrées.
PHP : lecture de fichier
Pour lire un fichier, il faut l’ouvrir en lecture avec fopen() et le paramètre r. Tous les fichiers nécessaires sont dans le dossier messages. Pour lire tous les fichiers, on utilisera une boucle while (tant que les fichiers existent).
Pour parcourir les fichiers dans un dossier, on utilise la fonction opendir() qui ouvre un dossier en lecture :
if (is_dir('messages')) { // vérifier que le dossier existe if ($dh = opendir('messages')) { // ouvrir dossier en lecture while (($file = readdir($dh)) !== false) { // tant que des fichiers existent, on les lit // effectuer les opérations nécessaires } closedir($dh); // fermer le dossier } }
Les noms des fichiers sont obtenus par readdir(), ils sont stockés dans la variable $file. Après la boucle, on ferme le dossier pour libérer la mémoire.
Maintenant que nous pouvons lire les fichiers, améliorons la méthode display_public() :
public function display_public() { // méthode d’affichage des messages $content = ''; if (is_dir('messages')) { // vérifier que le dossier existe if ($dh = opendir('messages')) { // ouvrir dossier en lecture while (($file = readdir($dh)) !== false) { // tant que des fichiers existent, on les lit if(substr($file, -4) == '.txt'){ // ne prendre que les fichiers .txt $filename = 'messages/' . $file; // nom complet du fichier $message = fopen($filename, 'r'); // ouvrir fichier $title = fgets($message); // lire première ligne $body = fgets($message); // lire deuxième ligne $time = fgets($message); // lire troisième ligne print '<div class="post">'; // div englobant le message print '<span class="time">' . date('d-m-Y', $time) . '</span><h2>' . $title . '</h2>'; // afficher date et titre print '<p>' . $body . '</p>'; // afficher texte print '</div>'; // fin div fclose($message); // fermer fichier } } closedir($dh); // fermer dossier } } $content .= '<p><a href="/index.php?admin=1">Ajouter un message</a></p>'; return $content; }
J’ai commenté chaque ligne, si quelque chose n’est pas clair, écrivez en commentaire, je vous expliquerai.
Je ne pense pas que la lecture ligne par ligne de fichiers soit souvent nécessaire en pratique, mais pour comprendre les principes des fonctions PHP, la gestion des fichiers et dossiers, ce type de leçon est très utile.
Ci-dessous, le code source du site intermédiaire.