Créer et écrire dans un fichier en PHP

Télécharger le PDF du cours


Livret PDF du cours PHP et MySQL
Dans la leçon précédente, nous avons appris à ouvrir un fichier et avons découvert l’importance du mode d’ouverture qui va conditionner les opérations qu’on va pouvoir effectuer sur le fichier ouvert.

Nous avons également appris à gérer la place du pointeur, ce qui va se révéler essentiel pour écrire dans un fichier en PHP contenant déjà du texte.

Dans cette nouvelle leçon, nous allons apprendre à créer un fichier et à écrire dans un fichier vierge ou contenant déjà du texte.

 

Créer et écrire dans un fichier en PHP : les méthodes disponibles

Il existe différentes façons de créer un fichier et d’écrire dans un fichier déjà existant ou pas et contenant déjà du texte ou pas en PHP.

Les deux façons les plus simples vont être d’utiliser soit la fonction file_put_contents(), soit les fonctions fopen() et fwrite() ensemble.

Notez déjà que l’utilisation des fonctions fopen() et fwrite() va nous donner plus de contrôle sur notre écriture, en nous permettant de choisir un mode d’ouverture, d’écrire à un endroit du fichier, etc.

 

Écrire dans un fichier avec file_put_contents()

La fonction file_put_contents() va nous permettre d’écrire simplement des données dans un fichier.

Cette fonction va accepter en argument le chemin vers le fichier dans lequel on doit écrire les données, les données à écrire (qui peuvent être une chaine de caractères ou un tableau) ainsi qu’un drapeau (nous reviendrons là-dessus plus tard).

Si le fichier spécifié dans le chemin du fichier n’existe pas, alors il sera créé. S’il existe, il sera par défaut écrasé, ce qui signifie que ses données seront supprimées.

Vous pouvez déjà noter qu’appeler file_put_contents() correspond à appeler successivement les fonctions fopen(), fwrite() et fclose().

Utilisons immédiatement cette fonction pour écrire dans un premier fichier :

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            file_put_contents('exemple.txt', 'Ecriture dans un fichier');
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

On utilise la fonction file_put_contents pour ajouter du texte dans un fichier en PHP

Ici, on passe le chemin de fichier exemple.txt à notre fonction file_put_contents(). On va donc chercher un fichier qui s’appelle exemple.txt et qui se situe dans le même répertoire que notre script.

Comme ce fichier n’existe pas, il va être créé et le texte précisé en deuxième argument de notre fonction va être inséré dedans.

Note : Pensez bien à exécuter votre script en rechargeant l’URL de la page dans votre navigateur à chaque fois pour que les différentes opérations dans le script s’exécutent bien !

Si on essaie maintenant de répéter l’opération et d’écrire un texte différent dans notre fichier, on s’aperçoit que le nouveau texte remplace l’ancien qui est écrasé. C’est le comportement par défaut :

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php       
            file_put_contents('exemple.txt', 'Ecriture dans un fichier');
            file_put_contents('exemple.txt', '**NOUVEAU TEXTE**');
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

En utilisant plusieurs fois file_put_contents pour écrire du texte dans un fichier en PHP on efface le texte précédent

Pour « ajouter » du texte à notre fichier, une astuce simple consiste ici à récupérer le texte d’origine de notre fichier dans une variable, puis à le concaténer avec le texte qu’on souhaite écrire dans notre fichier, puis à passer le nouveau texte à file_put_contents(). L’ancien contenu du fichier sera alors remplacé par le nouveau comme précédemment.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            //On écrit un premier texte dans notre fichier  
            file_put_contents('exemple.txt', 'Ecriture dans un fichier');
            
            //On récupère le contenu du fichier
            $texte = file_get_contents('exemple.txt');
            
            //On ajoute notre nouveau texte à l'ancien
            $texte .= "\n**NOUVEAU TEXTE**";
            
            //On écrit tout le texte dans notre fichier
            file_put_contents('exemple.txt', $texte);
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

On utilise file_put_contents et file_get_contents pour concaténer du texte dans un fichier en PHP

Ici, vous pouvez noter que j’utilise le caractère \n. Celui-ci sert à créer un retour à la ligne en PHP. Ici, on l’utilise donc que notre nouveau texte soit inséré dans la ligne suivante de notre fichier. On est obligés d’utiliser des guillemets plutôt que des apostrophes ici pour que le \n soit bien interprété comme un retour à la ligne par le PHP.

Cette astuce pour rajouter du texte dans un fichier fonctionne mais nous force finalement à faire plusieurs opérations et à écraser le contenu de base du fichier pour placer le nouveau (qui contient le contenu original).

Pour maintenant véritablement conserver les données de base de notre fichier et lui ajouter de nouvelles données à la suite des données déjà précédentes, on va également plus simplement pouvoir passer le drapeau FILE_APPEND en troisième argument de notre fonction file_put_contents().

