***** CETTE PAGE EST IMPORTANTE. PLACEZ-LA DANS VOS FAVORIS *****
Cette fiche peut être utilisée pour un site PHP vanille ou encore pour un site WordPress.
Il y a plusieurs étapes à réaliser avant et après l'enregistrement des données en provenance d'un formulaire Web.
Je vous les présente ici avec les explications qui s'imposent.
Dans cette fiche :
Lorsqu'un site Web contient un formulaire, plusieurs fichier interviennent pour traiter ce formulaire.
Dans le fichier qui traite le formulaire, il faut charger les fonctionnalités qui permettent, par exemple, l'utilisation des variables de session et le branchement à la base de données.
Il faut donc ajouter une instruction dans ce fichier pour qu'il puisse utiliser ces fonctionnalités.
Dans la structure que nous utilisons pour coder un site PHP vanille, c'est le fichier configuration.inc qui permet de charger les fonctionnalités dont la page aura besoin.
Rappel : ce fichier ne doit rien envoyer au navigateur.
require 'include/configuration.inc';
Si vous êtes en train de coder un site WordPress, la page qui traite le formulaire doit d'abord charger les fonctionnalités WordPress afin d'être capable d'utiliser les différentes fonctions WordPress requises.
// chargement des fonctionnalités WordPress nécessaires au traitement
require_once "../../../wp-load.php";
Dans la page qui traite le formulaire, il est important de vérifier si l'appel provient de la soumission du formulaire.
En effet, un internaute pourrait entrer directement le nom de la page dans la barre d'URL (ex : https://mondomaine.com/traitement.php) et il faut s'assurer que le programme soit robuste et ne plante pas si cela se produit.
if (!empty($_POST)) {
// traiter le formulaire
// effectuer ensuite une redirection vers une autre page
}
else {
// réagir si l'appel ne provient pas du formulaire
// par exemple, ici, on redirige vers la page d'accueil sans avertissement
header("Location: index.php");
}
Note : il existe d'autres façons de tester si l'appel provient du formulaire Web, par exemple :
if (isset($_POST['soumettre'])) {
...
}
ou encore :
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
...
}
Notez cependant que if (isset($_POST['soumettre'])) {...} ne fonctionnera pas si la soumission a été réalisée avec JavaScript puisque contrairement à PHP, JavaScript n'envoie pas la valeur du bouton de soumission en tant que tel.
Dans la page de traitement, les données soumises par le formulaire sont accessibles dans le tableau $_POST.
$code = $_POST['code'];
$description = $_POST['description'];
Dans le cas d'une case à cocher, il faut savoir que si la case n'est pas cochée, aucune valeur n'est envoyée dans $_POST.
Lorsqu'un formulaire est sousmis alors que la case n'a pas été cochée, la ligne $actif = $_POST['actif']; ferait planter le programme avec le message « Undefined array key "actif" ».
Puisqu'une case à cocher représente un état binaire (oui/non, on/off, true/false), on peut utiliser isset() pour obtenir directement une valeur booléenne : true si la case est cochée et false sinon.
$actif = isset($_POST['actif']); // true si la case est cochée, false sinon (rien envoyé dans $_POST)
Le principe est semblable pour les boutons radio : si aucun bouton n'est choisi, rien ne sera passé dans $_POST.
On s'assurera donc de fournir une valeur par défaut afin que le code puisse traiter correctement la situation.
$saveur = $_POST['saveur'] ?? ''; // blanc si aucun bouton radio n'a été choisi (rien envoyé dans $_POST)
Avant de procéder à l'enregistrement, il est important de bien valider les données côté serveur. Il s'agit de refaire en PHP (pour la sécurité) les validations qui ont été faites côté client (pour la convivialité).
Si la validation côté serveur échoue, il faudra réafficher le formulaire avec les données qui y ont été saisies.
Quelques précautions s'imposent pour limiter les risques que les informations entrées par l'usager soient la source d'une attaque, ou qu'elles nuisent au bon fonctionnement de l'application.
La ligne directrice : il faut nettoyer les données entrées. On rencontre parfois les termes assainir ou désinfecter. En anglais, on dira sanitize inputs.
Le nettoyage des données touche à différents aspects :
Puisque la validation a été réalisée à l'étape précédente, nous traiterons ici de la filtration et de la sécurité.
Grâce à cette précaution, aucune balise <script> et aucun apostrophe ou guillemet ne pourra causer de comportement inattendu.
// *** protection XSS ******************************************************************
foreach ($_POST as $cle => $valeur) {
$_POST[$cle] = htmlspecialchars($valeur, ENT_QUOTES);
}
La page qui traite le formulaire n'est qu'une page de traitement. Elle ne doit rien afficher à l'écran. Elle se terminera toujours par un header() pour rediriger le traitement vers une autre page.
C'est la page ciblée par le header() qui sera chargée d'informer l'internaute de la réussite ou de l'échec de l'opération. La page de traitement devra initialiser des variables de session pour lui indiquer le résultat de l'opération.
Il est intéressant de travailler avec deux variables de session :
$_SESSION['operation_reussie'] = true;
$_SESSION['message_operation'] = "La catégorie a été ajoutée avec succès !";
Il n'y a pas de règle précise sur la page vers laquelle la redirection devrait avoir lieu après le traitement.
Voici tout de même quelques pistes intéressantes.
La page ciblée par la redirection doit maintenant indiquer à l'internaute si l'opération a réussi ou non.
Elle vérifiera d'abord si la variable de session qui contient le message existe.
if (isset($_SESSION['message_operation'])) {
...
}
Si elle existe, elle affichera une division de la bonne couleur selon que l'opération est une réussite ou un échec.
if ($_SESSION['operation_reussie'] == true) {
echo "<div class='alert alert-success' role='alert'>";
}
else {
echo "<div class='alert alert-danger' role='alert'>";
}
// Les erreurs de validation sont placées dans un tableau
if (is_array($_SESSION['message_operation'])) {
echo implode("<br>", $_SESSION['message_operation']);
}
else {
// les autres types de messages sont une simple chaîne
echo $_SESSION['message_operation'];
}
echo "</div>";
Un peu de mise en forme.
.alert {
display: block;
color: white;
font-size: 1.1em;
margin-top: 5px;
margin-bottom: 7px;
padding: 15px 20px;
border: 1px solid #bebdbd;
border-radius: 5px;
box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.4);
}
.alert-success {
background-color: #55b559;
}
.alert-danger {
background-color: #f55145;
}

Après avoir affiché le message, la page ciblée par la redirection remettra les deux variables de session à null afin que le message ne soit pas réaffiché une seconde fois.
$_SESSION['message_operation'] = null;
$_SESSION['operation_reussie'] = null;
Voici un résumé schématique des étapes présentées ci-haut.
▼Publicité