PHP - MySQL [Retour au menu]
Ouverture, lecture et écriture dans les fichiers

Ouverture de fichiers avec fopen, modes d'ouverture, lecture du contenu avec fgets, feof et while, fermeture avec fclose, interaction d'un formulaire sur un fichier

Remarque générale : Nous verrons que toutes les fonctions se rapportant aux fichiers commencent par f : fclose, feof, fopen, ...

Récupération de l'ensemble d'un fichier dans une seule grosse variable texte

$contenu = fread(fopen("test.txt", "r"), filesize("test.txt"));
echo $contenu;

Récupération de l'ensemble d'un fichier dans un tableau

$contenu_array = file("test.txt");
echo $contenu_array[0];
echo $contenu_array[1];
...

Ouverture d'un fichier avec fopen

Nous allons simplement ouvrir un fichier en lecture :

$MonFichier = fopen("listechiffre.txt","r"); //lecture

le premier paramètre est évidemment le nom du fichier, le 2ème ("r") représente de mode d'ouverture de ce fichier. Voici les paramètres possibles

r  ouverture en lecture seulement
ouverture en écriture seulement (la fonction crée le fichier s'il n'existe pas)
a  ouverture en écriture seulement avec ajout du contenu à la fin du fichier (la fonction crée le fichier s'il n'existe pas)
r+ ouverture en lecture et écriture
w+ ouverture en lecture et écriture (la fonction crée le fichier s'il n'existe pas)
a+ ouverture en lecture et écriture avec ajout du contenu à la fin du fichier (la fonction crée le fichier s'il n'existe pas)