Un drapeau est une constante qui va correspondre à un nombre. De nombreuses fonctions utilisent des drapeaux différents. Le drapeau ou la constante FILE_APPEND va ici nous permettre d’ajouter des données en fin de fichier (c’est-à-dire à la suite du texte déjà existant) plutôt que d’écraser les données déjà existantes.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            //On écrit un premier texte dans notre fichier  
            file_put_contents('exemple.txt', 'Ecriture dans un fichier');
            
            //On rajoute du texte dans notre fichier
            file_put_contents('exemple.txt', "\n**NOUVEAU TEXTE**", FILE_APPEND);
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

On utilise la fonction file_put_contents et le drapeau file_append pour ajouter du texte en fin de fichier en PHP

Ici, on utilise une première fois file_put_contents() sans le drapeau FILE_APPEND pour écrire Ecriture dans un fichier dans notre fichier. Ce texte va donc écraser les données déjà présentes dans notre fichier. Ensuite, on rajoute un autre texte en utilisant notre drapeau.

 

Créer un fichier PHP avec fopen()

Pour créer un nouveau fichier en PHP (sans forcément écrire dedans), nous allons à nouveau utiliser la fonction fopen(). En effet, rappelez-vous que cette fonction va pouvoir créer un fichier si celui-ci n’existe pas à condition qu’on utilise un mode adapté.

Pour créer un fichier avec fopen(), nous allons devoir lui passer en arguments un nom de fichier qui sera le nom du fichier créé ainsi qu’un mode d’ouverture adapté. En mentionnant simplement cela, le fichier sera par défaut créé dans le même dossier que notre page PHP.

Essayons immédiatement de créer un fichier qu’on va appeler exemple2.txt.

On crée un nouveau fichier en PHP avec fopen

Ici, nous créons un nouveau fichier avec le mode c+. Le fichier est donc accessible en lecture et en écriture et si celui-ci existait et contenait déjà des informations, celles-ci ne seraient pas effacées à la différence du mode w+.

On pense bien également à rajouter l’option b (pour binaire) afin de maximiser la compatibilité pour les différents systèmes.

Bien évidemment, afin de véritablement créer le fichier, le code de votre page doit être exécuté. Pensez donc bien toujours à ouvrir votre fichier .php dans votre navigateur pour exécuter le script au moins une fois.

Une fois cela fait, vous pouvez aller vérifier dans le dossier contenant votre page PHP qu’un fichier nommé exemple2.txt a bien été créé.

 

Écrire dans un fichier avec fwrite()

Une fois un fichier ouvert ou créé avec fopen(), on va pouvoir écrire dedans en utilisant la fonction fwrite().

Cette fonction va prendre la valeur retournée par fopen() ainsi que la chaine de caractères à écrire dans le fichier en arguments.

Si notre fichier est vide, on va très simplement pouvoir écrire du texte dedans :

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $fichier = fopen('exemple2.txt', 'c+b');
            fwrite($fichier, 'Un premier texte dans mon fichier');
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

On écrit dans un fichier vide en PHP avec la fonction fwrite

Dans le cas où le fichier ouvert contient déjà du texte, cela va être un peu plus complexe. En effet, il va déjà falloir se poser la question d’où se situe notre pointeur.

Si on utilise la fonction fwrite() plusieurs fois de suite, le texte va être ajouté à la suite car fwrite() va déplacer le pointeur après le texte inséré après chaque utilisation.

On écrit plusieurs fois d'affilée dans un même fichier en PHP en utilisant plusieurs fois fwrite

En utilisant plusieurs fois fwrite dans un fichier vide, le texte s'ajoute en fin de fichier

Le problème va si situer lors de la première utilisation de fwrite() dans un fichier qui contient déjà du texte. En effet, la plupart des modes de fopen() vont placer le curseur en début de fichier. Les informations vont donc être écrites par-dessus les anciennes.

Regardez plutôt l’exemple suivant.

On utilise plusieurs fois fwrite en PHP pour écrire du texte dans un fichier qui contient déjà du texte

En utilisant la fonction PHP fwrite dans un fichier qui contient déjà du texte, le nouveau texte écrase l'ancien

Ici, notre fichier contient le texte « Un premier texte dans mon fichier. Un autre texte » lors de son ouverture. Lors du premier appel à fwrite(), le curseur se situe au début du fichier. Les informations « abc » vont alors être écrites par-dessus celles déjà présentes.

Après sa première utilisation, fwrite() déplace le curseur à la fin du texte ajouté, c’est-à-dire juste derrière le caractère « c ». Si on appelle fwrite() à nouveau immédiatement après, les nouvelles informations vont être insérées après le « c ».

