Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Opérations sur les dates en PHP
Dans cette
formation Php , nous proposons de découvrir les subtilités de manipulation des informations de type
date . Nous avions déjà utilisé la
fonction Php date mais dans sa version la plus simple. Aujourd'hui, nous allons découvrir quelles possibilités sont offertes pour les besoins de sites Internet. Et à ce titre, nous proposerons une mise en pratique fort utile. Elle consistera Ã
uploader sur le serveur des fichiers image , tout en leur attribuant des noms explicites et forcément uniques. L'enjeu consiste à préserver l'intégrité des fichiers proposés, pour ne pas risquer de les écraser au fur et à mesure des
upload .
Sources et présentation de la problématique
Comme toujours, nous proposons de débuter les manipulations depuis des sources proposées au téléchargement depuis le
site bonbache.fr .
La décompression conduit au
fichier index.php de la page Web principale. Elle est accompagnée de ses ressources externes dans les sous dossiers.
Double cliquer sur le sous dossier commun pour afficher son contenu,
Vous y trouvez les
parties communes développées en
Php dans des fichiers externes. Nous avions mis en place et démontré l'intérêt de ce procédé dans une précédente formation afin d'
optimiser la construction des pages d'un site Web . Les appels sont réalisés grâce à la
fonction Php include . Nous le constaterons bientôt.
Revenir à la racine du dossier de décompression,
Puis, double cliquer sur le sous dossier photos pour afficher son contenu,
Vous constatez la présence de quelques images. Elles serviront de tests pour nos tentatives d'upload avec identifications uniques.
Pour réaliser les actions nécessaires à la découverte de la
manipulation des dates en PHP , nous devons émuler notre projet. Et pour l'émuler, comme nous l'avons appris dans les formations précédentes, nous devons le référencer dans
EasyPhp .
Il s'agit dans un premier temps de prélever son adresse depuis l'explorateur Windows. Puis, dans
EasyPhp , il convient de l'ajouter par le
bouton add directory . Dès lors, il faut lui attribuer un nom dans la zone
working directory name et coller son adresse dans la zone
working directory path . Enfin, il ne reste plus qu'Ã cliquer sur le
bouton Save .
Désormais, il ne nous reste plus qu'à cliquer sur son lien sur l'interface pour accéder à sa page d'accueil, soit celle du
fichier index.php .
Comme vous le remarquez, notre interface Web propose des
contrôles Html pour interagir avec l'internaute. Ainsi, on note la présence d'une
zone de texte pour attribuer un nom à la photo. On note également la présence d'un
contrôle Html de type File pour proposer un fichier placé sur le disque dur local, celui de l'internaute qui se connecte au serveur. Enfin, le
bouton Envoyer permet de soumettre les données. En effet, comme vous le savez et comme nous l'avons appris, toutes les informations à transmettre au serveur doivent être encapsulées dans un
formulaire Html . Nous allons constater tout cela.
A la racine du dossier de décompression, cliquer avec le bouton droit de la souris sur le fichier index.php ,
Dans le menu contextuel, choisir de l'ouvrir avec un éditeur tel que le Notepad++,
Tout d'abord vous notez les imbrications de code par appel des parties communes en entête grâce à l'
instruction Php Include .
<?php
include("commun/connexion.php");
include("commun/entete.php");
?>
<div style="width:100%; display:block; text-align:center;">
</div>
...
Ensuite, à partir de la ligne 29 pour un éditeur Notepad, vous notez l'imbrication des contrôles destinés à l'internaute, encapsulés dans un
formulaire Html .
...
<div class="titre_centre">
<form id="formulaire" name="formulaire" enctype="multipart/form-data" method="post" action="index.php">
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>">
<input name="photo" type="file" id="photo" size="100" class="liste">
<div class="liste_div">
<input type="text" id="titrep" name="titrep" class="liste" value="Donnez un titre à la photo" onClick="this.value='';" />
</div>
<div class="liste_div" style="float:right;">
<input type="button" id="envoyer" name="envoyer" class="liste" style="width:100px;" value="Envoyer" onClick="document.getElementById('formulaire').submit();" />
</div>
</form>
</div>
...
Celui-ci possède l'
identifiant formulaire . Sa méthode de soumission est
Post pour ne pas passer par l'Url. La page de réception est l'actuelle page de développement, soit
index.php . Nous réaliserons donc des allers-retours serveur plus communément connus sous le nom de
PostBack .
Vous notez de même la présence de son attribut tout à fait particulier
enctype . Il est indispensable pour transmettre des données riches tels que des fichiers multimédias, donc pour l'
upload de photos .
Plus bas dans le code, à partir de la ligne 43 pour un éditeur Notepad, figure la section qui nous intéresse pour commencer.
...
<div class="colonne" id="colonne_gauche">
</div>
<div class="colonne" id="colonne_droite">
</div>
...
Ces deux calques d'identifiants respectifs
colonne_gauche et
colonne_droite représentent les deux cadres de la partie centrale de la page Web. Nous allons les exploiter pour coder nos premières instructions à la découverte de cette fameuse
fonction date .
La fonction Php date
Nous l'avions découverte lors de la première
formation pour débuter la programmation en Php . Elle ne requiert qu'un seul paramètre. Mais les variantes de cet attribut sont nombreuses. Et selon cette valeur, le format de la date retournée peut changer du tout au tout. Nous proposons dans un premier temps de la répliquer telle que nous l'avions apprise.
Dans le premier calque d'identifiant colonne_gauche , créer la section de code Php suivante :
<?php
echo "Nous sommes aujourd'hui le :<br/>".date("d/m/y");
?>
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Comme vous le constatez, la date du jour dynamique apparaît en effet dans sa forme la plus simple.
La valeur de l'attribut passé en paramètre a donc une incidence directe sur le format de sortie de la date produite par la
fonction date . Nous allons le constater en réalisant quelques ajustements.
Revenir dans l'éditeur de code de la page Web,
Dans la fonction date , remplacer le y minuscule pour Year par un Y majuscule ,
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Vous remarquez que nous avons ainsi augmenté la richesse de l'information sur l'année de la date. Elle s'affiche désormais dans sa version longue.
De la même façon, si nous passons le jour et le mois en majuscules
date("D/M/Y") , nous obtenons les informations sous forme de texte anglais contracté (ex. Mon/Sep/2018). Mais dès lors, il manque la précision sur le jour exacte, son numéro dans le mois.
Adapter les attributs de la fonction date comme suit : date("D d/M/Y") ,
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Nous obtenons l'information précise sur la date. Il s'agit d'ailleurs des mêmes techniques, à quelques détails près, que celles que nous exploitons dans les formats de date Excel pour enrichir l'information.
Nous pourrions aussi modifier sa forme en remplaçant les slashs par des tirets (date("D d-M-Y")). Si nous remplacions le
D majuscule par un
F majuscule , nous obtiendrions le mois complet en texte anglais
date("d F/M/Y") : 13 September/Sep/2018 .
Il est même possible d'atteindre la précision sur l'heure, les minutes et les secondes grâce aux attributs respectifs
h, i et s à mentionner à la suite dans la fonction.
Modifier l'attribut de la fonction date comme suit : date("d F/M/Y - h:i:s") ,
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Si nous remplaçons le
h minuscule par un
H majuscule , c'est l'horloge de 24H qui est considérée et non celle de 12H, comme sur l'exemple illustré par la capture. Le 03 de 3 heures serait remplacé par le 15 pour 15 heures.
Nous n'allons pas passer en revue toutes les déclinaisons d'attributs qu'il est possible de construire pour obtenir des formats de date et d'heure spécifiques. L'extrait de code ci-dessous, à tester dans un navigateur, offre un résumé plutôt concis :
echo("<br /><br />Matin ou après midi : <br />");
echo("date(\"a\") : ".date("a"));
echo("<br /><br />Jour du mois en nombre : <br/>");
echo("date(\"d\") : ".date("d"));
echo("<br /><br />Jour de la semaine en 3 lettres anglaises :<br />");
echo("date(\"D\") : ".date("D"));
echo("<br /><br />Mois en texte en anglais : <br/>");
echo("date(\"F\") : ".date("F"));
echo("<br /><br />Heure sur 12 heures : <br />");
echo("date(\"h\") : ".date("h"));
echo("<br /><br />Heure sur 24 heures : <br />");
echo("date(\"H\") : ".date("H"));
echo("<br /><br />Minutes 0 Ã 59 : <br />");
echo("date(\"i\") : ".date("i"));
echo("<br /><br />Jour du mois en nombre : <br/>");
echo("date(\"j\") : ".date("j"));
echo("<br /><br />Année bissextile (booléen) ? : <br/>");
echo("date(\"L\") : ".date("L"));
echo("<br /><br />Mois en nombre : <br />");
echo("date(\"m\") : ".date("m"));
echo("<br /><br />Mois en 3 lettres, en anglais : <br/>");
echo("date(\"M\") : ".date("M"));
echo("<br /><br />Format de date, complet : <br/>");
echo("date(\"r\") : ".date("r"));
echo("<br /><br />Secondes : <br />");
echo("date(\"s\") : ".date("s"));
echo("<br /><br />Nombres de jours dans le mois donné : <br/>");
echo("date(\"t\") : ".date("t"));
echo("<br /><br />Jour de la semaine, numérique : <br/>");
echo("date(\"w\") : ".date("w"));
echo("<br /><br /><b>Numéro de la semaine dans l'année:</b> <br />");
echo("date(\"W\") : ".date("W"));
echo("<br /><br />Année à 2 chiffres : <br />");
echo("date(\"y\") : ".date("y"));
echo("<br /><br />Année à 4 chiffres : <br />");
echo("date(\"Y\") : ".date("Y"));
echo("<br /><br />Jour de l'année (0 à 365) : <br/>");
echo("date(\"z\") : ".date("z"));
Opérations sur les dates
Les opérations sur les dates, comme les comparaisons notamment, ne sont pas si triviales que cela en revanche. Finalement, la variable stockée n'est autre qu'une chaîne de texte dont on peut manipuler l'aspect. Nous allons devoir exploiter une
fonction Php capable de convertir explicitement la chaîne en objet de date pour la manipuler.
Passer l'instruction de test echo précédente en commentaire,
En dessous, déclarer deux dates au format date, comme suit :
$date1 = "19/11/2018"; $date2 = "18/12/2018";
La première est donc une date antérieure à la seconde. Nous souhaitons les comparer avec une
instruction conditionnelle If que nous avions apprise en Php , pour aboutir à cette conclusion.
Après la déclaration de variables, ajouter le test suivant :
if($date1>$date2)
echo $date2."<br /> est antérieure à <br />".$date1;
else
echo $date1."<br /> est antérieure à <br />".$date2;
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Comme vous le remarquez, la conclusion entreprise en
PHP est erronée. La comparaison entre les deux dates a échoué. La raison est simple.
Php n'a pas comparé deux dates mais deux chaînes de texte.
Nous devons donc exploiter une
fonction Php capable de convertir une chaîne de caractères pour l'interpréter comme une date et ainsi réaliser les comparaisons. Cette
fonction se nomme
strtotime . Littéralement elle signifie texte (str) en (to) date (time).
Revenir dans l'éditeur de code et adapter l'instruction conditionnelle comme suit :
$date1 = "19/11/2018"; $date2 = "18/12/2018";
if(strtotime( $date1) >strtotime( $date2) )
echo $date2."<br /> est antérieure à <br />".$date1;
else
echo $date1."<br /> est antérieure à <br />".$date2;
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Cette fois, comme vous le constatez, les dates sont inversées. Elles ont correctement été comparées.
Il est même possible de calculer la
différence entre deux dates et de choisir la forme du résultat, en nombre de jours par exemple. Pour cela, il faut exploiter la
fonction Php date_diff . Mais pour son calcul, elle requiert que les dates soient explicitement déclarées comme des
objets de type date , grâce à la
fonction date_create . De plus, ces dates doivent être passées au format anglais (Année/Mois/Jour).
Revenir dans l'éditeur de code de la page Web,
Après l'instruction conditionnelle, ajouter les lignes Php suivantes :
$date1 = date_create("2018/11/19"); $date2 = date_create("2018/12/18");
$interval = date_diff($date1, $date2);
echo "<br /><br />Différence entre les deux dates :<br/>".($interval->format('%R%a days'));
Comme vous le constatez, la
variable $interval est convertie en objet de programmation, du fait de son affectation par la
fonction date_diff . Et dans la
syntaxe Php , nous n'utilisons pas le point (.) pour appeler les propriétés et méthodes de l'objet, comme en
Javascript . Il s'agit du tiret suivi du symbole supérieur (->). C'est ainsi que nous appelons la
propriété format de l'
objet $interval . Cette dernière, selon les attributs qui lui sont passés, permet d'ajuster la mise en forme de la différence calculée (En nombre de jours ici).
Enregistrer les modifications et basculer sur le navigateur,
Rafraîchir la page Web à l'aide de la touche F5 du clavier ,
Comme vous le remarquez, le calcul de la différence réalisé par notre
code Php est tout à fait juste.
Nommer les fichiers de façon unique
L'enjeu pour un
site Web dynamique consiste à pouvoir proposer de nouvelles rubriques, régulièrement agrémentées de fichiers comme des images. Le risque est qu'un même nom soit attribué à un fichier déjà uploadé sur le serveur. Dans ce cas, l'image est écrasée et l'illustration de la rubrique ne correspond plus. Cet enjeu est d'autant plus important pour un
site Internet qui propose à ses membres d'enrichir le contenu par Upload. La solution consiste donc à attribuer un nom de fichier forcément unique avant l'envoi et l'inscription en base de données. C'est tout naturellement la
fonction Php date qui va nous aider à atteindre ce but.
Nous proposons de prélever le titre donné par l'internaute dans un premier temps. Nous devons purger la chaîne des espaces et accents. Puis, nous proposons de lui additionner un suffixe unique comprenant la date complète détaillée jusqu'à la seconde précise de l'action. Pour purger cette chaîne, nous proposons d'exploiter un code existant, dans un fichier externe situé dans le
sous dossier local fonction . Ce fichier se nomme
traitement_chaine.php . Deux
fonctions sont offertes.
La première (supprAccents) supprime les accents. La seconde (supprSpeciaux) remplace les caractères spéciaux, problématiques dans les noms de fichiers.
Nous nous contentons ici de les exploiter sans approfondir les explications. Nous devons nous concentrer sur l'objectif principal. Dans un premier temps, il s'agit d'ajouter la référence à ce fichier externe en entête de code. Ainsi, nous pourrons appeler et exploiter ses fonctions.
Revenir dans l'éditeur de code de la page Web,
Tout en haut du code, dans la section Php, ajouter l'imbrication suivante :
<?php
include("commun/connexion.php");
include("commun/entete.php");
include("fonction/traitement_chaine.php");
?>
...
Comme nous l'avons démontré précédemment, les fichiers multimédias sont proposés dans les sources. Ils sont stockés dans le
sous dossier photos . Nous proposons, après avoir finalisé le
code Php , de simuler les actions en les uploadant dans le sous dossier images.
Ensuite donc, nous coderons les instructions réceptionnant les valeurs transmises dans le calque de droite, d'
identifiant colonne_droite . Le
contrôle Html input file est particulier. On accède à ses valeurs comme dans un
tableau de variables . L'image est stockée en mémoire sous un nom d'attribut particulier
tmp_name , auquel il faut accéder.
Dans le calque d'identifiant colonne_droite , ajouter la section de code Php suivante :
...
<div class="colonne" id="colonne_droite">
<?php
if(isset($_POST["titrep"]))
{
$le_titre = addslashes($_POST["titrep"]);
$nom_photo_tmp = "";
$nom_photo_tmp = $_FILES['photo']['tmp_name'];
echo $le_titre."-".$nom_photo_tmp;
}
?>
</div>
...
Nous effectuons tout d'abord un test d'existence sur le nom donné à la photo. Il doit être saisi dans le contrôle Html nommé
titrep . Si sa valeur existe, nous en concluons que l'image a bien été sélectionnée et soumise. Dans ce cas, nous engageons donc le traitement. La
fonction Php addslashes est importante pour les bases de données notamment. Elle permet d'ajouter un caractère d'échappement, l'antislash (\), devant chaque apostrophe. L'apostrophe est en effet un caractère spécial problématique pour les noms de fichiers et insertions en base de données. Puis, nous désignons le contrôle Input File par son nom ($_FILES['photo']) et récupérons le nom temporaire de l'image stockée dans la deuxième dimension de ce tableau (['tmp_name']). Nous stockons ce nom de fichier dans la
variable $nom_photo_tmp . Enfin, nous affichons l'ensemble concaténé à titre de test, grâce à la
fonction Php echo .
Enregistrer les modifications et basculer sur le navigateur Web,
Rafraîchir la page à l'aide de la touche F5 du clavier ,
Choisir une image dans le sous dossier photos en cliquant sur le bouton du contrôle Input File ,
Saisir un titre cohérent dans la zone de texte,
Puis, cliquer sur le bouton Envoyer pour transmettre ces données,
Comme vous le constatez, nous parvenons à réceptionner les éléments nécessaires à la manipulation du fichier Multimédia. Ce nom temporaire devra être exploité pour réaliser la sauvegarde finale de l'image sur le serveur.
Mais avant cela, il s'agit de purger le titre pour proposer des noms de fichiers corrects, sans accents et sans espaces notamment. Pour cela, nous allons exploiter les fonctions externes, dont nous avons imbriqué le fichier par la fonction include.
Revenir dans l'éditeur de code de la page Web,
Avant l'instruction echo, ajouter le traitement suivant :
if(isset($_POST["titrep"]))
{
$le_titre = addslashes($_POST["titrep"]);
$nom_photo_tmp = "";
$nom_photo_tmp = $_FILES['photo']['tmp_name'];
$le_titre = trim(supprSpeciaux(supprAccents(utf8_decode($le_titre))));
echo $le_titre."-".$nom_photo_tmp;
}
La
fonction Php trim permet de supprimer les espaces résiduels situés en début et fin de chaîne. La
fonction utf8_decode est exploitée pour interpréter les accents selon le système d'encodage en vigueur de la page Web. Enfin, les
fonctions supprSpeciaux et supprAccents sont appelées pour réaliser les traitements que nous avons évoqués. Comme toutes ces fonctions sont imbriquées les unes dans les autres, il s'agit de fermer autant de parenthèses que nous en avons ouvertes. Au final, c'est la
variable $le_titre qui subit tous ces traitements en cascade.
Enregistrer les modifications et basculer sur le navigateur Web,
Comme nous avons précédemment soumis le formulaire (PostBack), il n'est pas possible de rafraîchir la page. Nous devons la recharger.
Cliquer dans la barre d'adresse du navigateur,
Puis, enfoncer la touche Entrée du clavier pour la recharger intégralement,
Choisir une photo, saisir un titre et cliquer sur le bouton Envoyer ,
Comme vous le constatez, nous avons parfaitement réussi à purger le titre. Les espaces ont été remplacés par des tirets. Les accents et l'apostrophe ont disparu. Cette désignation est désormais tout à fait appropriée pour un nom de fichier.
Néanmoins à ce stade, rien ne nous assure qu'un nom exactement similaire ne soit proposé à l'avenir. Nous devons donc le rendre unique en le suffixant d'une information de date, détaillée jusqu'à la seconde près, pour le jour et l'heure en cours.
Pour simplifier la problématique, nous partons du principe que toutes les extensions sont du type.jpg. Mais avec les fonctions que nous avons déjà abordées, notamment
strripos pour trouver l'emplacement de la dernière occurrence, ici le point, il serait trivial de considérer n'importe quelle extension.
Revenir dans l'éditeur de code de la page Web,
Avant l'instruction echo, ajouter le traitement Php suivant :
if(isset($_POST["titrep"]))
{
$le_titre = addslashes($_POST["titrep"]);
$nom_photo_tmp = "";
$nom_photo_tmp = $_FILES['photo']['tmp_name'];
$le_titre = trim(supprSpeciaux(supprAccents(utf8_decode($le_titre))));
$le_titre = $le_titre.date("y-m-d-h-i-s").".jpg";
echo $le_titre."-".$nom_photo_tmp;
}
Enregistrer les modifications et basculer sur le navigateur Web,
Cliquer dans la barre d'adresse du navigateur,
Puis, enfoncer la touche Entrée du clavier pour la recharger intégralement,
Choisir une photo, saisir un titre et cliquer sur le bouton Envoyer ,
Comme vous le remarquez, nous obtenons en effet un nom explicite, suffixé d'une partie codée unique.
Cet upload ou sauvegarde sur le serveur se réalise très simplement grâce à la
fonction Php Copy , dès lors que tous les éléments sont réunis. Elle requiert en premier paramètre le nom de la photo à copier. Nous l'avons stocké dans la
variable $nom_photo_tmp . En second paramètre, elle requiert le chemin complet du fichier. Il s'agit du titre unique que nous venons de recomposer, soit de la
variable $le_titre .
Revenir dans l'éditeur de code de la page Web,
Puis remplacer l'instruction echo par les deux lignes Php suivantes :
if(isset($_POST["titrep"]))
{
$le_titre = addslashes($_POST["titrep"]);
$nom_photo_tmp = "";
$nom_photo_tmp = $_FILES['photo']['tmp_name'];
$le_titre = trim(supprSpeciaux(supprAccents(utf8_decode($le_titre))));
$le_titre = $le_titre.date("y-m-d-h-i-s").".jpg";
copy($nom_photo_tmp, "images/".$le_titre);
echo "<img src='images/".$le_titre."' style='width:280px;'/>";
}
Nous exploitons donc la
fonction Php copy . Nous n'oublions pas de concaténer le nom du fichier au sous dossier local sur le serveur (images/) pour la copie. Nous en profitons pour vérifier le bon déroulement de l'upload en désignant l'image depuis son nouvel emplacement afin de l'afficher dans une
balise Html img . Ce traitement est réalisé par concaténation comme toujours.
Enregistrer les modifications et basculer sur le navigateur Web,
Cliquer dans la barre d'adresse du navigateur,
Puis, enfoncer la touche Entrée du clavier pour la recharger intégralement,
Choisir une photo, saisir un titre et cliquer sur le bouton Envoyer ,
Comme vous le constatez, nous parvenons en effet à restituer la photo uploadée sur le serveur, dans le sous dossier images. Pour en avoir la preuve, vous pouvez cliquer avec le bouton droit sur la photo et choisir Informations sur l'image, dans le menu contextuel. Vous y découvrez le nom unique attribué au fichier à l'emplacement désigné sur le serveur. A l'avenir, c'est ce nom qui devra être exploité pour l'inscription en base de données. Nous serons ainsi en mesure de restituer toutes les informations sur demande internaute, par
requêtes Sql .