Apprendre PHP (16/19) - Manipulation des fichiers

Dans cette leçon vidéo, le formateur explique comment PHP peut être utilisé pour persister des données en les stockant dans des fichiers sur le serveur, en complément ou en alternative aux bases de données. Il montre d'abord comment lire le contenu complet d'un fichier texte avec `filegetcontents`, puis comment gérer les retours à la ligne en utilisant `strreplace` ou la fonction dédiée `nl2br`. Il décrit ensuite l'écriture dans un fichier via `fileputcontents` (ou un flux de sortie) et présente les fonctions d'information sur les fichiers (`fileexists`, `filetype`, `filesize`). Les opérations de copie, suppression et renommage sont illustrées avec `copy`, `unlink` et `rename`, en rappelant l'importance des permissions serveur. Le cours passe ensuite aux fonctions de bas niveau : ouverture de fichiers avec `fopen` et ses différents modes (`r`, `r+`, `w`, `w+`, `a`, `a+`), lecture ligne par ligne avec `fgets` (et contrôle de la longueur), lecture caractère par caractère avec `fgetc`, déplacement du pointeur avec `fseek`, écriture avec `fputs`, et détection de fin de fichier avec `feof` dans une boucle. Enfin, il applique ces notions à un exemple concret : un compteur de visites stocké dans un fichier texte, d'abord simple puis amélioré pour ne compter que les visites uniques grâce aux sessions PHP (`sessionstart`, variable de session `dejavisitee`). Le formateur conclut en rappelant les contraintes de privilèges et l'intérêt de maîtriser la manipulation de fichiers en PHP.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de PHP. Aujourd'hui nous allons voir les fichiers. Tous les programmes que nous avons créés jusqu'ici génèrent des résultats. Il s'agit de valeurs que l'on affiche généralement sur le navigateur de l'utilisateur. Ces valeurs-là sont en réalité créées dans la mémoire vive du serveur et y sont maintenues d'une manière provisoire jusqu'à ce que le script n'en ait plus besoin. Autrement dit, ces données se volatiliseront tôt ou tard et aucune trace de leur création ne subsistera. Cependant, dans certains cas on a besoin de maintenir les données issues de l'exécution d'un programme pour pouvoir les restituer et les réutiliser plus tard. On doit donc les stocker dans la mémoire de masse du serveur plutôt que dans sa mémoire vive. La solution la plus célèbre pour stocker les données est l'utilisation des bases de données. Néanmoins, on peut encore se servir de fichiers texte ou CSV ou encore des fichiers XML, etc. Dans cette leçon, nous allons voir comment se servir des fichiers et comment interagir avec eux via le PHP. J'ai déjà créé un fichier qui s'appelle fichier.txt qui contient le texte suivant: Bonjour, ce fichier contient quelques lignes. Je vais poser ce fichier sur la racine du serveur, c'est-à-dire à côté du fichier index.php que l'on va éditer. Première opération à faire, c'est que l'on va récupérer le contenu entier du fichier txt de la manière suivante: La fonction file_get_content permet de récupérer le contenu du fichier et de le convertir en chaîne de caractères. Dans ce cas, il faut spécifier le chemin vers le fichier, on mettra donc fichier.txt. Notez bien qu'il s'agit d'un chemin qui peut être relatif ou absolu. Alors là, ce que nous avons récupéré, c'est le fichier entier, on va essayer de l'afficher à l'aide de la fonction echo. Exécutons maintenant pour voir le résultat. Alors là, j'ai le contenu du fichier qui est affiché sous forme d'une chaîne de caractères, mais on constate que c'est écrit sur la même ligne bien que le contenu du fichier contient bien des retours à la ligne comme ceci. Mais les retours à la ligne dans le fichier sont représentés par \n. Afin de prendre en compte ces caractères spéciaux, on va ajouter le code suivant. On peut mettre str_replace et on va remplacer \n par \n. Par la balise <br> comme ceci. Maintenant quand j'exécute, ça me donne bien les retours à la ligne qui ont été remplacés par la balise <br>. Sinon on peut faire ça d'une manière plus propre. On va faire appel à la fonction nl_to_br. La fonction nl2br permet de remplacer les caractères \n, ça veut dire une nouvelle ligne, par les balises <br>. On aura donc toujours le même résultat qui ressemble à ceci. Si on veut modifier le contenu du fichier, on mettra FileOutputStream comme ça, et dans ce cas on va ajouter un deuxième paramètre qui représente le nouveau contenu intégré au sein du fichier. On mettra par exemple ici nouveau contenu comme ceci. Exécutons maintenant. Alors on va vérifier maintenant le contenu du fichier et on voit bien que le contenu a changé. Cependant, des fois il est pratique de connaître des informations sur le fichier avant de le manipuler. Dans ce cas, on va faire appel à une série de fonctions que l'on va voir juste après. La première fonction c'est file_exists qui permet de vérifier si le fichier existe ou non comme ceci. Et entre les parenthèses on va spécifier le chemin vers le fichier. file_exists retourne un résultat booléen, c'est-à-dire si le fichier existe il retourne True sinon ça retourne False. Il y a aussi la fonction file_size comme ceci. Qui retourne le type du fichier. On mettra echo pour afficher le résultat. Exécutons maintenant et ça affiche file, c'est-à-dire qu'il s'agit bien d'un fichier et non pas d'un dossier. Mais imaginez maintenant que je veux connaître des informations sur le dossier images que j'ai là. Quand je mets images, ça m'affiche dir pour dire un dossier. Alors filetype, ça retourne généralement soit file ou bien dir pour faire la différence entre un fichier et un dossier. Il y a aussi file_size qui permet de retourner la taille en octets du fichier. Bon, dans ce cas on mettra fichier.txt et ça me retourne 15 octets. Il y a aussi la fonction copy qui permet de copier un fichier et créer ainsi un deuxième fichier qui contient le même contenu. Comme ça, et il faut ajouter un deuxième paramètre qui est le nouveau fichier. Comme ça. Donc quand on exécute, ça affiche 1 parce que c'est le résultat de retour de la fonction copie. Bon, j'écarte carrément parce que ça retourne true si la fonction s'exécute correctement et false sinon. Alors maintenant on imagine que le fichier est créé. Bon, on va se rendre dans dossier pour vérifier. Alors là, nous avons le nouveau fichier qui vient d'être créé et bien sûr ça contient le même contenu que l'ancien fichier. Il y a aussi la fonction unlink qui permet de supprimer un fichier. Dans ce cas, on va supprimer le fichier que l'on vient de créer. Voilà, comme ça. Regardez bien, le fichier est là-dedans. Maintenant, quand j'exécute cette instruction, on va se rendre dans le dossier. Et le fichier a disparu, ça veut dire il a été supprimé. Il y a la fonction rename qui permet de renommer un fichier. Par exemple, on va renommer le fichier qui s'appelle fichier.txt en nouveau-nom.txt. Dans ce cas, ça sera le nouveau nom que l'on donnera au fichier. Exécutons pour voir. Et voilà, maintenant le fichier s'appelle désormais nouveau-nom.txt. Notez bien que les opérations que l'on vient de faire dépendent des privilèges qui ont été attribués par l'administrateur du système, c'est-à-dire l'administrateur du serveur, au script PHP. Parce que le script PHP s'exécute avec des privilèges. Dans ce cas, si vous n'avez pas les privilèges d'accéder à un fichier ou bien de le modifier, alors certaines fonctions de celles que l'on vient de voir ne marcheront pas. Maintenant nous allons voir une série de fonctions qui permettent de manipuler un fichier en profondeur, c'est-à-dire qu'ils peuvent accéder ligne par ligne au fichier voire même caractère par caractère. Tout d'abord on va renommer notre fichier en fichier.txt et on va mettre un nouveau contenu comme ça. Et maintenant on va se rendre dans le fichier index.php. On va exécuter la première fonction qui permet d'ouvrir le fichier. Elle s'appelle fopen. La fonction fopen contient 2 paramètres. Le premier c'est le chemin vers le fichier souhaité, en ce cas c'est fichier.txt, et le deuxième paramètre c'est le mode d'ouverture. On mettra par exemple r pour dire lecture seule. En réalité il y a plusieurs modes pour l'ouverture d'un fichier. Les plus célèbres sont r qui signifie lecture seule, c'est-à-dire que l'on peut lire le fichier mais on peut pas le modifier. Il y a aussi r+w qui signifie lecture et écriture. Dans ce cas, on peut bien modifier le fichier, bien sûr si l'administrateur système nous autorise de faire ça sur le fichier concerné. Il y a aussi w, ça veut dire création et écriture seule. Dans ce cas, si le fichier existe, on va y accéder en écriture seule, sinon il sera créé et on pourra le modifier. w+, c'est création, lecture et écriture. Dans ce cas, si le fichier existe, w+ devient r+, c'est-à-dire lecture et écriture. Sinon, c'est-à-dire s'il n'existe pas, il sera créé et on pourra y accéder en lecture et écriture. Il existe aussi a et a+. Donc a, c'est l'équivalent de w sauf qu'il va mettre le curseur, c'est-à-dire le pointeur, à la fin du fichier. Et a+, c'est l'équivalent de w+ avec la même remarque, c'est-à-dire que l'on va placer le pointeur à la fin du fichier. Bien sûr, on va voir ce que ça signifie le pointeur ou bien le curseur du fichier. Bon, on va mettre dans un premier temps r+ pour dire que l'on va ouvrir le fichier en lecture et en écriture. La fonction fopen retourne un identifiant d'ouverture du fichier. Il s'agit en fait d'une variable type ressource. On mettra ici $fp= fopen. Désormais on va faire appel à la variable $fp dans la suite des fonctions que l'on va voir. La deuxième fonction c'est fgets qui permet de retourner une ligne donnée au sein du fichier et ça retourne bien entendu une chaîne de caractères. On mettra par exemple str qui est notre chaîne égale à fgets Et entre les parenthèses on va mettre fp. Dans ce cas, le fichier quand il est ouvert avec R++, le curseur, c'est-à-dire le pointeur de fichier, est placé au début. Autrement dit, quand je vais exécuter la fonction fgets, je vais retourner la ligne courante, ça veut dire toute la ligne en cours. Maintenant je vais afficher str pour voir ce que ça donne. Donc echo str. Logiquement on devrait afficher fichier texte. Bon, exécutons maintenant. Et ça m'affiche fichier texte. Et si vous voulez pas retourner la ligne entière, on va ajouter un deuxième paramètre qui spécifie la longueur de la chaîne à retourner. Par exemple, on va mettre 3. Dans ce cas, on va retourner 3- 1 octet, ça veut dire 2 octets, à partir de la position courante du curseur, ça veut dire à partir du début du fichier. Donc ça, c'est la position du curseur, on va retourner 2 octets, à savoir 2 caractères, parce que dans ce cas, ces caractères sont codés sur un seul octet. Mais si vous utilisez un système d'écriture multi-octets comme l'arabe ou bien d'autres langues, dans ce cas, un caractère peut être codé sur 2 octets. Donc maintenant exécutons pour voir le résultat. Donc ça nous affiche fi, ça veut dire les 2 premiers caractères. Maintenant une fois qu'on a exécuté cette ligne, on a déplacé systématiquement le curseur du fichier, c'est-à-dire que le curseur désormais est à cette position. Autrement dit, imaginez que je veux lire les 2 prochains caractères, bon il va m'afficher maintenant ch parce que la lecture avec la fonction fgets commence toujours à partir de la position courante du curseur ou bien du pointeur. Maintenant imaginez avec moi qu'on a mis la position 30. Bon, on sait bien que la première ligne contient moins de 30 caractères, alors on a tendance à croire que l'on va poursuivre la lecture sur la ligne prochaine, mais c'est pas ce qui va vraiment arriver parce que la fonction fgets est interrompue par un retour à la ligne. Alors une fois on rencontre \n, on arrête la lecture. Bon, exécutons pour voir. On a toujours fichier texte qui est affiché bien que sa longueur est inférieure à 30 qu'on a spécifié. Donc maintenant imaginez que j'ai mis 3. Ensuite je vais exécuter une autre fonction qui est fgetc. Je mets directement echo et je mets uniquement l'identifiant d'ouverture du fichier, ça veut dire pas de longueur. Dans ce cas fgetc retourne un seul caractère qui est indexé par le pointeur du fichier. Bon, quand j'exécute J'ai FIC qui est écrit. En réalité, cette ligne a retourné les 2 premiers caractères et cette instruction fgetc m'a retourné le caractère C. Alors désormais le curseur est ici, ça veut dire si je veux lire la suite, je vais commencer à partir du caractère H. Et si par hasard je veux manipuler la position du curseur, je fais appel à la fonction fseek, comme ça. Premier paramètre, c'est l'identifiant d'ouverture du fichier. Deuxième paramètre, c'est la position souhaitée. Donc maintenant, quand je mets 0 et quand je remets echo fgetc fp, alors j'imagine que le curseur maintenant est placé ici. Alors ça va encore m'afficher f. Alors voilà ce qu'on a, fic et ensuite le f. Et si vous voulez écrire dans le fichier, donc on va faire appel à la fonction fputs qui contient 2 paramètres. Le premier, c'est l'identifiant d'ouverture du fichier. Deuxième paramètre, c'est la chaîne à écrire, par exemple ABC. Donc maintenant, exécutons pour voir ce que ça donne. Donc là, c'est le résultat avant l'écriture, mais si on jette un coup d'œil sur le fichier pour voir ce qu'il contient, Il contient désormais abc et la suite de la chaîne. Ça veut dire qu'on a écrasé les 3 premiers caractères par abc. Et figurez-vous qu'on a d'abord déplacé le curseur au début, c'est-à-dire que l'écriture est effectuée à partir du début du fichier, ça veut dire le début de la première ligne. Maintenant imaginez que je veux retourner le contenu du fichier en entier. Au lieu d'utiliser la fonction file_get_contents, on peut toujours utiliser la fonction fgets, mais il faut vérifier si on n'a pas atteint la fin du fichier à l'aide de la fonction feof, comme ça. Avec l'identifiant d'ouverture du fichier fp. Dans ce cas, la fonction feof permet de retourner un résultat booléen. Si on a atteint la fin du fichier, il retourne true, sinon il retourne false. Alors il suffit de programmer une boucle et vérifier si on n'a pas encore atteint la fin du fichier. On mettra donc quelque chose qui ressemble à ça: while, ça veut dire tant qu'on n'a pas atteint la fin du fichier, Le traitement à faire est le suivant: echo fgets, et on mettra l'identifiant d'ouverture du fichier et la longueur souhaitée. Sinon, on va pas spécifier la longueur pour dire que l'on veut retourner la ligne entière. Exécutons maintenant pour voir le résultat. Et ça me retourne le contenu du fichier en entier mais sur la même ligne. Bon, si je veux qu'il me retourne ça sur plusieurs lignes, alors comme tout à l'heure, on va mettre nl2br. Et maintenant ça m'affiche le contenu avec la prise en compte des retours chariot. Maintenant on va faire un exemple, on va essayer de programmer un compteur de visites. Autrement dit, la page courante qui est index.php, on va afficher combien de fois elle a été visitée. Le résultat du compteur sera bien sûr déposé dans le fichier texte que l'on a créé. Alors première chose à faire, c'est qu'on va modifier le contenu du fichier texte. On va mettre la valeur 0 pour dire qu'initialement la page index.php n'a été visitée aucune fois. Maintenant dans le fichier index.php, on va mettre le code suivant. Bon, tout d'abord c'est l'ouverture du fichier en mode lecture et écriture parce qu'on a besoin de lire le contenu et de le modifier aussi. Ensuite on va récupérer la ligne courante, ça veut dire la première ligne qui contient le nombre 0 dans ce cas. On mettra donc str= fgetfp. Alors désormais str vaut la valeur 0, ça veut dire la valeur de la chaîne de caractères qui est contenue dans la première ligne. Ensuite on va incrémenter str comme ceci. Alors désormais str vaut la valeur 1. Il faut maintenant placer la valeur 1 dans le fichier, mais si on écrit directement dans le fichier on va écrire 1 à côté du 0 parce que le curseur maintenant il est là. Alors ce qu'il faut faire c'est qu'on va remettre le curseur au début et ensuite on va écraser 0 et le remplacer par 1. On mettra donc là fseek fp0 pour dire que l'on a placé le curseur au début de la ligne et ensuite on va écrire la valeur de str avec fputs. Alors là on imagine que l'on a écrasé 0 et on l'a remplacé par 1. Maintenant il suffit d'afficher la valeur du compteur sur la page index.php. Par exemple echo Comme ceci. Donc cette page a été visitée str fois, sachant que str c'est une variable scalaire qui va être évaluée même au sein de la chaîne de caractères. On exécute. Donc maintenant ça me donne cette page a été visitée une fois, 2 fois, 3 fois. Et si on vérifie le contenu du fichier texte, on va voir qu'il contient désormais la valeur 3. Ça veut dire qu'il a été modifié automatiquement par PHP. Juste une chose, c'est que vous avez remarqué que je peux abuser du compteur et je peux gonfler la valeur d'une manière incontrôlée. Bon, chaque fois j'actualise, bon, ça augmente. Ce qu'on va faire, c'est qu'on va essayer de contrôler le nombre de visites uniques. Autrement dit, si un utilisateur se connecte pour la première fois, alors le compteur sera incrémenté. Et s'il actualise la page, dans ce cas le compteur va rester inchangé. On appelle ça des visites uniques. Alors on peut faire ça soit via les cookies ou bien par les variables de session. Bon, je préfère le faire avec les variables de session comme ceci. Alors première chose à faire c'est session_start. Donc dans tous les cas on va afficher la valeur du compteur. Mais quand est-ce qu'on va modifier sa valeur et le déposer dans le fichier texte? C'est uniquement quand la session est nouvelle. On mettra donc ici un truc du genre. Ça veut dire ce traitement-là, on va le conditionner. On mettra par exemple if Session déjà visitée, c'est une variable de session que j'ai créée qui s'appelle déjà visitée. Dans ce cas, cette variable n'existe pas. Et quand est-ce qu'existera-t-elle? C'est quand la page aura été visitée. Alors je mettrai ici différent de oui. Bien entendu, cette variable dans un premier temps est différente de oui, c'est normal lors de la première connexion parce qu'il n'existe même pas. Alors on va mettre ici des accolades. Pour délimiter le traitement. Et maintenant, après avoir visité cette page, on va initialiser la valeur de session déjà visitée. Et maintenant, on lui donne la valeur oui, c'est-à-dire que la prochaine fois que je vais actualiser la page, je vais vérifier si la condition a évolué. Alors, elle n'a plus évolué parce que maintenant déjà visitée vaut vraiment oui. Oui. Et bien entendu, on aura une notification que l'on peut échapper avec le caractère@. Exécutons maintenant pour voir le résultat. Donc ça me donne 16. Et quand j'actualise, le compteur ne change pas. Par contre, si j'efface l'historique, alors j'ai supprimé l'identifiant de la session sur le navigateur. Dans ce cas, ça va s'actualiser. Mais la prochaine fois, ça va pas s'actualiser. Alors j'espère que vous avez compris maintenant le principe de l'utilisation des fichiers en PHP. On se contente de ça pour cette séance. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









