Créée le, 19/06/2015

 Mise à jour le, 12/05/2019

Visiteurs N°  




Accueil
Nouveau Blog Nouveautés Moteur de Recherche Votre Caddie Pour Vos Achats Votre Espace Membre Vos Signets et Vos Jeux Préférés Page de Bienvenue Statique Site en Français Site en Anglais
Sommaires
Électronique Fondamentale Technologie Fondamentale Testez vos Connaissances Électronique Théorique Digitale Électronique Pratique Digitale Lexique Électronique Numérique Data book TTL Data book CMOS Dépannage TVC Mathématique
Micro-ordinateurs
Théorique des Micro-ordinateurs Testez vos Connaissances Pratique des Micro-ordinateurs Glossaires sur les Ordinateurs
Physique
La lumière Champ d'action Rayonnement Électromagnétique
Technologies
Classification des Résistances Identification des Résistances Classification des Condensateurs Identification des Condensateurs
Formulaires Mathématiques
Géométrie Physique 1. - Électronique 1. 2. - Électronique 1. 3. - Électrotechnique 1. 4. - Électromagnétisme
Accès à tous nos Produits
E. T. F. - Tome I - 257 Pages E. T. F. - Tome II - 451 Pages E. T. F. - Tome III - 611 Pages E. T. D. - Tome I - 610 Pages N. B. M. - Tome I - 201 Pages E. T. M. - Tome I - 554 Pages Business à Domicile Ouvrages 34 pages gratuits Nos E-books Logiciel Géométrie Logiciel Composants Électroniques
Aperçu de tous nos Produits
E. T. F. - Tome I - 257 Pages E. T. F. - Tome II - 451 Pages E. T. F. - Tome III - 611 Pages E. T. D. - Tome I - 610 Pages E. T. M. - Tome I - 554 Pages Logiciel Géométrie Logiciel Composants Électroniques
Nos Leçons aux Formats PDF
Électronique Fondamentale Technologie Fondamentale Électronique Théorique Digitale Électronique Pratique Digitale Théorique des Micro-ordinateurs Mathématiques
Informatique
Dépannage Win98 et WinXP et autres Dépannage PC Glossaire HTML et Programmes PHP et Programmes JavaScript (en cours de travaux) Création de plusieurs Sites
Forums
Forum Électronique et Infos Forum Électronique et Poésie
Divers et autres
Formulaire des pages perso News XML Statistiques CountUs Éditeur JavaScript Nos Partenaires et nos Liens Utiles Gestionnaire de Partenariat Nos Partenaires MyCircle Sondages 1er Livre d'Or 2ème livre d'Or

Signets :
  Leçons suivantes        Leçons précédentes     Bas de page
  Cliquez ici pour la leçon suivante ou dans le sommaire prévu à cet effet


Ouverture d'un fichier, en vue d'une lecture fopen(), feof(), fgets(), fgetss(), fgetcsv() readfile(), fpassthru(), file(), et autres fonctions de fichier utiles (2ème partie) :



Ouverture d'un fichier en vue d'une lecture ; fopen() :

Là aussi, l'ouverture du fichier s'effectue au moyen de la fonction fopen(). Dans ce cas, toutefois, c'est le mode de fichier "r" qui est spécifié, indiquant à l'interpréteur PHP que le fichier doit être ouvert en lecture seule.

    @ $fp = fopen ("Orders/Commandes.txt", "r") ;

Lorsque l'appel de la fonction fopen() échoue, celle-ci renvoie la valeur false. Vous pouvez traiter l'erreur survenue avec plus de convivialité, en supprimant le message d'erreur PHP, et en générant votre message d'erreur.

A noter : La présence du symbole @ avant l'appel de la fonction fopen() informe l'interpréteur PHP qu'il doit supprimer toute erreur résultant de l'appel de la fonction. Notez que le symbole @ doit être placé tout au début de la ligne.

Détermination du moment où doit s'arrêter la lecture ; feof() :

Dans le listing de l'exemple 4, (en bas de page) à l'adresse suivante, en cliquant ici, une boucle while est utilisée pour lire le fichier jusqu'à sa fin. Cette boucle teste si la fin du fichier est atteinte au moyen de la fonction feof() :

    while (!feof($fp)) // File End Of File, Cette boucle teste si la fin du fichier est atteinte

