COURS PHP

  Dernière mise à jour effectuée le : Jeudi 08 juillet 2004    

Accueil | Comment faire si je veux : Afficher la date de dernière mise à jour

Afficher la date de dernière mise à jour
Voila un truc que je qualifierai de pédagogique, utile et qui peut servir à tout le monde. Ce qu'il y a de bien en PHP, c'est q'en définitive, si on veut afficher la date de dernière mise à jour de sa page dans les normes Française qui nous sont si chères, alors que les serveurs "tournent" sous des systèmes étrangers la pluspart du temps Américains (et pourquoi pas...), rien que cette petite chose là va nous faire apprendre mille trucs très sympas. On dirait pas comme ça hein ? Et pourtant... Vous allez voir. Accrochez-vous. C'est parti.
NOTA à l'intention des puristes et des experts : Il y a une méthode bien plus courte (je sais), mais ceci est un exercice pédagogique destiné à apprendre plein de choses en faisant des trucs utiles. Donc, prenons le comme il est... Par avance merci.



Introduction
En théorie, rien de plus facile. Il suffit d'aller chercher la date de dernière mise à jour (date du dernier enregistrement du document sur le serveur) et de l'afficher.
Pas bête hein ? Oui, mais. Parce qu'il y a toujours un "mais". Cette date, n'est accessible que si l'on connaît le nom du document.
Vous me direz : ben on le connaît puisque c'est nous qui l'avons écrit et placé sur le serveur.
Et je vous répondrais : oui, bien sûr, mais si on s'y prend comme ça, on devra écrire un programme pour chaque page de notre site puisque toutes les pages portent un nom différent. Il faudra au moins "passer" à notre fonction le nom du document. Ce qui fait une modif (minime, j'en conviens, mais une modif quand même) dans chaque page. Moi, ce que je veux, c'est écrire une fonction autonome qui n'a besoin de personne pour travailler, qui se débrouile toute seule, quelque soit le nom de mon document (la page sur le serveur).
J'ai pas envie de m'embêter à devoir penser à mettre ce nom dans chaque page lors de l'appel de ma fonction. En plus, comme je me connais, tête en l'air comme je suis, je vais oublier les trois quart du temps et ça fera désordre. Je veux faire un simple "copier/coller" facile, pas cher et tout simple. Au besoin, et c'est même encore mieux, un appel à un programme exerne, ce qui me fait juste une instruction (toujours la même) dans chaque page. Ca, je peux en faire un modèle et le tour est joué. C'est d'ailleurs ce que j'ai fait pour ce site.
Quand vous me connaîtrez mieux, vous verrez comme je suis feignant. La loi du moindre effort. Voila une chose qui me plaît. D'abord, un bon informaticien est avant tout un cossard né. Ben c'est vrai quoi. Si on était courageux, on ferait pas travailler les machines à notre place. Pas vrai ? Dans ce sens, on peut dire que je suis un "excellent" informaticien.

 



Etape 1

Tout d'abord, il faut connaître le nom du fichier dont on veut relever la date de dernière mise à jour. Il se trouve que dans les variables natives proposées par PHP, le nom du fichier en cours d'exécution n'est pas accessible directement. Oui, je sais, ça paraît bizare, mais je vous promet que c'est vrai. On trouve ce nom dans diverses variables natives ou d'environement, mais toujours avec son chemin d'accès stipulé d'une mainière différente selon la variable concernée.
Vous pourrrez vous en convaincre en allant regarder la page qui vous donne toutes les variables d'environnement et les variable natives en cliquant ICI.
Vous voyez, le nom du fichier en cours d'exécution, (vous le trouverez dans la barre d'adresse de votre navigateur), apparaît un peu artout, mais jamais seul. Il va nous falloir l'isoler d'une chaîne de caractères. Nous allons donc procéder de la manière suivante :

1) Prendre une chaîne de caractères dans une variable native ou d'environement qui contient le nom du fichier en cours d'exécution. Pour ça, nous prendrons la variable [PHP_SELF] de $_SERVER. Nous écrirons :

$renspage = $_SERVER['PHP_SELF'] ;

Ce qui nous donnera (pour cette page) la chaîne de caractères suivante :
/CoursPHP/phpAffDateDerMaj.php
dans laquelle vous remarquerez le nom de notre page tout à la fin de la chaîne.

2) Pour plus de comodité, nous allons exploser (hé oui) cette chaîne en tronçons et mettre chaque tronçon dans les postes d'une variable de type tableau. Nous utiliserons pour ça la fonction explode() dont vous pouvez aller voir la description à la page concernée. Justement, cette fonction permet d'exploser une chaîne de caractères en la tronçonnant selon le caractère de séparation que nous lui indiquons. Ici, le "/" me paraît parfait, non ? Nous écrirons donc :

