Glisser

PHP : les formulaires HTML (GET et POST)

PHP : formulaires HTML, GET et POST (partie 13)

Écrit par : Thibault Chazottes

À quoi sert un formulaire

Sans formulaire, la page se lit. Personne ne s’inscrit, ne se connecte, ne laisse de commentaire. Le formulaire est le moyen d’envoyer des données à un script PHP.

On ne refait pas un cours d’HTML. La base du balisage, puis la récupération côté PHP. Tutoriel officiel : traiter des formulaires.


form, label, et les champs

Référence : élément form.

Une balise form. Dedans, un bloc par champ : un label et un contrôle. for sur le label reprend l’id du champ. Cliquer le libellé place le curseur dans le champ.

Trois champs, comme dans la démo :

  • un input texte, pour le nom ;
  • un input de type email ;
  • un textarea, pour le message.

select, cases à cocher, boutons radio : même principe. La suite ne dépend pas du type de champ.

<form>
    <div>
        <label for="name">Nom</label>
        <input type="text" id="name" name="name">
    </div>
    <div>
        <label for="email">E-mail</label>
        <input type="email" id="email" name="email">
    </div>
    <div>
        <label for="message">Message</label>
        <textarea id="message" name="message"></textarea>
    </div>
    <button type="submit">Envoyer</button>
</form>

Un peu de CSS aligne les champs. Sans style, le formulaire reste moche. Le CSS ne change pas l’envoi.


Par défaut : GET, sur la même URL

Aucun method, aucun action. Le navigateur fait deux choses :

  1. il utilise le verbe GET ;
  2. il renvoie les données sur l’URL de la page en cours.

On saisit un nom, un e-mail, un message, on valide (Entrée ou le bouton). La même adresse est rappelée, avec une chaîne de requête :

http://localhost:8000/?name=test&email=test@test.fr&message=Bonjour

? ouvre les paramètres. Chaque paire s’écrit clé=valeur. & sépare les paires. Ce sont des paramètres d’URL, transportés par GET.

Le navigateur encode certains caractères (@ devient %40, un espace devient + ou %20). On y revient dans une vidéo suivante, avec les paramètres d’URL.


La clé vient de l’attribut name

Le formulaire construit un tableau clé / valeur. Il n’invente pas les clés : il reprend l’attribut name de chaque champ.

name, email et message sur les trois champs donnent trois clés : name, email, message.

L’id sert au label, au CSS, au JavaScript. PHP lit name. On remplace name="name" par name="identifiant-visiteur", on renvoie le formulaire : la clé dans l’URL devient identifiant-visiteur.


Lire l’URL avec $_GET

PHP crée des superglobales : des tableaux remplis automatiquement, disponibles dans tout le script. Il y en a plusieurs. Pour l’URL, c’est $_GET.

var_dump affiche le contenu d’une variable. exit arrête le script juste après, pour ne voir que ce dump.

<?php
var_dump($_GET);
exit;

Avec l’URL de l’exemple, l’affichage ressemble à ceci :

array(3) {
  ["name"]=>
  string(4) "test"
  ["email"]=>
  string(12) "test@test.fr"
  ["message"]=>
  string(7) "Bonjour"
}

Une clé, toute seule :

<?php
echo $_GET['name'];
// test

Les données sont parties en GET, vers le même fichier. Le dump se place donc dans index.php, au-dessus du formulaire.


POST, et $_POST

Écrire method="get" ne change rien : c’est déjà le comportement par défaut. L’autre verbe utile ici : post.

<form method="post">

POST place les données dans le corps de la requête HTTP. L’URL reste nue : pas de ?name=test.

Ces champs ne sont plus dans $_GET. On lit $_POST.

<?php
var_dump($_POST);
exit;

Même tableau : name, email, message. Seul le transport change.

Après un envoi en POST, F5 redemande souvent au navigateur de renvoyer le formulaire. La page courante est le résultat d’un POST : recharger, c’est rejouer cette requête.


Quand GET, quand POST

Les deux verbes existent sur le web. Le choix dépend de ce qu’on envoie.

Où vont les données Visibles dans l’URL Lecture PHP
GET chaîne de requête oui $_GET
POST corps de la requête non $_POST

Un long commentaire en GET produit une URL illisible, et elle finit par dépasser la longueur acceptée par le navigateur ou le serveur. Pour un message, un contact, une inscription : POST.

GET reste adapté pour demander une ressource, ou pour un paramètre court qu’on veut voir dans l’adresse (une recherche, un numéro de page). La playlist y revient.


Choisir la cible avec action

Sans action, l’envoi revient sur l’URL en cours. action désigne un autre fichier.

<form method="post" action="submit.php">

submit.php, à côté de index.php :

<?php
echo 'Formulaire bien reçu';
var_dump($_POST);

On valide. Le navigateur quitte la page du formulaire et ouvre submit.php. Le texte s’affiche, suivi du tableau.

En pratique, ce fichier vérifie que les données tiennent debout, les enregistre (en base, plus tard), puis renvoie vers une page du genre « merci, message bien reçu ».


À retenir

  1. Un formulaire envoie les champs. Les clés du tableau sont les attributs name.
  2. Défaut : GET, même URL. PHP range ça dans $_GET.
  3. method="post" : données dans la requête HTTP, lues dans $_POST. L’URL ne change pas.
  4. action choisit le fichier qui reçoit. Sans action, c’est la page courante.
  5. $_GET et $_POST sont des superglobales. PHP les remplit seul.

Démo vidéo


FAQ rapide (SEO & technique)

Où part le formulaire si action est absent ?
Sur la même URL. Voir l’élément form.

PHP lit id ou name ?
name. L’id relie le label au champ. La clé dans $_GET ou $_POST reprend name.

Différence entre $_GET et $_POST ?
$_GET contient les paramètres d’URL. $_POST contient le corps d’une requête POST. Voir les superglobales.

Pourquoi F5 veut renvoyer le formulaire ?
La page affichée vient d’un POST. Recharger rejoue cette requête.

Un long message en GET ?
L’URL devient illisible, puis trop longue. Pour un message, on envoie en POST.


Conclusion

Le HTML collecte les champs. method choisit GET ou POST. action choisit le fichier. PHP lit le résultat dans $_GET ou $_POST.

La vidéo suivante détaille les superglobales PHP et les paramètres d’URL. Abonnez-vous à la chaîne YouTube pour la suite.

Étiquettes :