ATTENTION : Pour pouvoir ouvrir un fichier en écriture, il est indispensable de donner les permissions nécessaires d'écriture à ce fichier. Par exemple, pour ce fichier listechiffre.txt, il faut que j'aille dans l'explorateur Windows, et que j'accède à mon site www.info-3000.com via FTP (ftp://www.info-3000.com). Une fois que je vois mon fichier distant, je clique avec le bouton droit de la souris sur listechiffre.txt, et je donne la permission en écriture pour All Users, et après ça fonctionne :

Lecture d'un fichier : fgets

Une fois le fichier assigné à une variable, on peut l'accéder avec fgets

Le fichier listechiffre.txt contient :

Première ligne
Ligne Deux
Ligne Trois
Dernière ligne

$ListeChiffre = fopen("listechiffre.txt","r");
$Partie = fgets($ListeChiffre, 1000);

1000 est le nombre de caractères extraits. De toute façon, fgets ne lira pas plus d'une ligne à la fois. $Partie contiendra donc :

Première ligne

Si on avait remplacé 1000 par 3, àPartie aurait contenu Pre.Il semblerait que la plus grande valeur admise pour le nombre de caractères lus est 4096.

Lecture d'un fichier ligne par ligne jusqu'à la fin : feof

la valeur de feof ne vaut simplement rien tant qu'on est pas arrivé à la fin du fichier

$ListeChiffre = fopen("listechiffre.txt","r");
$Partie = fgets($ListeChiffre, 1000);
echo "1. $Partie ," , feof($ListeChiffre) , "<BR>"; //Première ligne
$Partie = fgets($ListeChiffre, 1000);
echo "2. $Partie ," , feof($ListeChiffre) , "<BR>"; // Ligne Deux
$Partie = fgets($ListeChiffre, 1000);
echo "3. $Partie ," , feof($ListeChiffre) , "<BR>"; // Ligne Trois
$Partie = fgets($ListeChiffre, 1000);               // LECTURE DE LA DERNIERE LIGNE
echo "4. $Partie ," , feof($ListeChiffre) , "<BR>"; // Dernière ligne
$Partie = fgets($ListeChiffre, 1000);
echo "5. $Partie ," , feof($ListeChiffre) , "<BR>"; // plus rien mais pas d'erreur

L'affichage serait :

1. Première ligne ,
2. Ligne Deux ,
3. Ligne Trois ,
4. Dernière ligne ,1
5. ,1

Lecture automatique avec while :

Ce code affiche les lignes d'un fichier du début à la fin.

$ListeChiffre = fopen("listechiffre.txt","r");
while (!feof($ListeChiffre))
  {
  echo fgets($ListeChiffre, 1000) , "<BR>";
  }

Ecriture dans un fichier avec fputs

fputs($ListeChiffre, "\n"); // on va a la ligne

Attention : Le "\n" donne un résultat satisfaisant dans le navigateur, mais lors de l'ouverture du fichier dans le bloc-notes, un petit carré apparait en lieu et place du saut de ligne et ça ne passe pas à la ligne.

fputs($ListeChiffre, "Grande échelle");

Fermeture d'un fichier avec fclose

La fermeture d'un fichier est très importante, ne fût-ce que parce que c'est à ce moment qu'il se met à jour. Il ne sert à rien d'écrire dans un fichier texte si ensuite on ne le ferme pas : les modifications ne seront pas prises en compte.

Exemple complet

Avant de commencer l'exemple, il faut bien entendu qu'il y ait un fichier listechiffre.txt qui contient Un et à la ligne Deux
  1. Ouverture d'un fichier listechiffre.txt en ajout de données (a+) qui contient déjà les données suivantes :
    Un
    Deux
  2. Ajout d'une nouvelle ligne : Réverbère
  3. Fermeture du fichier
  4. Ouverture du fichier en lecture
  5. Affichage de "Début de fichier"
  6. Affichage de tout le fichier, ligne par ligne
  7. Affichage de "Fin de fichier"

Comme ceci :

Début de fichier :
Un
Deux
Réverbère

Fin de fichier

Code source :

<?
// Ouverture du fichier et ajout du réverbère :
$ListeChiffre = fopen ("listechiffre.txt" , "a+");
fputs ($ListeChiffre , "\n");
fputs ($ListeChiffre , "Réverbère");
fclose ($ListeChiffre);

// Réouverture du fichier et affichage de celui-ci, ligne par ligne
$ListeChiffre = fopen ("listechiffre.txt" , "r");
echo "Début de fichier : <BR>";
while (!feof($ListeChiffre))
  {
  echo fgets($ListeChiffre, 1000);
  echo "<BR>";
  }
echo "Fin de fichier";
fclose ($ListeChiffre);
?>

Interaction d'un formulaire sur un fichier

Remarque introductive : Nous allons utiliser 3 fichiers :

      1. fichierclient.txt (liste réelle des clients)
      2. entreedonnees.htm (formulaire de saisie des nouveaux clients)
      3. confirmation.php (ajout des nouveaux clients dans fichierclient.txt, et affichage de son contenu)

L'exemple qui suit affiche un formulaire qui demande le nom et le prénom. Quand on clique sur le bouton Submit, on ouvre un fichier fichierclient.txt qui contient seulement une ligne : Nom,Prénom en lecture/ajout (a+), et on ajoute dans une nouvelle ligne le nom virgule le prénom, comme ceci :

Muller,André

Ce qui fait qu'à chaque fois qu'on exécute la page contenant le formulaire et qu'on clique sur SUBMIT, le nouveau client s'ajoute en dessous des autres. Lorsqu'on arrive sur la page de confirmation, on va afficher le contenu du fichier FichierClient.txt qui pourrait ressemble à ça avec 2 clients quelconques :

Nom,Prénom
Martin,Jean
Muller,Michel

Avant de continuer, il est nécessaire d'avoir créé un fichier texte fichierclient.txt dont le contenu est juste : Nom,Prénom

1. Création du fichier contenant le formulaire : entreedonnees.htm

Ce fichier ne contiendra pas une once de PHP, comme nous l'avons déjà vu dans la page concernant les formulaires :

<body>
  <form method="post" action="confirmation.php">
    Votre nom :    <input type="text" name="EDINom"   > <BR>
    Votre Prénom : <input type="text" name="EDIPrenom"> <BR>
    <input type="submit"              name="Submit"   value="Envoyer">
  </form>
</body>

Nous nous contentons d'assigner les contenus des 2 champs aux variables respectives EDINom et EDIPrenom.

2. Création du fichier PHP qui va recevoir les 2 variables EDINom et EDIPrenom

C'est dans ce fichier que le code PHP va remplir le fichier fichierclient.txt.

Remarque : Maintenant, était-ce bien nécessaire d'avoir un 2ème fichier pour remplir le fichier fichierclient.txt? Peut-être pas, mais je ne connais pas les autres paramètres de action="????????", ou plutôt je n'ai pas cherché pour être honnête !

<?
  // Ajout du nouveau nom et prénom, séparés par une virgule, et terminés par un saut de ligne :  
  $FichierClient = fopen ("fichierclient.txt" , "a+");
  fputs ($FichierClient , "\n");
  fputs ($FichierClient , $EDINom);
  fputs ($FichierClient , ",");
  fputs ($FichierClient , $EDIPrenom);
  fclose ($FichierClient);

  //Lecture séquentielle du fichier et affichage, ligne par ligne du contenu :  
  $FichierClient = fopen ("fichierclient.txt" , "r");
  while (!feof($FichierClient))
    {
    echo fgets ($FichierClient, 4096);
    echo "<BR>";
    }
  fclose ($FichierClient);
?>

---