$TableChaine = explode("/", $renspage) ;

Ce qui nous donnera le résultat suivant (toujours pour cette page) :

La table $TableChaine possède maintenant le contenu suivant :

Array
(
    [0] => 
    [1] => CoursPHP
    [2] => phpAffDateDerMaj.php
)

Là, on voit nettement que le nom du fichier est dans le dernier poste de la table.

3) Il ne nous reste plus qu'à l'extraire en utilisant la fonction spécialisée qui justement permet de lire le dernier poste d'une variable de type tableau : end(), dont vous trouverez la description à la page concernée. Nous écrirons donc :

$NomFichier = end($TableChaine) ;

Ce qui donnera le résultat suivant pour la page en cours :

La variable $NomFichier contient : phpAffDateDerMaj.php

et c'est bien ce que nous voulions.

 



Etape 2

Bien ! Maintenant que nous tenons enfin le nom de ce fichu fichier (notez bien que ce petit programme parviendra à relever le nom de n'omporte quel fichier dans lequel il sera inclu), le travail est loin d'être fini. En premier lieu, il nous faut sa date de dernière mise à jour. Ici, ce sera la date à laquelle il a été enregistré pour la dernière fois sur le serveur. Vous me direz, ça ne veut pas dire qu'il a été modifié depuis la dernière fois... Je sais, mais c'est à vous de gérer l'enregistrement de vos fichiers sur le serveur.
Nous allons donc relever cette date de dernière mise à jour. Il existe bien pour cela une fonction filemtime(), mais celle-ci renvoie le nombre de secondes écoulées entre le premier janvier 1970 (epoch) et la date du dernier enregistrement du fichier sur le disque du serveur. Il nous faudra donc mettre ce nombre de secondes en forme pour obtenir unaffichage correct. Nous allons donc nous y employer.
Tout d'abord, voyaons ce que nous dnne cette fameuse fonction filemtime().

Ecrivons :

$DateDerMaj = filemtime($NomFichier) ;

cequi nous donne le résutlat suivant :

La variable $DateDerMaj contient : 1089302883

Ben dites donc... Ca en fait des secondes hein ?

Bon ! Comme je le disais en introduction de ce petit exercice, on aurait pu aller directement droit au but et se contenter de demander ça non pas sur le nom du fichier extrait de la chaîne de caractères que renvoie la variable $_SERVER['PHP_SELF'], mais en donnant comme argument à notre fonction filemtime(), le chemin d'accès complet de la page en cours d'exécution que l'on trouve dans la variable $_SERVER['SCRIPT_FILENAME']. Ca aurait donné le même résultat en s'épargnant bien du soucis.
On aurait simplement écrit :
$DateDerMaj = filemtime($_SERVER['SCRIPT_FILENAME']) ;
Oui, mais on aurait pas appris autant de choses. :-)

 

 

 



Etape 3

Il nous faut maintenant formater la date d'une manière lisible par nous, pauvres humains, autrement qu'en nombre de secondes depuis le premier janvier 1970. Il existe pour ça une fonction, la fonction strftime(), dont vous trouverez la description à la page concernée.