La fonction feof() prend comme seul paramètre un pointeur sur le fichier. Elle renvoie true si le pointeur est positionné à la fin du fichier, et false dans tous les autres cas. Le terme feof est l'abréviation de l'expression "File End Of File" (fichier fin de fichier).

Dans notre exemple (comme en général dans toutes les situations de lecture dans un fichier), la lecture du contenu se poursuit jusqu'à la rencontre de la fin du fichier (EOF).

Lecture d'une ligne à la fois ; fgets(), fgetss() et fgetcsv() :

Dans le listing de l'exemple 4, la fonction fgets() est utilisée pour lire le contenu du fichier :

    $char = fgets($fp, 100) // Lit le contenu du fichier ligne par ligne

La fonction fgets() s'emploie pour lire une ligne à la fois dans un fichier. Dans notre exemple, la lecture se poursuit jusqu'à ce que l'interpréteur rencontre un caractère de nouvelle ligne (\n), un EOF, ou jusqu'à ce que 99 octets aient été lus dans le fichier. Le nombre maximal d'octets lus est la longueur spécifiée diminuée de un octet (100 - 1 = 99).

En programmation PHP, plusieurs fonctions sont disponibles pour lire le contenu d'un fichier. La fonction fgets() convient bien aux fichiers contenant du plein texte, et qui doivent être traités par morceaux.

La fonction fgetss() constitue une variante intéressante de la fonction fgets(). Son prototype est le suivant :

    string fgetss (int fp, int longueur, string [balises_autorisées]) ;

fgetss() est très semblable à fgets(), si ce n'est qu'elle provoque l'exclusion de toute balise PHP et HTML contenue dans la chaîne fournie comme argument (fp). Pour laisser subsister des balises particulières, il suffit de les spécifier dans la chaîne balises_autorisées.

La fonction fgetss() s'utilise par mesure de sécurité lors de la lecture d'un fichier écrit par un tiers, ou contenant des données saisies par l'utilisateur. Laisser subsister du code HTML dans un fichier peut en effet, nuire malencontreusement à une mise en forme planifiée avec soin. D'autre part, laisser subsister du code PHP dans un fichier peut permettre à un utilisateur malin d'accéder à votre serveur.

La fonction fgetcsv() est une autre variante de la fonction fgets(). Son prototype est le suivant :

    array fgetcsv (int fp, int longueur, string [délimiteur]) ;

La fonction fgetcsv() s'emploie pour scinder les lignes d'un fichier, lorsqu'un caractère de délimitation a été utilisé (par exemple un caractère de tabulation comme dans l'exemple considéré ici, ou une virgule comme dans de nombreux fichiers générés par des tabulateurs et autres applications). Ainsi, fgetcsv() permet facilement de reconstruire séparément les variables d'une commande, plutôt que sous la forme d'une ligne de texte. fgetcsv() s'utilise de la même manière que fgets(), si ce n'est que le délimiteur utilisé pour séparer les champs doit lui être passé comme argument. L'instruction est la suivante :

    $char = fgetcsv ($fp, 100, "\t") ;

Provoque la lecture d'une ligne du fichier, et la scission de cette ligne chaque fois qu'une tabulation (\t) est rencontrée. Le résultat obtenu est renvoyé sous forme de tableau $char dans le listing de l'exemple 4. Les tableaux seront traités en détail dans la prochaine leçon.

La valeur du paramètre longueur doit être choisie de manière à être supérieure au nombre de caractères de la ligne la plus longue du fichier.

Lecture de l'intégralité du contenu d'un fichier ; readfile(), fpassthru(), file() :

Au lieu de lire un fichier ligne par ligne, vous pouvez lire le contenu d'un fichier d'un seul trait. Pour cela, différents possibilités se présent à nous !

La première méthode envisageable consiste à utiliser la fonction readfile(). Le code du listing de l'exemple 4, pourrait être remplacé par une seule et même instruction :

    readfile ("Orders/Commandes.txt") ;

L'invocation de la fonction readfile() provoque l'ouverture du fichier, l'impression du contenu du fichier sur la sortie standard (le navigateur Web), puis la fermeture du fichier. Cette fonction a le prototype suivant :

    int readfile (string nom_du_fichier, int [utiliser_include_path]) ;

