Dans cette leçon, nous allons voir comment récupérer et manipuler (afficher, stocker, etc.) les données récoltées via les formulaires.
Les superglobales $_POST et $_GET
Dans la leçon précédente, nous avons créé un formulaire dans une page qui s’appelait formulaire.html
.
Notre élément form
possédait les attributs suivants : method="post"
et action="formulaire.php"
.
Cela signifie que les données vont être envoyées via transaction post http à la page (ou au script) formulaire.php
.
La première chose à comprendre ici est que toutes les données du formulaire vont être envoyées et être accessibles dans le script PHP mentionné en valeur de l’attribut action
, et cela quelle que soit la méthode d’envoi choisie (post
ou get
).
En effet, le PHP possède dans son langage deux variables superglobales $_GET
et $_POST
qui sont des variables tableaux et dont le rôle va justement être de stocker les données envoyées via des formulaires.
Plus précisément, la superglobale $_GET
va stocker les données envoyées via la méthode get
et la variable $_POST
va stocker les données envoyées via la méthode post
.
Les valeurs vont être stockées sous forme d’un tableau associatif c’est-à-dire sous la forme clef => valeur où la clef va correspondre à la valeur de l’attribut name
d’un champ de formulaire et la valeur va correspondre à ce qui a été rempli (ou coché, ou sélectionné) par l’utilisateur pour le champ en question.
A noter : On va également pouvoir utiliser la variable superglobale $_REQUEST
pour accéder aux données d’un formulaire sans se soucier de la méthode d’envoi. Cependant, utiliser $_REQUEST
ne présente généralement que peu d’intérêt en pratique et peut potentiellement ouvrir des failles de sécurité dans nos formulaires. C’est la raison pour laquelle je n’en parlerai pas plus dans ce cours.
Affichage simple des données de formulaire reçues
Comme $_GET
et $_POST
sont des variables superglobales, elles seront toujours accessibles n’importe où dans le script par définition.
On va alors très facilement pouvoir accéder aux données envoyées dans les formulaires en parcourant nos variables superglobales $_GET
ou $_POST
.
Par exemple, on va pouvoir très simplement afficher les données reçues à l’utilisateur. Pour cela, nous allons echo
les valeurs contenues dans $_POST
via notre page d’action formulaire.php
:
<!DOCTYPE html> <html> <head> <title>Page de traitement</title> <meta charset="utf-8"> </head> <body> <p>Dans le formulaire précédent, vous avez fourni les informations suivantes :</p> <?php echo 'Prénom : '.$_POST["prenom"].'<br>'; echo 'Email : ' .$_POST["mail"].'<br>'; echo 'Age : ' .$_POST["age"].'<br>'; echo 'Sexe : ' .$_POST["sexe"].'<br>'; echo 'Pays : ' .$_POST["pays"].'<br>'; ?> </body> </html>
En pratique, cependant, nous n’allons pas créer des formulaires pour afficher les données aux utilisateurs mais bien pour utiliser les données de notre côté. Généralement, donc, l’utilisateur ne verra pas la page de traitement des données et nous le redirigerons plutôt immédiatement vers une page pertinente.
Par exemple, on va renvoyer l’utilisateur vers une page de remerciement si le formulaire était un formulaire créé pour nous envoyer un message, ou vers la page d’accueil du site ou son espace client si le formulaire était un formulaire de connexion, ou encore le renvoyer vers la page où se situe le formulaire si le formulaire servait à envoyer un commentaire sur un article.
Pour renvoyer un utilisateur vers une autre page, on peut utiliser la fonction PHP header()
à laquelle on va passer la page où l’utilisateur doit être renvoyé sous la forme Location : adresse de ma page
.
Pour illustrer cela, on va créer deux nouvelles pages formulaire2.php
et form-merci.html
. Notre page formulaire2.php
va être notre nouvelle page d’action, pensez donc bien à modifier la valeur de l’attribut action
dans le formulaire.
Dans cette page, nous allons donc effectuer différentes manipulations de données (que l’on va se contenter d’imaginer pour le moment) et renvoyer immédiatement l’utilisateur vers une autre page qu’on appelle ici form-merci.html
et qui va être une page de remerciement.
Manipulation et stockage de données
Sur les sites Internet, les formulaires sont utilisés de manière courante pour effectuer différents types d’opération comme :
- Donner la possibilité à un utilisateur de s’inscrire ;
- Donner la possibilité à un utilisateur de se connecter ;
- Permettre à un utilisateur de poster un commentaire ;
- Permettre à un utilisateur de nous envoyer un message ;
- Etc.
Dans chacun de ces cas, nous allons manipuler les données envoyées dans des buts différents : enregistrer les données pour une inscription, vérifier les données de connexion envoyées, enregistrer et afficher un commentaire, etc.
Nous n’allons bien évidemment pas ici créer un script complet pour chacune de ces situations car cela serait bien trop long et car cela nous éloignerait du sujet de cette leçon.
Cependant, je vous propose ici de voir comment on va pouvoir réceptionner les données d’un formulaire et les enregistrer en base de données pour vous donner un exemple concret.
Cela va finalement être très simple puisque nous savons que nous avons toutes les données du formulaire stockées dans notre variable $_POST
. La vraie difficulté ici va finalement être de savoir manipuler les bases de données. Si vous n’êtes pas au point sur ce sujet, je vous renvoie aux parties précédentes !
De mon côté, je vais réutiliser ma base de données cours
créée précédemment dans ce cours et je vais également créer une table form
dans cette base de données.
Je vous invite à faire de même, soit en passant par phpMyAdmin, soit via un script PHP comme celui-ci :
<?php $serveur = "localhost"; $dbname = "cours"; $user = "root"; $pass = "root"; try{ //On se connecte à la BDD $dbco = new PDO("mysql:host=$serveur;dbname=$dbname",$user,$pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //On crée une table form $form = "CREATE TABLE form( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, prenom TEXT, mail TEXT, age INT, sexe TEXT, pays TEXT)"; $dbco->exec($form); } catch(PDOException $e){ echo 'Erreur : '.$e->getMessage(); } ?>
Bien évidemment, on crée notre table de façon à ce qu’elle puisse recevoir les données du formulaire. Ici, nous allons donc créer des colonnes prenom (TEXT), mail (TEXT), age (TEXT), sexe (INT) et pays (TEXT) ainsi que bien sûr notre traditionnelle colonne id (INT UNSIGNED AUTO_INCREMENT PRIMARY KEY).
Nous n’avons ensuite plus qu’à insérer dans notre table les données récoltées. Pour cela, nous allons modifier le script de notre page d’action formulaire2.php
.
<?php $serveur = "localhost"; $dbname = "cours"; $user = "root"; $pass = "root"; $prenom = $_POST["prenom"]; $mail = $_POST["mail"]; $age = $_POST["age"]; $sexe = $_POST["sexe"]; $pays = $_POST["pays"]; try{ //On se connecte à la BDD $dbco = new PDO("mysql:host=$serveur;dbname=$dbname",$user,$pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //On insère les données reçues $sth = $dbco->prepare(" INSERT INTO form(prenom, mail, age, sexe, pays) VALUES(:prenom, :mail, :age, :sexe, :pays)"); $sth->bindParam(':prenom',$prenom); $sth->bindParam(':mail',$mail); $sth->bindParam(':age',$age); $sth->bindParam(':sexe',$sexe); $sth->bindParam(':pays',$pays); $sth->execute(); //On renvoie l'utilisateur vers la page de remerciement header("Location:form-merci.html"); } catch(PDOException $e){ echo 'Impossible de traiter les données. Erreur : '.$e->getMessage(); } ?>
Ici, on commence par stocker les données contenues dans $_POST
dans différentes variables PHP simples.
Note : J’expliquerai dans a leçon suivante pourquoi vous ne devriez jamais directement enregistrer les données reçues en base de données comme cela.
On insère ensuite les données dans notre table. Si tout se passe bien, on renvoie l’utilisateur vers la page form-merci.html
. Dans le cas où une erreur est rencontrée, on affiche l’erreur.
Vous pouvez essayer de remplir à nouveau votre formulaire !
Note : Bien évidemment, ce script est simplifié à l’extrême et n’est pas utilisable en l’état pour des raisons de sécurité sur les données et etc. L’idée ici est simplement de vous montrer en pratique comment différents éléments du PHP vont pouvoir fonctionner ensemble.