PHP - Post-Redirect-Get (PRG)
Bonjour là-bas, aspirants programmeurs ! Aujourd'hui, nous allons plonger dans un pattern important du développement web appelé Post-Redirect-Get, ou PRG pour faire court. Ne vous inquiétez pas si vous êtes nouveau dans la programmation ; je vais vous guider à travers ce concept étape par étape, comme j'ai fait pour des centaines d'étudiants au fil des ans. Alors, prenez une tasse de café (ou votre boisson favorite) et embarquons ensemble dans cette aventure passionnante !
Qu'est-ce que Post-Redirect-Get (PRG) ?
Imaginez que vous remplissez un formulaire pour commander une pizza en ligne. Vous cliquez sur envoyer, et puis... oups ! Vous avez accidentellement actualisé la page. Soudain, vous avez commandé deux pizzas au lieu d'une ! C'est le genre de problème que le pattern PRG aide à résoudre.
PRG est un pattern de développement web qui empêche les soumissions de formulaires en double lorsque l'utilisateur actualise la page après avoir soumis un formulaire. C'est comme un policier de la circulation pour vos applications web, assurant que les données circulent en douceur et ne sont pas accidentellement dupliquées.
Comment fonctionne PRG
- L'utilisateur soumet un formulaire en utilisant une requête POST.
- Le serveur traite les données du formulaire.
- Au lieu d'envoyer une réponse directement, le serveur envoie une redirection (généralement vers une page de succès).
- Le navigateur de l'utilisateur suit la redirection avec une requête GET.
- Le serveur répond à la requête GET avec la page finale.
Maintenant, voyons cela en action avec quelques exemples de code !
Exemple 1 : Une Implémentation Simple de PRG
Commençons avec un exemple de base de comment le PRG fonctionne en PHP. Nous allons créer un formulaire simple qui permet aux utilisateurs de soumettre leur couleur favorite.
Étape 1 : Le Formulaire HTML (form.php)
<!DOCTYPE html>
<html>
<head>
<title>Formulaire de Couleur Favorite</title>
</head>
<body>
<h1 Quelle est votre couleur favorite ?</h1>
<form action="process.php" method="post">
<input type="text" name="color" required>
<input type="submit" value="Soumettre">
</form>
</body>
</html>
Ce formulaire envoie une requête POST à process.php
lorsque soumis.
Étape 2 : Traitement du Formulaire (process.php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$color = $_POST['color'];
// Sauvegarder la couleur dans la session
$_SESSION['favorite_color'] = $color;
// Rediriger vers la page de résultat
header('Location: result.php');
exit;
} else {
// Si quelqu'un essaie d'accéder directement à cette page, redirigez-les vers le formulaire
header('Location: form.php');
exit;
}
Reprenons cela :
- Nous démarçons une session pour stocker des données entre les pages.
- Nous vérifions si la méthode de requête est POST.
- Si c'est le cas, nous sauvegardons la couleur soumise dans la session.
- Nous redirigeons l'utilisateur vers
result.php
. - Si quelqu'un essaie d'accéder à cette page directement (pas via POST), nous les renvoyons vers le formulaire.
Étape 3 : Affichage du Résultat (result.php)
<?php
session_start();
if (isset($_SESSION['favorite_color'])) {
$color = $_SESSION['favorite_color'];
// Effacer la variable de session pour empêcher l'affichage des anciennes données lors du rafraîchissement
unset($_SESSION['favorite_color']);
} else {
$color = 'Aucune couleur soumise';
}
?>
<!DOCTYPE html>
<html>
<head>
<title Votre Couleur Favorite</title>
</head>
<body>
<h1 Votre Couleur Favorite</h1>
<p>Vous avez dit que votre couleur favorite est : <?php echo htmlspecialchars($color); ?></p>
<a href="form.php">Soumettre une autre couleur</a>
</body>
</html>
Voici ce qui se passe :
- Nous démarrons la session à nouveau pour accéder aux données stockées.
- Nous vérifions si une couleur favorite a été stockée dans la session.
- Si c'est le cas, nous l'affichons et effaçons la variable de session.
- Si non, nous affichons un message par défaut.
Maintenant, même si l'utilisateur actualise la page de résultat, il ne resoumettra pas les données du formulaire. Génial, non ?
Exemple 2 : PRG avec Interaction avec une Base de Données
Reprenons notre exemple un peu plus loin et imaginons que nous exploitons un système de commande de pizzas. Nous allons utiliser une base de données pour stocker les commandes et implémenter PRG pour empêcher les commandes en double.
Étape 1 : Le Formulaire de Commande (order_form.php)
<!DOCTYPE html>
<html>
<head>
<title>Formulaire de Commande de Pizza</title>
</head>
<body>
<h1>Commandez Votre Pizza</h1>
<form action="process_order.php" method="post">
<label for="pizza_type">Type de Pizza :</label>
<select name="pizza_type" id="pizza_type" required>
<option value="margherita">Margherita</option>
<option value="pepperoni">Pepperoni</option>
<option value="veggie">Végétarienne</option>
</select>
<br><br>
<label for="size">Taille :</label>
<select name="size" id="size" required>
<option value="small">Petite</option>
<option value="medium">Moyenne</option>
<option value="large">Large</option>
</select>
<br><br>
<input type="submit" value="Passer la Commande">
</form>
</body>
</html>
Étape 2 : Traitement de la Commande (process_order.php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pizza_type = $_POST['pizza_type'];
$size = $_POST['size'];
// Dans une application réelle, vous voudriez nettoyer et valider cette entrée
// Connecter à la base de données (vous mettriez habituellement ceci dans un fichier séparé)
$db = new PDO('mysql:host=localhost;dbname=pizza_shop', 'username', 'password');
// Insérer la commande
$stmt = $db->prepare("INSERT INTO orders (pizza_type, size) VALUES (?, ?)");
$stmt->execute([$pizza_type, $size]);
// Obtenir l'ID de la commande
$order_id = $db->lastInsertId();
// Stocker l'ID de la commande dans la session
$_SESSION['last_order_id'] = $order_id;
// Rediriger vers la page de confirmation
header('Location: order_confirmation.php');
exit;
} else {
// Si quelqu'un essaie d'accéder directement à cette page, redirigez-les vers le formulaire
header('Location: order_form.php');
exit;
}
Ce script :
- Traite les données du formulaire.
- Insère la commande dans une base de données.
- Stocke l'ID de la commande dans la session.
- Redirige vers une page de confirmation.
Étape 3 : Confirmation de Commande (order_confirmation.php)
<?php
session_start();
if (isset($_SESSION['last_order_id'])) {
$order_id = $_SESSION['last_order_id'];
// Effacer la variable de session
unset($_SESSION['last_order_id']);
// Dans une application réelle, vous récupéreriez les détails de la commande à partir de la base de données ici
// Pour cet exemple, nous allons juste afficher l'ID de la commande
$message = "Votre commande (ID : $order_id) a été passée avec succès !";
} else {
$message = "Aucune commande récente trouvée. Veuillez passer une nouvelle commande.";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Confirmation de Commande</title>
</head>
<body>
<h1>Confirmation de Commande</h1>
<p><?php echo htmlspecialchars($message); ?></p>
<a href="order_form.php">Passer une autre commande</a>
</body>
</html>
Cette page de confirmation :
- Récupère l'ID de la commande depuis la session.
- Affiche un message de confirmation.
- Efface la variable de session pour empêcher l'affichage de la même commande lors du rafraîchissement.
Pourquoi PRG est Important
- Empêche les Soumissions en Double : Si un utilisateur actualise la page de confirmation, il ne resoumettra pas accidentellement sa commande.
- Améliore l'Expérience Utilisateur : Les utilisateurs voient une URL propre dans leur barre d'adresse, pas une longue chaîne de données de formulaire.
- Suit les Principes REST : Les requêtes GET sont utilisées pour récupérer des données, tandis que les requêtes POST sont utilisées pour soumettre des données.
Méthodes Communes de PRG
Voici un tableau des méthodes couramment utilisées dans le pattern PRG :
Méthode | Description |
---|---|
$_SERVER['REQUEST_METHOD'] |
Vérifie la méthode de requête HTTP (GET, POST, etc.) |
header('Location: ...') |
Envoie un en-tête de redirection au navigateur |
exit |
Assure qu'aucun code supplémentaire n'est exécuté après la redirection |
session_start() |
Démarre une nouvelle session ou reprend une session existante |
$_SESSION |
Stocke et récupère des données de session |
isset() |
Vérifie si une variable est définie et n'est pas NULL |
unset() |
Détruit une variable spécifiée |
souvenez-vous, jeunes padawans, le pattern PRG est comme utiliser la Force dans le développement web. Il apporte de l'équilibre à vos applications, empêchant le côté obscur des soumissions de formulaires en double. Que le code soit avec vous !
En conclusion, le pattern Post-Redirect-Get est un outil puissant dans votre boîte à outils de développement web. Il aide à créer des applications plus robustes et plus conviviales en empêchant les soumissions accidentelles en double. Comme vous continuez votre parcours en PHP et dans le développement web, vous trouverez de nombreuses situations où PRG peut sauver la journée. Continuez à pratiquer, restez curieux, et bon codage !
Credits: Image by storyset