Vous êtes ici : Accueil > Archives > Tutoriels > PHP > Traiter un formulaire

< Retour

Traiter un formulaire

Dernière mise à jour : 28.08.2005

Une question récurrente que se posent les débutants en PHP concerne les formulaires : comment les gère-t'on ? Comment récupère-t'on les valeurs saisies soit pour les traiter, soit pour les réafficher ?
Réponses ci-dessous...

Introduction

Avant de rentrer dans le détail des réponses, je veut faire un petit rappel. Les formulaires (balises <form>...</form>) et les éléments que l'on peut y mettre (<input>, <select>, <textarea>, ...) sont des éléments HTML, ils obéissent à certaines règles liées au protocole HTTP.
Sans rentrer trop dans les détails, cela veut dire qu'un formulaire HTML obéit à des règles et fonctionnements qui sont indépendant du PHP, et qui s'appliquent aussi aux autres langages présents sur le Net (ASP, JSP, ...).

Annexe sur les balises <form> et les éléments que l'on peut y mettre
>> Tutoriels >> annexes >> balise "<form>"


"<form>" et attributs ACTION et METHOD

La balise d'ouverture d'un formulaire a un minimum de deux attributs à renseigner.
Le premier est l'attribut ACTION, il permet de dire vers quelle page ou quel script le contenu sera transmis.

Exemple minimaliste et incomplet :
<form action="traitement.php">[ ... ]</form>
Exemple en utilisant PHP pour donner à l'attribut ACTION le nom de la page en cours :
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>">[ ... ]</form>

Le second attribut minimum d'un formulaire est l'attribut METHOD. Il sert à spécifier quelle sera la méthode employée pour transmettre les données vers la page contenue dans l'attribut ACTION. Il n'existe que deux méthodes possibles, POST ou GET. Elles sont issues du protocole HTTP. La méthode POST transmet les données en mode invisible, tandis que la méthode GET les transmet via la barre d'adresse. On dit ainsi pour la première méthode "poster un formulaire" et pour la seconde "obtenir un formulaire", en allusion à la traduction française de leurs méthodes respectives.

Personnelement, je vous déconseille d'utiliser la méthode GET, car les variables apparaissent dans la barre d'adresse, quelqu'un peut alors les modifier ou voir vos noms de variable... et là, bonjour les intrusions ! Autre point noir à cette méthode, la barre d'adresse de votre navigateur peut accueillir une infinité de caractères, mais le serveur web est généralement limité à 255 caractères (et il est rare que la valeur soit plus élevée). Si votre chaîne GET est plus longue, elle sera tronquée et vous perdrez des données... Utilisez POST tant que vous le pouvez...


Exemples :
<form action="traitement.php" method="get">[ ... ]</form>
<form action="traitement.php" method="post">[ ... ]</form>

"<input>" de type "checkbox" et "radio"

Je ne vais pas rentrer dans le détail des différents éléments que l'on peut mettre dans un formulaire. Mais juste faire une mise en garde sur deux d'entre eux, qui ont un comportement spécial.
Les éléments de saisie de type "case à cocher" ne sont transmis que si et seulement si la fameuse checkbox est cochée.
Pareil pour les "boutons bascule", si il n'y a pas de valeur par défaut spécifiée, les "radios" qui n'ont pas de valeurs ne sont pas transmises...
Il est important de le savoir, et cela n'est pas lié à PHP, qu'on se le dise ! Fin de la parenthèse ;-)

"<textarea>" et sauts de ligne

Les balises <textarea> et </textarea> autorisent la saisie du texte avec des sauts de lignes. Lorsqu'ils sont transmis par POST ou par GET, ils sont « encodés » sous la forme \n\r (et accessoirement, ils seront stockés sous cette forme dans MySQL). Pour les afficher sous forme HTML avec prise en compte des sauts de ligne, vous devez utiliser la fonction PHP >> nl2br(), qui converti les séquences \n\r en balises (X)HTML <br />...

"<form>" et PHP

code source du formulaire :
<html>
<head><title>
formulaire et PHP</title></head>
<body>
<form action=
"traitement.php" method="post" name="test" target="_blank">
<input type=
"hidden" name="var1" value="valeur 1" />
<input type=
"text" name="var2" value="valeur 2" /><br />
<input type=
"radio" name="var3" value="o" /> Oui
<input type="radio" name="var3" value="n" /> Non<br />
<textarea cols=
"70" rows="5" name="var4">zone de texte avec gestion des sauts de ligne.

Une ligne blanche, et une autre...
;-)</textarea><br />
<input type=
"checkbox" name="var5" value="ok" /> OK<br />
<input type=
"submit" name="soumettre" value="soumettre" /><br />
</form>
</body>
</html>
et son aperçu :


Oui Non

OK



Selon la méthode utilisée, POST ou GET, les valeurs "postées" ou "obtenues" se trouvent soit dans $_POST soit dans $_GET. Ces deux variables sont des super globales de PHP, elles n'ont pas besoin d'être déclarées. Elles remplacent depuis PHP 4.3.x les anciennes $HTTP_POST_VARS et $HTTP_GET_VARS ; elles conservent néanmoins le même fonctionnement, puisque ce sont aussi des tableaux de données (array).

Récupérer proprement les données

Autre chose à savoir. Avant PHP 4.3.x et les nouvelles super globales $_POST et $_GET, on pouvait automatiquement récupérer d'un script à un autre les valeurs passées par les méthodes POST ou GET. En raison des problèmes de sécurité et d'incohérences de programmation, cette facilité n'est plus disponible. Il faut donc récupérer proprement les valeurs de ses variables.

<?php
if( isset( $_POST["var1"] ) )
$var1 = $_POST["var1"];
else
$var1 = NULL;

echo ( !empty( $var1 ) ? "\$var1 contient &quot;" . $var1 . "&quot;" : "" );
?>
<?php
if( isset( $_GET["var2"] ) )
$var2 = $_GET["var2"];
else
$var2 = NULL;

echo ( !empty( $var2 ) ? "\$var2 contient &quot;" . $var2 . "&quot;" : "" );
?>
<?php
if( isset( $_POST["var4"] ) )
$var4 = $_POST["var4"];
elseif( isset( $_GET["var4"] ) )
$var4 = $_GET["var4"];
else
$var4 = NULL;

echo ( !empty( $var4 ) ? "\$var4 contient &quot;" . $var4 . "&quot;" : "" );
?>

Lister les données :

$_REQUEST est une autre super globale qui contient toutes les variables et leurs valeurs, que la transmission se fassent par les méthodes POST ou GET, ou même, si je ne dit pas de bêtises, par les sessions et les cookies.
<?php
reset( $_REQUEST );
while( list( $key, $value ) = each( $_REQUEST ) )
echo $key . " = " . $value . "<br />\n";
?>

Exemples :
Ce premier formulaire utilise la méthode POST, si vous cliquez sur le bouton "soumettre" sans avoir cocher la case OK ou sans choisir entre les boutons bascule oui et non, le script de démo de la section 1) affichera des lignes blanches, correspondant aux variables qui n'auront pas été transmises...


Oui Non

OK



Ce second formulaire utilise la méthode GET, le script de démo de la section 1) n'affichera donc que des lignes blanches, tandis que la section 2) affichera les valeurs transmises, qui seront aussi visible dans la barre d'adresse de votre navigateur...


Oui Non

OK



Annexe sur les balises <form> et les éléments que l'on peut y mettre
>> Tutoriels >> annexes >> balise "<form>"