Dans ce TD, nous allons travailler avec PHP et un serveur web qui nous permettra de faire la "paserelle" entre les données HTTP et PHP.
Avant de commencer, vous pouvez installer un serveur sur une machine personelle. Sous Debian/Ubuntu,
vous pouvez installer les paquets apache2
et libapache2-mod-php7
.
Sous Windows, il est préférable d'utiliser un outil tel que WAMP, que vous pourrez trouver sur le site wampserver.com.
Une autre option beaucoup plus élégante et pratique est d'utiliser le serveur web intégré à PHP, pour cela, placez vous dans le dossier que vous souhaitez et tapez:
$ php -S 127.0.0.1:8080
Un serveur web se lancera alors en écoutant sur le port 8080
, vous pourrez donc vous connecter
à la page http://127.0.0.1:8080/
et vous accéderez à votre application web.
Sous Windows, vous pouvez utiliser le script php-server.bat, placez le dans le dossier des sources et exécutez le.
Comme vu en dans le chapitre HTTP, les variables GET sont passées en paramètre d'une page comme ceci:
http://www.domain.com/path/to/resource.php?a=1337&b=42
Ces variables peuvent être récupérées à l'aide du tableau $_GET
.
1. Factorisation
Examniez le code fournit dans le dossier exercice1/
, il est constitué de plusieurs pages HTML, ce qui est problématique,
car le code des en-têtes contenant le style et le menu est à chaque fois recopié! A l'aide de PHP, créez une unique page web
qui contiendra toutes ces pages.
Dans un premier temps, utilisez les variables GET pour que le contenu de la page soit modifié en fonction du paramètre passé dans l'URL, tout en gardant une seule page PHP.
Rajouter des pages à ce site pourrait devenir pénible, car la page principale PHP que vous avez créé va grossir et grossir. Proposez une autre manière de factoriser le code entre les pages.
Les formulaires représentent une très grande partie du développement d'un site web.
1. Compréhension
Lisez et testez le script exercice2/form.php
de l'archive.
A) Comment est detecté le fait que le formulaire a été posté ?
B) A quoi correspond ce test vis à vis du protocole HTTP ?
C) Pourquoi la fonction htmlspecialchars() est utilisée ici ?
2. Ajout d'un champ
Ajoutez un champ nom
au formulaire. Lorsque le formulaire est soumis, si les deux champs sont remplis,
la page devra indiquer: "Vous vous nommez [Prénom] [Nom]"
.
3. Un peu de validation
Ajoutez maintenant un champ email
. N'oubliez surtout pas comment fonctionne le protocole HTTP, même en
utilisant le type de champ HTML5 email
, le client pourra toujours transmettre des données arbitraires via une
requête POST
. C'est pour cela qu'il faut impérativement vérifier coté serveur que l'adresse fournie est
bien formée, vous pourrez utiliser la fonction PHP filter_var().
4. Menu déroulant
Ajoutez un champs "Genre" sous forme de menu déroulant (Homme, Femme). Le genre sera affiché dans le message après traitement.
5. Cases à cocher
Ajoutez des cases à cocher permettant à l'utilisateur de séléctionner les langages de programmation qu'il connaît. Par exemple:
Les langages seront affichés dans le message après traitement.
Si vous utilisez languages[]
dans l'attribut name
des cases à cocher, vous obtiendrez un tableau, bien
plus pratique que de créer une case avec un nom différent par langage!
6. Pré-remplissage
Si l'utilisateur veut modifier ses choix (par exemple si il a fait une erreur, ou que le serveur déclenche une erreur de validation parce que son e-mail n'est pas correct etc.), constatez que le formulaire redevient vide après un envoi.
Faites en sorte qu'il soit re-rempli avec les choix de l'utilisateur.
Le dossier exercice3/
contient une page web dont l'accès devrait être sécurisé. En effet, les pages marquées du
cadenas dans le menu ne devraient pas être accessibles sans être identifié au préalable.
A l'aide d'un formulaire et des sessions PHP, sécurisez l'accès à la page pour que les utilisateurs
présents dans le fichier users.php
puissent s'idientifier avec leurs mots de passe. Pour inclure users.php
,
vous pourrez utiliser la notation:
<?php
// Notation spéciale dans le cas ou le fichier
// inclus contient un "return"
$users = include('users.php');
Une tentative d'accès à une page sans être identifié provoquera l'affichage d'un message d'erreur.
Implémentez ensuite une fonction de déconnexion.
Au lieu d'afficher un message d'erreur lorsque l'utilisateur tente d'accéder à une page sans être identifié, redirigez le vers le formulaire d'identification, et souvenez vous de quelle page il venait.
De cette manière, si il s'identifie, il sera redirigé vers la page qu'il essayait de consulter.
Indication: vous pouvez réaliser une implémentation générique à l'aide du contenu de $_SERVER
Le but de cet exercice est d'implémenter un CAPTCHA, ou code visuel que l'utilisateur doit recopier pour confirmer qu'il n'est pas un robot.
Le code qui permet de générer l'image vous est déja fourni à titre d'exemple dans le dossier
exercice4
.
1. Mise en place
Créer un formulaire (non fonctionnel) comportant un champ texte et l'image générée,
proposant ainsi à l'utilisateur de la recopier pour confirmer qu'il n'est pas un robot.
2. Phrases aléatoire
Faites en sorte que le code soit généré aléatoirement
3. Validation
Ecrivez maintenant le code qui confirme si le teste a été oui ou non passé avec succès. Lorsque le formulaire est soumis, il faut vérifier coté serveur que le code qui a été entré par l'utilisateur est bien celui qui a été préalablement affiché sur son image.
Reprenez le code de l'exercice 3 et modifiez le pour ne PAS utiliser session_start()
ni
$_SESSION
, en réimplémentant votre propre système de session.
Quelques fonctions utiles:
// Lire et écrire dans un fichier
file_put_contents($file, $data); // Ecrire
$data = file_get_contents($file); // Lire
// Tester si un fichier $file existe
if (file_exists($file)) {
}
// Générer un identifiant aléatoire
$id = uniqid();
// Transformer un objet en chaîne de caractères
$data = serialize($something);
// Transformer une chaîne de caractère en un objet
$something = unserialize($data);
// Définir un cookie 'key' à '123' qui expirera quand le
// navigateur sera fermé
setcookie('key', '123', 0);