Comme vous le savez certainement déjà, je suis un maniaque de l'ordre et de la méthode (du moins pour l'apprentissage) et je vais vous proposer (même vous conseiller) d'isoler chacun des éléments de date dont nous aurons besoin pour formater notre sortie definitive. Que nous faut-il ?
- Le jour (le jour de la semaine, c'est à dire lundi, mardi etc...)
- Le numéro du jour dans le mois,
- Le nom du mois,
- L'année sur quatre chiffres.
Le tout en français, bien évidement, puisque nous somes en France.

La page sur la fonction strftime() nous donne tout ce dont nous avons besoin.Du moins tout ce dont nous avons besoin pour avoir accès à ces paramètres.

- Le jour de la semaine :
Le format %w retourne le numéro du jour de la semaine en commençant par 0 pour dimanche. Isolons le en écrivant :

$JourSemaine = strftime("%w", $DateDerMaj) ;
ce qui donne comme résultat :
Dans $JourSemaine il y a : 4

Continuons :
- Le numéro du jour dans le mois :
Le format %d nous le donne sur deux chiffres. Nous l'isolons en écrivant :

$Jour= strftime("%d", $DateDerMaj) ;
ce qui donne comme résultat :
Dans $Jour il y a : 08

- Le nom du mois :
Ah là, nous ne l'avons qu'en Anglais et pas en français. Et tout le monde n'est pas obligé de savoir parler anglais. Par contre, nous avons le numéro du mois sur deux chiffres avec le format %m. Isolons le en écrivant :

$Mois = strftime("%m", $DateDerMaj) ;
ce qui donne comme résultat :
Dans $Mois il y a : 07

- L'année sur quatre chiffrres
Toujours dans la même page d'explication des formats de dates, nous voyons que le format %Y répond parfaitement à nos attentes. Nous isolerons donc l'année sur quatre chiffres en écrivant :

$Annee= strftime("%Y", $DateDerMaj) ;
ce qui donne comme résultat :
Dans $Annee il y a : 2004

Nous avons donc maintenant quasiment tout ce dont nous avons besoin. Ou presque...

 



Etape 4

Il ne nous reste plus qu'à mettre tout ça en forme d'une manière lisible et en français bien entendu.
Il y a cependant u petit problème au niveau des mois. Le problème qui se pose, est que entre 01 et 09, le numero du mois sera sur deux chiffres dont le premier n'est pas significatif. Comme vous vous en doutez déjà, nous allons devoir rechercher ensuite le vrai nom du mois en français dans une table. Et l'index "01", ça fait désordre. Vous verrez ça si vous ne l'avez pas déjà appris, dans la leçon sur les variables de type tableau. Mais ça tombe bien, parce que ça va nous permettre d'apprendre trois autres choses, et de les appliquer, ce sont :
- Les tests,
- La recherche d'un caractère à partir de sa position,
- L'extraction d'une sous-chaîne de caractères d'une chaîne principale.
Si vous allez voir les pages consacrées aux instructions qui font ça en cliquant sur les liens ci-dessus, vous saurez tout et nous pourrons continuer. Ca y est ? Bon ! Alors allons-y.

Pour transformer un "07" en "7", il faut d'abord tester si le premier caractère est un "0" puis, si c'est le cas, extraire de la chaîne de caractères "07" (par exemple) la sous-chaîne qui commence en 1 et qui à 1 caractère de long. Pour faire ça, nous écrirons le programme suivant :

if ($Mois{0} == "0") { // debut if
$Mois = substr($Mois, 1, 1) ;
} // fin if

Ce qui donne comme résultat :
Dans $Mois il y a : 7

Maintenant, nous avons vraiment tous les ingrédients de base. Il nous reste à créer les tables de correspondances entre les numéros des jours de la semaine et leurs noms, et celle des numéros des mois et leurs noms le tout en français. Après être allé voir la leçon sur les variables de type tableau, vous savez le faire. Nous écrirons donc :

// Table des jours
$TableJours = array("Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi");
// Table des mois
$TableMois = array("", "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre") ;

En écrivant ça, nous aurons deux tables qui sont structurées de la mainère suivante
La table des jours contient :

Array
(
    [0] => Dimanche
    [1] => Lundi
    [2] => Mardi
    [3] => Mercredi
    [4] => Jeudi
    [5] => Vendredi
    [6] => Samedi
)

et la table des mois contient :

Array
(
    [0] => 
    [1] => janvier
    [2] => février
    [3] => mars
    [4] => avril
    [5] => mai
    [6] => juin
    [7] => juillet
    [8] => août
    [9] => septembre
    [10] => octobre
    [11] => novembre
    [12] => décembre
)

Notez bien que nous avons soigneusement évité de remplir le poste 0 de la table des mois, puisque le format %m renvoie le numéro du mois avec 1 pour janvier. Nous avons donc ainsi directement accès aux libellés des jours de la semaine et des mois en direct à partir des valeurs que nous avons isolées auparavant. Il nous reste juste maintenant (c'est vrai cette fois-ci) à mettre la chaîne de caractères de sortie en forme pour obtenir le résultat recherché. Nous écrirons donc :

echo "Dernière mise à jour effectuée le : $TableJours[$JourSemaine] $Jour $TableMois[$Mois] $Annee" ;
Ce qui donne comme résultat :

Dernière mise à jour effectuée le : Jeudi 08 juillet 2004

Vous voyez, ça n'était pas bien difficile. Et en plus, nous avons appris plein de choses fort intéressantes.

 
 
 
 
 



Ce cours est enseigné par Philippe Médan 
dans le cadre de la formation des professionnels de l'INTERNET.
au CREFAC , 14 rue Scandicci, 93000 Pantin. Tél. : 01 48 46 51 99
au GITA-GRETA , Lycée Technologique Diderot 61, rue David D'Angers 75019 Paris Tél. : 01 40 40 36 27
au CESI à l'Ecole des ingénieurs, 116 Av Aristide Briand, BP 57, 92224 Bagneux CEDEX Tél. : 01 45 36 70 00

© Philippe Médan 1999-2003. Tous droits de reproduction réservés pour tous pays.