Aller au contenu

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 fonction date() 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') ou date('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 fichier index.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 vue accueil.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 dans views
  • 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.

Architecture client/serveur

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 fichier check.php, et envoie 2 données : user et pass 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éthode POST
    • le tableau $_GET contient les données envoyées avec la méthode GET
    • le tableau $_REQUEST contient les données envoyées avec la méthode GET ou POST

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>user est remplacé par le username de la personne
      • pour cela, dans la route, testez si $_GET['user'] existe (fonction isset($var)) et s’il n’est pas vide (fonction empty($var)) et envoyez à la vue
  • Ensuite :

    • créez 2 routes différentes, une pour GET /login et une pour POST /login
    • modifiez la méthode d’envoi du formulaire en POST
    • utilisez une seule vue pour envoyer l’utilisateur (dans la route GET envoyez null, et dans la route POST, envoyez les données de connexion)
    • (vous pouvez utiliser en PHP $_POST['user'], ou la méthode de Flight Flight::request()->data['user'])

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 des echo ""; 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'] = ...)
  • 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 = [])