Formation PUB010 : PHP, 2025 Enregistrer les données d'un formulaire Web

40.1 Tout ce qui entoure l'enregistrement des données d'un formulaire Web


***** 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 :

Rôle de chaque fichier

Lorsqu'un site Web contient un formulaire, plusieurs fichier interviennent pour traiter ce formulaire.

  • Fichier PHP qui contient le formulaire : c'est lui qui affiche le formulaire. Sa balise <form> fournira le nom du fichier qui sera exécuté lors de la soumission du formulaire.
  • Fichier exécuté lors de la soumission du formulaire : c'est lui qui se charge de traiter le formulaire. Il s'agit généralement de faire les validations côté serveur, de procéder à l'enregistrement, de retenir l'état du traitement (succès ou erreur) puis de rediriger vers une autre page (vers un autre fichier PHP) après le traitement.
  • Fichier PHP ciblé après le traitement : c'est lui qui affiche à l'usager un message qui dit si l'opération a fonctionné ou non.

Charger les fonctionnalités requises

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.

Site PHP vanille

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.

Traitement du formulaire (Site PHP vanille)

require 'include/configuration.inc';

Site WordPress

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.

Traitement du formulaire (WordPress)

// chargement des fonctionnalités WordPress nécessaires au traitement
require_once "../../../wp-load.php";

Est-ce que l'appel provient du formulaire Web?

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.

Traitement du formulaire (PHP)

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 :

PHP

if (isset($_POST['soumettre'])) {
    ...
}

ou encore :

PHP

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.

Récupération des données du formulaire

Dans la page de traitement, les données soumises par le formulaire sont accessibles dans le tableau $_POST.

Traitement du formulaire (PHP)

$code = $_POST['code'];
$description = $_POST['description'];

Case à cocher

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.

Traitement du formulaire (PHP)

$actif = isset($_POST['actif']);   // true si la case est cochée, false sinon (rien envoyé dans $_POST)

Boutons radio

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.

Traitement du formulaire (PHP)

$saveur = $_POST['saveur'] ?? '';   // blanc si aucun bouton radio n'a été choisi (rien envoyé dans $_POST)

Validation des données

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.

Enregistrement des données

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 :

  • la validation
  • la filtration ou la transformation
  • la sécurité

Puisque la validation a été réalisée à l'étape précédente, nous traiterons ici de la filtration et de la sécurité.

  • La filtration sera souvent réalisée à la main. Il s'agit de modifier les données pour qu'elles respectent certaines contraintes techniques, par exemple supprimer les espaces et caractères spéciaux d'une chaîne qui doit être utilisée dans un URL ou encore normaliser un numéro de téléphone pour s'assurer que les 10 chiffres entrés soient désormais au format 999 999-9999.
  • Afin de se protéger des attaques XSS lors d'un éventuel affichage des données à l'écran, les données saisies dans le formulaire devront être converties avec htmlspecialchars() avant l'enregistrement.

    Grâce à cette précaution, aucune balise <script> et aucun apostrophe ou guillemet ne pourra causer de comportement inattendu.

    Traitement du formulaire (PHP)

    // *** protection XSS ******************************************************************
    foreach ($_POST as $cle => $valeur) {
        $_POST[$cle] = htmlspecialchars($valeur, ENT_QUOTES);
    }

  • Afin de se protéger des injections SQL, les requêtes SQL qui utilisent des données provenant d'un formulaire devront ABSOLUMENT être faites à l'aide de requêtes préparées.

Retenir l'état de l'opération

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 :

  • La première indiquera si l'opération est une réussite ou un échec. Ceci permettra d'afficher un message dans un encadré vert (réussite) ou rouge (échec).
    Traitement du formulaire (PHP)

    $_SESSION['operation_reussie'] = true;

  • La seconde contiendra le message à afficher.
    Traitement du formulaire (PHP)

    $_SESSION['message_operation'] = "La catégorie a été ajoutée avec succès !";

Redirection après le traitement

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.

  • Certains programmes redirigent toujours vers la page qui contient le formulaire. Ceci permet à l'internaute d'entrer de nouvelles informations.
  • Certains programmes redirigent toujours vers la page qui affiche la liste des enregistrements. Ceci permet à l'internaute de voir immédiatement les données qu'il vient d'ajouter.
  • Sur certaines pages, par exemple lors de l'inscription, il est intéressant de rediriger vers la page d'accueil.

Affichage du message

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.

Fichier PHP ciblé après le traitement (PHP)

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.

Fichier PHP ciblé après le traitement (PHP)

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.

CSS

.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;
}

Alertes avec styles personnalisés

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.

Fichier PHP ciblé après le traitement (PHP)

$_SESSION['message_operation'] = null;
$_SESSION['operation_reussie'] = null;

Une image vaut mille mots

Voici un résumé schématique des étapes présentées ci-haut.

Schéma des étapes qui entourent l'enregistrement des données du formulaire

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre