Serveur - PHP Pages dynamiques
Une page web dynamique est une page web générée à la demande, par opposition à une page web statique. Le contenu d’une page web dynamique peut donc varier en fonction d’informations (heure, nom de l’utilisateur, etc.) qui ne sont pas connues en amont.
Lorsqu’une page web est générée dynamiquement coté serveur, le résultat est une page web statique reçue coté client.
Exercice - Aujourd’hui#
Dans un fichier today.php
:
- génèrez la date du jour au format
jj-mm-aaaa
. Voir la doc de la fonctiondate()
de PHP - affichez un paragraphe avec la date
- modifiez le mois pour afficher en toutes lettres et en français
$moisFr = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'];
- créez un tableau HTML, d’une seule ligne, chaque colonne doit être un jour de la semaine en français (boucle sur un tableau de jours en PHP)
$joursFr = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'];
- faites en sorte que le jour de la semaine correspondant au jour d’aujourd’hui soit en rouge et en gras (grâce à CSS). Vous aurez besoin de
date('N')
oudate('w')
Exercice - Aujourd’hui Industrialisation#
Afin de rendre le code plus maintenable, nous allons mettre en place le framework FlightPHP.
Tout d’abord, il faut «convertir» votre site actuel pour utiliser Flight :
- suivez le tuto d’installation
- créez un dossier
views
, puis déplacez votre fichierindex.html
à l’intérieur (votre page d’accueil) - renommez ce fichier
accueil.php
- dans
index.php
de la racine, modifiez le contenu de la route"/"
pour renvoyer la vueaccueil.php
(voir ci-dessous)
Flight::route('/', function() {
Flight::render('accueil');
});
- créez un dossier
assets
, copiez-collez vos fichiers statiques CSS, et modifiez vos liens
Ensuite, nous allons créer une nouvelle page avec l’URL /today
:
- faites d’abord un lien vers cette nouvelle page dans votre menu (
<a href="/today">...</a>
) - créez le fichier
today.php
dansviews
- dans
index.php
, créez une nouvelle route"/today"
- générez la date du jour dans la fonction associée
- utilisez
Flight::render()
pour envoyer la date du jour à la vue
<?php
Flight::route('/today', function () {
$dateJour = ...;
Flight::render('today', ['dateJour' => $dateJour]);
});
?>
- dans
today.php
, créez le HTML nécessaire pour afficher un paragraphe contenant la date du jour
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>PHP</h1>
<p>Date d’aujourd’hui: <?= $dateJour ?></p>
</body>
</html>
- enfin, créez le même tableau que précédemment (tableau des jours). Vous aurez besoin de passer d’autres données à la vue
- au final, le résultat est le même (on peut toutefois noter le changement d’URL, plus propre)
Passage de variable#
Pour générer une page web dynamique, il nous faut des informations, qui sont dans la plupart des cas, récupérées depuis un formulaire d’une page HTML. Pour cela, les URLS permettent le passage de variables.
- en mode
GET
, les variables dont ajoutées à la suite du chemin, précédées du signe?
(point d’interrogation). Exemple :page.php?id=42
- en mode
POST
, les variables sont envoyées comme contenu de la requête HTTP, mais non visible pour l’utilisateur.
Voir les différents types de requête HTTP et comment les données sont envoyées
Les formulaires HTML permettent d’envoyer des informations saisies par l’utilisateur, et ces données seront automatiquement traduites en variables.
Formulaire d’envoi de login et password
<form method="post" action="check.php">
<div>
<label>Username: <input type="text" name="user"></label>
</div>
<div>
<label>Password: <input type="password" name="pass"></label>
</div>
<div>
<button>Envoyer</button>
</div>
</form>
Cet exemple affiche un formulaire contenant :
- un champ de saisie de texte
- un champ de saisie de mot de passe
- un bouton de validation
Lorsque l’utilisateur valide le formulaire, le navigateur effectue une requête HTTP vers le fichier PHP demandé, en envoyant les données du formulaire. Une donnée est créée pour chaque champ de formulaire contenant un attribut name
.
Dans notre cas :
- le navigateur fait une requête HTTP de type
POST
au fichiercheck.php
, et envoie 2 données :user
etpass
qui contiennent les valeurs saisies par l’utilisateur - coté PHP, les données sont stockées dans des tableaux associatifs dédiés
- le tableau
$_POST
contient les données envoyées avec la méthodePOST
- le tableau
$_GET
contient les données envoyées avec la méthodeGET
- le tableau
$_REQUEST
contient les données envoyées avec la méthodeGET
ouPOST
- le tableau
Exercice - Identification#
- créez une nouvelle route dans votre application Flight, nommé
/login
-
créez une nouvelle vue
login.php
, et dans cette vue :- affichez un formulaire avec login, password, et bouton de validation (code au-dessus). Les attributs de ce formulaire seront :
method="get"
action="/login"
- si le formulaire a été validé, affichez un paragraphe avec le texte
Connecté <user>
oùuser
est remplacé par le username de la personne- pour cela, dans la route, testez si
$_GET['user']
existe (fonctionisset($var)
) et s’il n’est pas vide (fonctionempty($var)
) et envoyez à la vue
- pour cela, dans la route, testez si
- affichez un formulaire avec login, password, et bouton de validation (code au-dessus). Les attributs de ce formulaire seront :
-
Ensuite :
- créez 2 routes différentes, une pour
GET /login
et une pourPOST /login
- modifiez la méthode d’envoi du formulaire en
POST
- utilisez une seule vue pour envoyer l’utilisateur (dans la route
GET
envoyeznull
, et dans la routePOST
, envoyez les données de connexion) - (vous pouvez utiliser en PHP
$_POST['user']
, ou la méthode de FlightFlight::request()->data['user']
)
- créez 2 routes différentes, une pour
Les Sessions#
Les sessions permettent de sauvegarder et de modifier des données, coté serveur, sans qu’elles ne soient visibles dans l’URL. Elles sont accessibles dans le script PHP sous la forme d’un tableau : $_SESSION
.
Cela permet notamment la persistance des données envoyées. En effet, le mécanisme d’envoi de données ne permet pas de le faire. Prenons par exemple une page d’authentification, on rentre nos informations, on valide. Les données sont envoyées au serveur, qui crée une page dynamiquement en fonction de mes droits. Dans cette page générée, coté client, je clique sur un lien. Si je ne renvoie pas mes données, comment le serveur sait-il que j’y ai accès ? Ce n’est pas possible et c’est bien là où les sessions sont utiles.
Avec les sessions, lorsque j’envoie mes données pour la première fois, le script conserve mes informations, ce qui lui permettra ensuite de pouvoir les réutiliser et/ou les modifier.
Pour pouvoir utiliser les sessions, il faut tout d’abord en démarrer une avec la fonction session_start()
puis ensuite remplir le tableau $_SESSION
comme bon nous semble.
Attention, l’instruction
session_start()
doit être la première instruction du script (après les entêtes éventuelles), il faut surtout éviter les lignes vides avant le<?php
qui sont considérée comme desecho "";
par PHP.
Exercice - Sessions#
À la suite de l’exercice Identification
- démarrez la session pour pouvoir l’utiliser (tout en haut de
index.php
) - dans la route
POST /login
- stockez l’utilisateur dans
$_SESSION
(par exemple,$_SESSION['user'] = ...
)
- stockez l’utilisateur dans
- dans la route
GET /login
- testez si la session contient l’utilisateur, et si oui, passez l’info à la vue
- testez, si tout fonctionne, vous ne devriez plus jamais voir le formulaire après la première «connexion»
Ensuite :
- créez un lien de déconnexion pour revenir au formulaire de départ
- utilisez une simple balise HTML lien (
<a>
) dont l’URL définit une variable, ou une URL spécifique (/logout
par exemple) - dans la route
GET /login
(ou dans/logout
), testez cette variable pour vider la session ($_SESSION = []
)
- utilisez une simple balise HTML lien (