On va ici pouvoir utiliser la fonction fseek() pour modifier la position du pointeur et écrire à partir d’un autre endroit dans le fichier. En faisant cela, le nouveau texte sera écrit à partir d’un certain point dans le fichier. Si on tente d’écrire du texte au milieu du fichier, cependant, les données déjà présentes à cet endroit continueront d’être écrasées.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            /*Notre fichier contient toujours le texte :
             *"abcdefmier texte dans mon fichier. Un autre texte"
             *ajouté précédemment*/
            $fichier = fopen('exemple2.txt', 'c+b');
            fwrite($fichier, 'abc');
            fwrite($fichier, 'def');
            
            //On déplace le curseur de 20 octets
            fseek($fichier, 20, SEEK_CUR);
            fwrite($fichier, 'ghijk');
            
            //On place le curseur en fin de fichier
            fseek($fichier, filesize('exemple2.txt'));
            fwrite($fichier, 'lmnop');
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

On peut utiliser une combinaison de fwrite et de fseek en PHP pour écrire à un certin endroit dans un fichier en remplacant l'ancien texte

Si on souhaite rajouter du texte au milieu d’un fichier tout en conservant le texte précédent, nous allons devoir procéder en plusieurs étapes.

L’idée va être ici de récupérer la première partie du texte de notre fichier jusqu’au point d’insertion du nouveau contenu, puis de concaténer le nouveau contenu à ce texte, puis de de récupérer la deuxième partie du texte de notre fichier et de la concaténer au reste avant de finalement écrire le tout dans notre fichier.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            /*On appelle fopen() avec le mode c : le pointeur se situe
             *au début du fichier. Le fichier contient le texte :
             *"abcdefmier texte dans mon ghijker. Un autre textelmnop"*/
            $fichier = fopen('exemple2.txt', 'c+b');
            
            /*On lit les 20 premiers octets du fichier avec fread(), le
             *pointeur se situe là où fread() arrête sa lecture*/
            $texte = fread($fichier, 20);
            
            //On ajoute du texte dans notre variable
            $texte .= ' TEXTE AJOUTE AU MILIEU ';
            
            /*On lit la suite du fichier (fread() reprend sa lecture là où se
             *trouve le pointeur) et on ajoute le texte lu dans $texte*/
            $texte .= fread($fichier, filesize('exemple2.txt'));
            
            /*On replace le pointeur en début de fichier et on écrase l'ancien
             *texte avec le nouveau (qui est plus long)*/
            fseek($fichier, 0);
            fwrite($fichier, $texte);
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

On écrit au milieu d'un fichier en PHP en utilisant fread et fwrite

La chose importante dans le script ci-dessus est de bien toujours suivre le pointeur, qui va être déplacé par certaines de nos fonctions liées aux fichiers.

3 réflexions au sujet de “Créer et écrire dans un fichier en PHP”

  1. Bonjour M. Pierre Giraud
    Je m’appelle M. Hamdi Ben Abdeljlil
    Je tient à vous remercie de votre aide apporter à des personnes qui comme moi qui cherche à apprendre du développement Web d’une façon simple et pratique.
    Je suit vos cours depuis longtemps, j’ai débuter par le HTML, CSS3 et le JavaScript, et pour le moment je suis sur le PHP.
    Ma question:
    Je comprend pas pourquoi je reçoit le message suivant après essai du premier script :

    Titre principal

    Warning: file_put_contents(exemple.txt): failed to open stream: Permission non accordée in /opt/lampp/htdocs/Exemples_PHP/32/exmp_32_01.php on line 12

    Un paragraphe

  2. Bonjour M. Pierre Giraud

    Je croit que j’ai trouver la solution récupèrent les droits sur l’ensemble du dossier « Exemples_PHP » avec la commande :

    (sudo chown -R hbamax /opt/lampp/htdocs/Exemples_PHP)

    Puis j’ai changer les droits de l’ensemble du dossier pour que tous le monde puisse le modifier avec la commande :

    (sudo chmod -R 777 /opt/lampp/htdocs/Exemples_PHP)

    Voilà !
    Que penser vous ?
    Merci

    • Bonjour,

      Le premier warning indique que vous n’avez pas les permissions nécessaires pour effectuer les opérations que vous voulez effectuer. Malheureusement, je ne suis pas familier des systèmes Ubuntu et je ne pourrais donc pas vous dire précisément ce qui doit être fait. Avez vous consulté la doc (https://doc.ubuntu-fr.org/permissions) ? En revanche, on évite généralement de passer les permissions d’un fichier / dossier sur 777 car c’est considéré comme une très mauvaise pratique en termes de sécurité de laisser des accès trop larges.

      Amicalement,

Laisser un commentaire

© Pierre Giraud - Toute reproduction interdite - Mentions légales