PHP - Les formulaires
Noter ce cours :
Présentation
Quand je vous ai présenté PHP au début de cette section, je vous avais parlé d'interactivité avec le visiteur. C'est là que les formulaires sont le plus souvent utilisés. En effet un formulaire permet d'interagir avec l'internaute. L'avantage que nous allons voir maintenant est que PHP permet de faire tout et n'importe quoi instantanément en fonction de ce que souhaite le visiteur. Vous allez pouvoir disposer d'un site complètement dynamique sans bouger le petit doigt !
Je supposerai que vous savez comment créer des formulaires en (X)HTML, donc je ne ferai pas de rappel poussé sur leur utilisation. N'hésitez donc pas à revoir le cours de HTML si vous pensez avoir des lacunes à ce niveau.
Il existe deux méthodes d'envoi de formulaire en (X)HTML : la méthode POST et la méthode GET. La méthode GET transmet les informations du formulaire dans l'adresse du site, adresse qui est limitée en fonction du navigateur à un certain nombre de caractères et qui est encore moins sécurisée que la méthode POST. Nous allons donc commencer par la méthode POST.
PHP va créer lorsque des données de formulaires seront disponibles, des variables commençant par $_GET ou $_POST (en fonction de la méthode d'envoi et de l'url de la page), vous allez donc voir que d'exploiter les données de formulaires est très simple !
L'envoi de formulaire via méthode POST et les textbox
Nous allons commencer par le traitement des formulaires simples comportant une zone de texte. Nous avons attribué une valeur par défaut à la zone de texte. Voyons le code XHTML :
<form action="page.php?formulaire" method="post">
<p><input type="text" name="pseudo" value="Entre ici ton pseudo" /></p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Comme vous pouvez le constater, il n'y a rien de compliqué là dedans. J'ai juste corsé un peu l'adresse de la page php qui sera utilisée pour le traitement. Comme je vous l'ai appris pour la page concernant les variables en PHP, ici une variable nommée $_GET['formulaire'] sera présente mais ne comportera pas de valeur. C'est tout pour les complications :p
Bon tout ça c'est bien beau, mais une fois que le visiteur clique sur "Envoyer" que se passe t-il sur la page "page.php" ? Et bien la variable $_POST['pseudo'] sera crée et sa valeur sera le pseudo qu'a entré le visiteur. Si le visiteur a juste cliqué sur "Envoyer" sans toucher à la zone de texte, la variable $_POST['pseudo'] aura pour valeur 'Entre ici ton pseudo' qui est la valeur par défaut de cette zone de texte.
Lorsque vous soumettez un formulaire avec PHP via la méthode POST, celui-ci crée des variables $_POST['X'] avec 'X' correspondant aux noms des différents champs. Ceci est valable pour tout formulaire. Les valeurs de ces différentes variables correspondent aux valeurs des champs en question.
Pour tout champ de formulaire, lorsque le visiteur ne touche à rien, les valeurs par défaut seront conservées et utilisées de la même manière par PHP (qui n'a aucun moyen de savoir si il s'agit d'une valeur par défaut ou d'une valeur remplie par le visiteur). Vous venez maintenant de comprendre pourquoi nous parlerons de sécurité plus loin sur cette page. En effet, comme PHP ne peut savoir de qui proviennent les informations, il faudra toujours les vérifier pour éviter les failles de sécurité.
Revenons à notre formulaire. Le visiteur a cliqué et a renseigné son pseudo, maintenant nous voudrions l'afficher. Voici un code tout simple pour la page "page.php" permettant de faire ceci en PHP :
<?php
if(isset($_POST['pseudo'], $_GET['formulaire'])) //On regarde si les variables $_POST['pseudo'] et $_GET['formulaire'] existent, sinon la condition ne sera pas validée
{
echo htmlentities($_POST['pseudo']);
}
?>
Vous remarquerez que l'on regarde d'abord si les variables que l'on souhaite utiliser existent grâce à la fonction isset() (qui peut prendre en paramètre plusieurs variables). Ceci est tout à fait normal et vous devez procéder de la sorte lorsque vous souhaitez accéder avec PHP à des variables provenant de formulaires, dont vous n'êtes pas sûr de l'existence. Voyons ce code que n'importe quel débutant (ce n'est pas péjoratif) aurait pu faire :
<?php
echo htmlentities($_POST['pseudo']);
?>
Le problème de ce code, est qu'il ne vérifie pas si la variable $_POST['pseudo'] existe. Ce code peut donc tenter d'afficher une variable qui n'existe pas, ce qui retournera généralement une erreur. Plus grave, si vous utilisez cette variable pour faire des traitements plus poussés, vous pourrez avoir de belles failles de sécurité dans votre site. Un mot maintenant sur la fonction htmlentities() : elle permet de transformer le code HTML pouvant être envoyé par le visiteur en code visible. En effet, imaginiez que votre visiteur entre comme pseudo "<body>" par exemple, et bien vous ne verrez rien à l'écran car le texte qu'il aura entré sera interprété comme étant du code HTML (logique, puisque PHP envoie du texte, et <body> est un texte comme un autre pour PHP, il ne fera donc pas la différence). Il faut donc transformer <body> en son code HTML visible. Voilà pourquoi on utilise toujours cette fonction.
D'une manière générale, servez-vous toujours de la fonction htmlentities() lorsque vous tentez d'afficher du texte provenant de formulaires.
Les textarea
Passons maintenant aux zones de texte plus évoluées. Nous allons maintenant traiter le cas de la zone de texte multilignes appelée textarea. Voici un exemple simple en XHTML :
<form action="traitement.php" method="post">
<p><textarea name="description" rows="5" cols="50">Entrez ici une description de votre site</textarea></p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Tout ce qu'il y a de plus classique. Lorsque le formulaire est envoyé à la page "traitement.php", vous pourrez récupérer la variable $_POST['description'] (car cette fois-ci le champ porte le nom "description" et non "pseudo") comme nous l'avons fait tout à l'heure. Voilà ce que ça donne :
<?php
if(isset($_POST['description'])) //On regarde si la variable $_POST['description'] existe
{
echo htmlentities($_POST['description']);
}
?>
Le select
Bon, pour l'instant rien de compliqué. Nous allons maintenant étudier le cas du select. Comme vous le savez, un <select> peut être à choix unique ou à choix multiples. Regardons le code pour le select à choix unique. Vous allez voir que la méthode de récupération de la valeur ne diffère pas :
<form action="traitement.php" method="post">
<p>
<select name="couleur">
<option value="rouge">Couleur rouge</option>
<option value="vert" selected="selected">Couleur verte</option>
<option value="bleu">Couleur bleue</option>
</select></p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Ici, si nous souhaitons afficher la couleur qu'a sélectionné le visiteur, nous utiliserons ce code :
<?php
if(isset($_POST['couleur']))
{
echo htmlentities($_POST['couleur']);
}
?>
Nous allons maintenant passer aux choses plus sérieuses avec le select multiple. En effet, imaginions que quelqu'un souhaite commander un article en plusieurs couleurs, il faudra qu'il puisse sélectionner plusieurs valeurs d'un coup dans le select. Voyons comment ça se présente en (X)HTML :
<form action="traitement.php" method="post">
<p>
<select name="couleur[]" multiple="multiple">
<option value="rouge">Couleur rouge</option>
<option value="vert" selected="selected">Couleur verte</option>
<option value="bleu">Couleur bleue</option>
</select></p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Si l'utilisateur sélectionne une ou plusieurs valeurs, que va t-il se passer ? Et bien je vous le donne en mille : PHP va créer un tableau $_POST['couleur'] qui contiendra la ou les différentes valeurs que l'utilisateur aura sélectionné. Voici un exemple qui affiche toutes les valeurs sélectionnées par le visiteur :
<?php
if(isset($_POST['couleur']) AND is_array($_POST['couleur']))
{
foreach($_POST['couleur'] AS $valeur)
{
echo 'Vous avez sélectionné la couleur'.htmlentities($valeur).'<br />';
}
}
?>
Notez l'utilisation du is_array() qui permet de vérifier si on a bien transmis un tableau. Ceci est très important car la fonction foreach() nécessite un tableau en paramètre (ici $_POST['couleur'] est le tableau à parcourir). Si $_POST['couleur'] n'avait pas été un tableau, vous auriez eu une erreur, c'est donc pour ça que l'on vérifie non seulement que $_POST['couleur'] existe mais qu'il est un tableau. Si vous ne vous rappelez plus comment on utilise les tableaux, n'hésitez pas à aller relire le cours les concernant.
D'une manière générale, pensez à toujours vérifier pour les données provenant de formulaires, que votre variable est du type que vous attendez, avant d'effectuer un quelconque traitement sur elle.
Les cases à cocher (checkbox)
Voyons maintenant comment on utilise les cases à cocher. On commence comme d'habitude avec un exemple de code XHTML. Le principe consistera à savoir ici si le visiteur veut se connecter automatiquement au site. Pour cela, on utilisera une checkbox. Si le visiteur la coche, il sera connecté automatiquement au site lors de sa prochaine visite, dans le cas contraire rien ne se passera. Voici le code XHTML :
<form action="traitement.php" method="post">
<p><input type="checkbox" name="connexion_automatique" value="1" /></p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Bon jusque là rien de très compliqué. Vous allez voir pour la partie de traitement, c'est toujours aussi simple !
<?php
if(isset($_POST['connexion_automatique']))
{
echo 'Vous avez coché la case !';
}
?>
Ici il s'agit d'un cas particulier, en effet, lorsque la case à cocher n'est pas cochée, le navigateur ne renvoie rien, donc la variable $_POST['connexion_automatique'] n'existe pas. Si elle existe, cela signifie donc que la case a été cochée.
Les boutons radios
Les boutons radio permettent de ne sélectionner qu'une seule option parmis plusieurs. Par exemple si vous demandez "souhaitez-vous recevoir la newsletter mensuelle ?" le visiteur peut répondre "oui" ou "non", mais pas les deux à la fois. Voici ce que ça donne en XHTML :
<form action="traitement.php" method="post">
<p><input type="radio" name="choix" value="oui" />Oui</p>
<p><input type="radio" name="choix" value="non" />Non</p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Ici, pour savoir ce qu'a répondu le visiteur, on fera ceci en PHP :
<?php
if(isset($_POST['choix']))
{
echo htmlentities($_POST['choix']); //affichera "oui" ou "non" en fonction de ce qu'a sélectionné le visiteur
}
?>
Les champs cachés (hidden)
Les champs cachés fonctionnent exactement de la même manière que pour un champ de texte simple, la seule différence étant qu'ils ne seront pas affichés sur la page web. Vous pourrez transmettre ainsi des informations que le visiteur n'a pas besoin de remplir. N'allez pourtant pas croire que cette méthode est sécurisée, il s'agit juste d'une méthode bien pratique pour transmettre des variables et elle doit donc subir les mêmes traitements que les autres variables, à savoir une vérification minutieuse avant toute utilisation.
Voici un exemple en XHTML :
<form action="traitement.php" method="post">
<p><input type="hidden" name="champ_cache" value="ici ce que vous voulez" />Oui</p>
<p><input type="submit" value="Envoyer" /></p>
</form>
Et voici comment on récupère la valeur de ce champ caché en PHP :
<?php
if(isset($_POST['champ_cache']))
{
echo htmlentities($_POST['champ_cache']); //affiche le contenu du champ
}
?>
La méthode get
Cette méthode de transmission de données passe par l'url, nous avons vu comment récupérer des données en PHP qui provenaient de l'url, il s'agit des variables $_GET['nom'] où nom est le nom du champ de formulaire dans notre cas.
Voici un exemple en XHTML pour le champ de type hidden :
<form action="traitement.php" method="get">
<p><input type="hidden" name="champ_cache" value="ici ce que vous voulez" />Oui</p>
<p><input type="submit" value="Envoyer" /></p>
</form>
La valeur se récupère de la même façon, en GET cette fois :
<?php
if(isset($_GET['champ_cache']))
{
echo htmlentities($_GET['champ_cache']); //affiche le contenu du champ
}
?>
Chapitre suivant