Le deuxième paramètre de la fonction readfile() est optionnel, et il spécifie si l'interpréteur PHP doit rechercher le fichier dans le include_path. Ce paramètre fonctionne de la même manière que dans la fonction fopen(). La fonction readfile() renvoie le nombre total des octets lus dans le fichier.

La deuxième méthode envisageable pour lire l'intégralité d'un fichier consiste à utiliser la fonction fpassthru(). Dans ce cas, la fonction fopen() doit être préalablement mise en oeuvre pour ouvrir le fichier. La fonction fpassthru() envoie vers la sortie standard le contenu du fichier compris entre la position du pointeur et la fin du fichier. Elle ferme le fichier une fois qu'elle en a terminé.

Le script du listing de l'exemple 4, (en cliquant ici) peut ainsi être remplacé par les deux instructions suivantes :

    @ $fp = fopen ("Orders/Commandes.txt", "r") ;

    fpassthru($fp) ;

En cas de succès de la lecture, la fonction fpassthru() renvoie la valeur true. Elle renvoie false en cas d'échec.

La fonction file() offre la troisième possibilité de lecture de l'intégralité du contenu d'un fichier. Cette fonction est identique à readfile(), si ce n'est qu'au lieu de retransmettre le contenu du fichier vers la sortie standard, elle le transforme en un tableau. Nous reviendrons sur cette possibilité dans la prochaine leçon. Notez simplement à ce stade que cette fonction s'utilise de la manière suivante :

    $filearray = file ($fp) ;

L'exécution de cette instruction provoque la retranscription du fichier complet dans un tableau appelé $filearray. Chaque ligne du fichier est stockée dans le tableau sous la forme d'un élément séparé.

Lecture d'un caractère ; fgetc() :

Le traitement d'un fichier peut également consister à lire le contenu de fichier caractère par caractère, via la fonction fgetc(). Cette fonction prend un pointeur sur le fichier comme seul paramètre, et renvoie le caractère suivant dans le fichier. Dans le script du listing de l'exemple 4 que nous avions déjà remplacé sauf la fonction fgets(), et que nous reportions ce code ici avec un exemple, la boucle while pourrait être remplacée par la boucle suivante :

    while (!feof($fp))

    {

    $char = fgetc($fp) ;

    if (!feof($fp))

    echo ($char == "\n" ? "<br>" : $char) ; // ? = ternaire

    }

Pour visualiser l'aperçu, en cliquant ici. [Exemple 5].

Ce code lit un caractère à la fois dans le fichier, via fgetc(), et le stocke dans la variable $char. Le processus est répété jusqu'à ce que la fin du fichier soit atteinte. Les caractères textuels de fin de ligne (\n) sont ensuite remplacés par des sauts de ligne HTML (<BR>). Ce petit traitement vise simplement à épurer la mise en forme. En effet, les navigateurs Web ne rendent pas les caractères de nouvelle ligne, si bien qu'en l'absence d'un tel traitement, la totalité du fichier serait imprimée sur une seule ligne (vous pouvez essayer par vous-même). L'opérateur ternaire (?) permet ici d'implémenter ce traitement avec plus d'élégance.

L'utilisation de la fonction fgetc() au lieu de la fonction fgets() a une conséquence mineure : le caractère EOF est renvoyé par la fonction fgetc(), ce qui n'est pas le cas avec la fonction fgets(). Il s'ensuit qu'après la lecture du caractère, il est nécessaire de tester à nouveau feof(), pour éviter que le EOF ne soit retransmis au navigateur.

La lecture d'un fichier caractère par caractère n'a de sens que dans des contextes très particuliers, où les caractères doivent effectivement être lus l'un après l'autre.

Lecture d'une longueur arbitraire ; fread() :

La dernière méthode de lecture d'un fichier que nous allons étudier est la fonction fread(). Celle-ci permet de lire un nombre d'octets arbitraire dans un fichier. le prototype de cette fonction est le suivant :

    string fread (int fp, int longueur) ;

Lorsque cette fonction est invoquée, l'interpréteur PHP lit "longueur" octets, ou lit jusqu'à la fin du fichier si celle-ci survient avant que "longueur" octets aient été lus.

Vérification de l'existence d'un fichier ; file_exists() :

