5) Interactions
Formulaires et actions de jeu

Objectifs de la séance
- Comprendre le cycle requête/réponse et comment un formulaire HTML déclenche du code PHP.
- Écrire des formulaires HTML utilisant la méthode POST.
- Lire et valider les données envoyées par un formulaire avec
$_POSTetisset(). - Convertir les données reçues avec
intval()ethtmlspecialchars(). - Créer la classe
Jeuqui centralise la logique du jeu et fait le lien entre l'interface et la base de données. - Utiliser la syntaxe alternative PHP (
if():/endif;) dans les templates HTML. - Sauvegarder l'état du jeu en base après chaque action du joueur.
Petite vérification
Avant de commencer, vérifiez si vous savez encore...
- rechargez plusieurs fois la page
index.phpde votre projet (version séance précédente) et vérifiez que les mêmes personnages s'affichent à chaque fois, sans être dupliqués : c'est la preuve que la persistance SQLite fonctionne ; - écrivez, sans regarder le corrigé, la ligne de code PDO qui prépare une requête SQL pour insérer un nom et un âge dans une table
contact, avec des paramètres nommés:nomet:age; - expliquez pourquoi on ne doit jamais construire une requête SQL par concaténation directe de chaînes contenant des données saisies par l'utilisateur.
📌 Réponse attendue
Notions théoriques
Le cycle d'une interaction avec un formulaire
Jusqu'ici, index.php s'exécutait de la même manière à chaque requête : il chargeait
les personnages, affichait la page, et s'arrêtait.
Le joueur n'avait aucun moyen d'agir.
Avec un formulaire, le cycle devient le suivant :
- Le navigateur envoie une requête GET vers
index.php(premier chargement). - PHP génère la page HTML avec le formulaire et l'envoie au navigateur.
- L'utilisateur remplit le formulaire et clique sur le bouton.
- Le navigateur envoie une requête POST vers
index.php, en joignant les données du formulaire. - PHP reçoit ces données dans le tableau
$_POST, les traite (déplacement, attaque...), sauvegarde les changements en base, puis génère à nouveau la page HTML mise à jour.
À chaque clic sur un bouton, on recommence à partir de l'étape 4.
C'est ce cycle répété qui permet de jouer.
La méthode POST
Un formulaire HTML peut envoyer ses données de deux manières :
- GET : les données apparaissent dans l'URL (
?nom=Lara&vie=100). Utile pour des recherches ou des filtres, mais inadapté pour des actions qui modifient des données. - POST : les données sont envoyées dans le corps de la requête HTTP, invisibles dans l'URL. C'est la méthode à utiliser pour toute action qui modifie l'état du jeu.
<form method="POST" action="index.php">
<input type="text" name="nom" />
<input type="submit" value="Envoyer" />
</form>
En PHP, les données envoyées en POST sont accessibles via le tableau superglobal $_POST :
if (isset($_POST['nom'])) {
$nom = $_POST['nom'];
}
$_POST est un tableau associatif dont les clés correspondent aux attributs name
des champs du formulaire.
Vérifier et nettoyer les données reçues
Toute donnée reçue depuis l'extérieur (formulaire, URL, cookie...) doit être traitée avec méfiance. Deux règles minimales à respecter systématiquement :
1. Vérifier l'existence avec isset()
isset($variable) renvoie true si la variable existe et n'est pas null.
Sans cette vérification, accéder à $_POST['action'] quand aucun formulaire n'a été
soumis provoquerait un avertissement PHP (notice : undefined index).
if (isset($_POST['action'])) {
$action = $_POST['action'];
// traiter l'action
}
2. Convertir le type avec intval()
Toutes les valeurs de $_POST sont des chaînes de caractères, même quand elles
représentent des nombres. Si un champ <input type="number" name="vie"> renvoie "100",
PHP voit une chaîne, pas un entier. La fonction intval() convertit une chaîne en entier :
$vie = intval($_POST['vie']); // "100" devient 100
3. Neutraliser le HTML avec htmlspecialchars()
Si une valeur textuelle saisie par l'utilisateur est réaffichée telle quelle dans la page,
un utilisateur malveillant pourrait y injecter des balises HTML ou du JavaScript
(attaque XSS). htmlspecialchars() convertit les caractères spéciaux en entités HTML :
$nom = htmlspecialchars($_POST['nom']);
// "<script>" devient "<script>" et s'affiche comme du texte
La syntaxe alternative PHP dans les templates
Quand on mélange PHP et HTML (dans la partie affichage d'une page), les accolades {}
peuvent rendre le code difficile à lire. PHP propose une syntaxe alternative plus lisible :
| Syntaxe classique | Syntaxe alternative |
|---|---|
if (...) { | if (...): |
} | endif; |
foreach (... as ...) { | foreach (... as ...): |
} | endforeach; |
<?php if (count($personnages) > 0): ?>
<ul>
<?php foreach ($personnages as $p): ?>
<li><?php print $p->getNom(); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
Cette syntaxe est préférable dans les templates (fichiers qui mélangent HTML et PHP)
car elle rend immédiatement visible à quoi correspond chaque endif ou endforeach,
sans avoir à chercher l'accolade ouvrante correspondante.
Le champ hidden pour identifier l'action
Quand une même page contient plusieurs formulaires (créer un personnage, déplacer, attaquer...),
il faut distinguer lequel a été soumis. La solution standard est d'ajouter un champ caché
(type="hidden") dans chaque formulaire, avec une valeur identifiant l'action :
<form method="POST" action="index.php">
<input type="hidden" name="action" value="deplacer" />
<!-- ... autres champs ... -->
</form>
Côté PHP, on lit $_POST['action'] pour savoir quelle action traiter.
Le rôle de la classe Jeu
À ce stade, index.php orchestre tout : il charge les personnages, traite les actions,
sauvegarde, et affiche. Plus le jeu gagne en fonctionnalités, plus ce fichier devient
ingérable.
La classe Jeu va centraliser toute la logique métier :
- charger et sauvegarder la partie via
Database; - valider et exécuter les actions (déplacer, attaquer, vérifier les limites du plateau) ;
- exposer les données nécessaires à l'affichage.
index.php ne fera plus que lire les données de $_POST, déléguer le traitement à Jeu,
puis afficher le résultat. Ce découpage est essentiel pour maintenir un code lisible
quand la complexité augmente.
Point de départ du TP
Ce TP reprend le projet issu de la séance 4.
Le dossier de notre projet contient actuellement les fichiers suivants :
Personnage.php,Guerrier.php,Mage.php,Database.php,index.php- et
jeu.db.
À la fin de cette séance, notre projet contiendra un fichier supplémentaire :
| Fichier | Statut | Description |
|---|---|---|
Personnage.php | inchangé | classe abstraite parente |
Guerrier.php | inchangé | classe fille guerrier |
Mage.php | inchangé | classe fille mage |
Database.php | inchangé | gestion SQLite |
Jeu.php | nouveau | logique centrale du jeu |
index.php | refondu | traitement des formulaires POST + affichage |
jeu.db | existant | fichier de base de données SQLite |