La fonction file_exists() permet de déterminer si un fichier existe, sans même l'ouvrir. En voici un exemple d'utilisation :

    if (file_exists("Orders/Commandes.txt"))

        echo "Des commandes sont en attente de traitement." ;

    else

        echo "Aucune commande n'est actuellement disponible." ;

Pour visualiser l'aperçu, en cliquant ici. [Exemple 6].

Détermination de la taille d'un fichier ; filesize() :

Vous pouvez déterminer la taille d'un fichier grâce à la fonction filesize(). Celle-ci renvoie la taille du fichier en octets :

    echo filesize ("Orders/Commandes.txt") ;

Vous pouvez utiliser cette fonction en conjonction, avec la fonction fread() pour lire tout un fichier (ou une fraction d'un fichier) d'un seul trait. Le code du listing de l'exemple 4 pourrait ainsi être remplacé par les instructions suivantes :

    $fp = ("Orders/Commandes.txt", "r") ;

    echo fread ($fp, filesize ("Orders/Commandes.txt")) ;

    fclose ($fp) ;

Suppression d'un fichier ; unlink() :

Si, après avoir traité les commandes stockées dans notre fichier de commande, vous souhaitez détruire le contenu du fichier, utilisez la fonction unlink() (le langage PHP ne contient pas de fonction dénommée "delete"), comme dans l'exemple suivant :

    unlink ("Orders/Commandes.txt") ;

Cette fonction renvoie false lorsque le fichier ne peut être supprimé, par exemple, lorsque la permission sur le fichier n'est pas suffisante, ou lorsque le fichier n'existe pas.

Navigation au sein d'un fichier ; rewind(), fseek() et ftell() :

Vous pouvez manipuler et connaître la position du pointeur d'un fichier au sein du fichier au moyen des fonctions rewind(), fseek() et ftell().

La fonction rewind() déplace le pointeur d'un fichier vers le début du fichier. La fonction ftell() renvoie la position du pointeur dans le fichier, en nombre d'octets comptés depuis le début du fichier. Par exemple, nous pourrions ajouter les lignes suivantes à la fin du listing de l'exemple 4 (avant la commande fclose()).

    echo "<BR/>" ;

    echo "<font face='Arial' size='3' color='#0000FF'> <b>&nbsp;&nbsp;&nbsp;&nbsp;Position finale du pointeur de fichier est de :&nbsp;" . (ftell($fp)) . "&nbsp;&nbsp;octets &nbsp;&nbsp;<font color='#005500'>fonction ftell()</b> </font></font>" ;

    echo "<BR/> <BR/>" ;

    rewind($fp) ;

    echo "<font face='Arial' size='3' color='#0000FF'><b>&nbsp;&nbsp;&nbsp;&nbsp;Apr&egrave;s le rembobinage, la position est de : &nbsp;" .(ftell($fp)) . "&nbsp;&nbsp;octet &nbsp;&nbsp;<font color='#005500'>fonction rewind()</b> </font></font>" ;

    echo "<BR/>" ;

Pour visualiser l'aperçu, en cliquant ici. [Exemple 7].

Le résultat obtenu à l'exécution du script serait alors celui montré à la figure 4.

Lecture_du_Fichier_Rewind_et_Ftell.png

La fonction fseek() permet de déplacer le pointeur du fichier à une position spécifique au sein du fichier. Son prototype est le suivant :

    int fseek (int fp, int offset) ;

L'appel de la fonction fseek() provoque le déplacement du pointeur du fichier fp de offset octets par rapport au début du fichier. Invoquer la fonction rewind() est équivalent à appeler la fonction fseek() avec une valeur 0 du paramètre offset. Par exemple, la fonction fseek() peut être mise en oeuvre pour déterminer l'enregistrement qui constitue le milieu d'un fichier, ou pour effectuer une recherche binaire. Toutefois, lorsqu'un fichier de données atteint une complexité telle que ce type d'opération devient nécessaire. l'usage d'une base de données constitue une solution plus simple à mettre en oeuvre.

Verrouillage de fichier :

Considérons la situation où deux clients tentent simultanément de commander un même produit (cette situation se produit couramment dès lors que les sites connaissent un minimum d'affluence). Qu'advient-il lorsqu'un client invoque la fonction fopen() et commence à saisir sa commande, tandis qu'un autre client appelle lui aussi la fonction fopen() et entre des données ? Quel est alors le contenu final du fichier ? La première commande suivie de la deuxième, ou inversement ? Ou le fichier ne contiendra-t-il qu'une seule des deux commandes ? Ou bien encore les deux commandes se mêleront-elles l'une à l'autre ? La réponse à ces questions dépend du système d'exploitation utilisé, et apparaît souvent impossible à donner.

Le verrouillage des fichiers permet d'éviter ce type de problème. En langage PHP, c'est la fonction flock() qui s'emploie pour implémenter un tel verrouillage. La fonction flock() doit être invoquée après l'ouverture d'un fichier, et avant toute lecture ou écriture de données dans le fichier.

La fonction flock() a le prototype suivant :

    bool flock (int fp, int operation) ;

La fonction flock() prend comme argument un pointeur sur un fichier ouvert, ainsi qu'un nombre représentant le type de verrouillage désiré. Elle renvoie true lorsque le verrouillage réussit, et false en cas d'échec.

Les valeurs admises par la fonction flock() comme paramètre operation sont données dans le tableau de la figure 5.

Figure 5 - Valeurs d'opération de la fonction flock()
Valeur d'opération Signification
1 Verrouillage en lecture. Le fichier peut être partagé avec d'autres lecteurs.
2 Verrouillage en écriture. Ce type de verrouillage est exclusif : le fichier ne peut être partagé.
3 Libère le verrouillage existant.
+4 En ajoutant 4 dans le paramètre opération, vous empêcherez que la fonction flock() ne se bloque pendant la mise en oeuvre d'un verrouillage.

Pour que l'usage de la fonction flock soit efficace, vous devez implémenter flock dans tous les scripts utilisant le fichier à verrouiller.

Ce cas de figure, concernant nos exemples des fichiers plats, peuvent se révéler problématique. C'est pourquoi que nous allâmes pas plus loin dans nos exemples des fichiers plats conçus à titre indicatif, afin d'avoir un aperçu sur la programmation PHP ... L'emploi d'un SGBD (Système de Gestion de Base de Données) permet d'éviter une telle difficulté.

Une meilleure solution ; les systèmes de gestion de base de données :

Jusqu'à présent, tous les exemples considérés utilisaient des fichiers plats. Dans les prochaines leçons, nous allons parler largement sur le SGBD et nous allons également examiner comment un système de gestion de base de données relationnelle peut être utilisé, en lieu et place de fichiers plats.

Les systèmes de gestion de base de données relationnelle (SGBD) apportent des solutions à tous les problèmes :

Les SGBD permettent des accès plus rapides aux données.

Les SGBD peuvent être facilement consultés et explorés, pour extraire les ensemble de données qui répondent à des critères spécifiques.

Les SGBD comprennent des mécanismes prédéfinis pour le traitement des accès concurrents. Le programmeur n'a pas à se préoccuper de cet aspect problématique.

Les SGBD fournissent un accès aléatoire aux données.

Les SGBD comprennent des systèmes de privilèges intégrés. MySQL est particulièrement performant sur ce point.

Le principal avantage d'un SGBD est que toute (ou presque toute) la fonctionnalité requise dans un système de stockage de données est déjà implémentée. Vous pouvez bien sûr écrire votre propre bibliothèque de fonction PHP.

Dans les prochaines leçons, nous utiliserons le MySQL, nous examinerons le fonctionnement de base de données relationnelle en général, et nous verrons plus spécifiquement comment configurer et utiliser MySQL pour créer des sites Web articulés sur des bases de données.

Pour l'instant, nous terminons cette deuxième leçon et nous verrons dans la prochaine, les tableaux, et nous verrons également comment les utiliser pour traiter des données dans des scripts PHP.



  Cliquez ici pour la leçon suivante ou dans le sommaire prévu à cet effet.   Haut de page
  Page précédente   Page suivante







Nombre de pages vues, à partir de cette date : le 23 MAI 2019

compteur de visite

    




Envoyez un courrier électronique à Administrateur Web Société pour toute question ou remarque concernant ce site Web. 

Version du site : 10. 5. 14 - Site optimisation 1280 x 1024 pixels - Faculté de Nanterre - Dernière modification : 19 MAI 2019.   

Ce site Web a été Créé le, 14 Mars 1999 et ayant Rénové, en MAI 2019.