PHP et les formulaires
Date de publication : 31/05/2005 , Date de mise à jour : 12/10/2006
Par
julp (Autres articles)
Les formulaires manipulés par PHP permettent d'alimenter un site mais aussi d'en
gérer son contenu.
Ce tutoriel vous montrera comment utiliser chaque élément d'un formulaire : des
zones de texte aux cases à cocher, ...
Introduction
1. Les champs de texte
2. Les zones de texte
3. Les boutons d'option
4. Les cases à cocher
5. Les listes déroulantes ...
5.1. ... à sélection simple
5.2. ... à sélection multiple
6. Approfondissements
Introduction
Le langage PHP permet de manipuler les formulaires : du contrôle de la
saisie dans un champ à l'affichage simple de la saisie des différents
champs. En général, c'est le formulaire de type POST qui sera utilisé,
c'est ce type de formulaire que nous utiliserons dans les exemples de ce
cours.
Il est extrêmement simple de récupérer dans une variable PHP, le contenu
d'un champ. Cependant, il existe un cas un peu spécial : ce sont les cases
à cocher car dans ce cas nous devons utiliser un tableau pour stocker les
options qui ont été cochées par l'utilisateur. Donc, qu'il s'agisse d'un
champ texte, d'une zone de texte, une liste déroulante ou encore un bouton
d'option, la variable qui contiendra ce que l'utilisateur a entré sera
$_POST["ce qui correspond à l'attribut name de la balise"].
Ainsi en PHP, une variable est créée automatiquement au nom du champ.
Exemple :
<form method="POST">
<input type="text" name="variable" .../>
</form>
|
Nous récupérerons le contenu de la ligne de texte dans la variable PHP
$_POST['variable']. Cette façon de procéder sera la même pour
tous les autres contrôles d'un formulaire sauf pour les cases à cocher !
Deuxième exemple avec différents contrôles :
<form method="POST">
<input type="text" name="text" .../>
<textarea name="textarea"></textarea>
<input type="radio" name="radio"/>
...
</form>
|
On récupérera le contenu des différents contrôles de type text, textarea
et radio respectivement dans les variables PHP suivantes :
$_POST['text'], $_POST['textarea'], $_POST['radio'].
Par contre pour un ensemble de case à cocher, nous allons utiliser un
tableau pour stocker les différentes valeurs. En effet, un même groupe
de case à cocher peut nous donner plusieurs résultats comme un seul voire
aucun. Voyons un exemple :
<form method="POST">
<input type="checkbox" name="option[]"/>Option 1
<input type="checkbox" name="option[]"/>Option 2
<input type="checkbox" name="option[]"/>Option 3
</form>
|
Vous reconnaîtrez au premier coup d'oeil qu'il s'agit d'un tableau grâce
à la présence de crochets ! La variable ou tableau qui accueillera le
résultat sera donc $_POST['option']. Pour l'instant, c'est d'une
simplicité enfantine, car tout est donné par l'attribut name de la
balise.
1. Les champs de texte
Désormais, nous pouvons facilement afficher le contenu d'un champ de texte,
en voici un exemple :
<?php
if (isset($_POST['mon_champ'])) {
?>
Votre champ contenait :
<b><?php echo $_POST['mon_champ']; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<input name="mon_champ" type="text"/>
<input name="valider" type="submit" value="OK"/>
</form>
|
La fonction
isset()
nous permet de savoir si la variable
$_POST['mon_champ'] existe. Or
celle-ci n'existera que si le formulaire a été validé. Nous aurions pu
indifféremment appliquer ce contrôle sur le bouton submit.
Passons au même exemple mais cette fois-ci avec réaffichage du formulaire
et de son contenu :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Votre champ contenait :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<input name="mon_champ" type="text" value="<?php echo $mon_champ; ?>"/>
<input type="submit" value="OK"/>
</form>
|
J'ai utilisé une variable intermédiaire $mon_champ qui prend la
valeur de $_POST['mon_champ'] lorsque le formulaire a été soumis
(ou validé) (cas identifiable grâce à la fonction isset() - voir plus haut)
et dans le cas contraire la chaîne vide qui sera considérée comme faux dans
les tests (instructions if par exemple). Cela permet donc de simplifier le
code si la saisie de ce champ est obligatoire, car les cas où le champ est
vide ou le formulaire n'a pas été validé sont identiques du point de vue
du résultat (ici un simple affichage de la saisie de l'utilisateur).
Il en va de même pour les champs de mot de passe. Il vous suffit de
remplacer dans votre code HTML type="text" par type="password".
2. Les zones de texte
Nous allons commencer par un premier exemple, le plus simple : afficher le
contenu de la zone de texte si celle-ci n'est pas vide !
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Votre champ contenait :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<textarea name="mon_champ"></textarea>
<input type="submit" value="OK"/>
</form>
|
Cet exemple, ne diffère guère du premier que nous avons vu avec les champs
de texte. Un peu plus compliqué maintenant, car nous allons réaffiché dans
le même contrôle son contenu :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Votre champ contenait :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<textarea name="mon_champ"><?php echo $mon_champ; ?></textarea>
<input type="submit" value="OK"/>
</form>
|
Lorsque vous affichez quelque chose dans un textarea, faîtes attention de
bien coller la balise de début et de fin du textarea, car dans certains
cas vous aurez par exemple dans votre zone de texte soit des espaces ou
un saut de ligne qui traîne. Vous pouvez dans ce cas utilisez la fonction
trim().
3. Les boutons d'option
Le cas des boutons d'option est simple à gérer car pour un nombre quelconque
de contrôles radio, c'est la même variable qui correspond. C'est donc cette
variable qui contiendra ce que l'utilisateur a choisi. Voici, un premier
exemple simple qui se contente d'afficher l'option choisie :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Vous avez choisi :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<input type="radio" name="mon_champ" value="Option 1"/>Option 1<br/>
<input type="radio" name="mon_champ" value="Option 2"/>Option 2<br/>
<input type="radio" name="mon_champ" value="Option 3"/>Option 3<br/>
<input type="submit" value="OK"/>
</form>
|
Nous allons maintenant faire la même chose, mais l'option qui a été
choisie sera sélectionnée à nouveau.
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Vous avez choisi :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<input type="radio" name="mon_champ" value="Option 1" <?php if($mon_champ == "Option 1") { echo 'checked'; } ?>/>Option 1<br/>
<input type="radio" name="mon_champ" value="Option 2" <?php if($mon_champ == "Option 2") { echo 'checked'; } ?>/>Option 2<br/>
<input type="radio" name="mon_champ" value="Option 3" <?php if($mon_champ == "Option 3") { echo 'checked'; } ?>/>Option 3<br/>
<input type="submit" value="OK"/>
</form>
|
L'utilisation d'un tableau aurait énormément simplifié le code ci-dessus.
En effet, une boucle foreach permettrait de faire une unique condition qui
permettrait de resélectionner celle que l'utilisateur a choisie car ce code
devient vite pénible, lorsque les options se font plus nombreuses :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
$options = array(
'Option 1',
'Option 2',
'Option 3'
);
if($mon_champ) {
?>
Vous avez choisi :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<?php
foreach ($options as $v) {
if ($v == $mon_champ) {
echo '<input type="radio" name="mon_champ" value="' . $v . '" checked/>' . $v . '<br/>';
} else {
echo '<input type="radio" name="mon_champ" value="' . $v . '"/>' . $v . '<br/>';
}
}
?>
<input type="submit" value="OK"/>
</form>
|
4. Les cases à cocher
Voici la partie la plus complexe à maîtriser car elle fait nécessairement
appel aux tableaux (vous pourrez alors utiliser les tableaux sur les boutons
d'option par la suite pour vous facilitez la tâche). Nous allons dans un
premier temps nous contenter d'afficher les options choisies par
l'utilisateur :
<?php
if (isset($_POST['mon_champ'])) {
echo "Vous avez choisi :";
for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
echo "<br/><b>" . $_POST['mon_champ'][$i] . "</b>";
}
}
?>
<form method="POST">
<input type="checkbox" name="mon_champ[]" value="Option 1"/>Option 1<br>
<input type="checkbox" name="mon_champ[]" value="Option 2"/>Option 2<br>
<input type="checkbox" name="mon_champ[]" value="Option 3"/>Option 3<br>
<input type="submit" value="OK">
</form>
|
Il faut savoir que la variable $_POST['mon_champ'] est un tableau
et qu'elle contient uniquement les valeurs que l'utilisateur à cocher.
Notez bien la différence dans le formulaire, pour signifier que les cases
cochées seront des éléments d'un tableau nous avons donc ajouté des
crochets. Dans l'exemple suivant, nous allons réafficher dans le formulaire
les cases sélectionnées par l'utilisateur. Encore une fois nous pourrions
utiliser un autre tableau qui contiendrait toutes les cases du formulaire
ce qui nous permettrait d'afficher la case cochée ou non dans une simple
boucle foreach mais nous allons rester au plus simple pour que tout ceci
soit plus clair !
<?php
if (isset($_POST['mon_champ'])) {
echo "Vous avez choisi :";
for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
echo "<br/><b>" . $_POST['mon_champ'][$i] . "</b>";
}
}
function est_selectionne($option) {
if (!isset($_POST['mon_champ'])) {
return FALSE;
}
for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
if ($_POST['mon_champ'][$i] == $option) {
return TRUE;
}
}
return FALSE;
}
?>
<form method="POST">
<input type="checkbox" name="mon_champ[]" value="Option 1" <?php if(est_selectionne("Option 1")) { echo 'checked'; } ?>/>Option 1<br/>
<input type="checkbox" name="mon_champ[]" value="Option 2" <?php if(est_selectionne("Option 2")) { echo 'checked'; } ?>/>Option 2<br/>
<input type="checkbox" name="mon_champ[]" value="Option 3" <?php if(est_selectionne("Option 3")) { echo 'checked'; } ?>/>Option 3<br/>
<input type="submit" value="OK"/>
</form>
|
Le dernier exemple est certes beaucoup plus compliqué, mais il vous suffira
de faire une petite adaptation si vous en avez besoin !
5. Les listes déroulantes ...
5.1. ... à sélection simple
Les listes déroulantes sont couramment utilisées pour que l'utilisateur
ne puisse sélectionner qu'une valeur. Ces choix sont souvent issus d'une
base de données, c'est pourquoi nous verrons aussi un exemple avec une
liste déroulante dont les options sont générées dynamiquement par PHP.
Dans un premier temps nous allons simplement afficher, l'option qu'a
choisi l'utilisateur :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Votre champ contenait :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<select name="mon_champ">
<option>Option 1</option>
<option>Option 2</option>
<option>Option 3</option>
</select>
<input type="submit" value="OK"/>
</form>
|
Réaffichons maintenant l'option sélectionnée par l'utilisateur dans
la liste déroulante :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
if ($mon_champ) {
?>
Votre champ contenait :
<b><?php echo $mon_champ; ?></b>
<br/><br/>
<?php
}
?>
<form method="POST">
<select name="mon_champ">
<option <?php if($mon_champ == "Option 1") { echo 'selected'; } ?>>Option 1</option>
<option <?php if($mon_champ == "Option 2") { echo 'selected'; } ?>>Option 2</option>
<option <?php if($mon_champ == "Option 3") { echo 'selected'; } ?>>Option 3</option>
</select>
<input type="submit" value="OK"/>
</form>
|
Là encore nous aurions pu générer dynamiquement les options de la liste
déroulante en les stockant dans un tableau et les traiter avec une
boucle foreach ou for mais nous n'allons pas entrer dans les détails.
Cependant comme je le disais précédemment, il est courant qu'une liste
déroulante trouve ses options dans une base de données, en voici un
petit exemple dont voici le contenu d'une table "langages" à titre
d'exemple :
| id |
langage |
| 1 |
Java |
| 2 |
C/C++ |
| 3 |
Delphi |
| 4 |
Visual Basic |
| 5 |
HTML |
| 6 |
PHP |
| 7 |
ASP |
Ce système a pour but d'associer à un nombre unique (appelé identifiant)
un langage. Il permet notamment à un utilisateur de sélectionner un
langage sur la page d'index qui le renverra sur une page qui sera la
même pour les autres langages, sauf que l'adresse de la page sera de
la forme : http://www.mon-site.com/page.php?id=X. C'est ce X, qui va
permettre d'identifier le langage que souhaite voir le visiteur. Ce
nombre, permettra d'aller extraire relativement facilement tous les
scripts par exemple du langage sélectionné. Il est plus simple
d'utiliser un nombre qu'une chaîne qui peut nécessiter des traitements
pour apparaître dans la barre d'adresse. Cependant, si un visiteur
souhaite ajouter un script, il faudra bien l'insérer dans le bon
langage, on affichera donc dans une liste déroulante des langages, mais
les options auront pour valeurs leur identifiant respectif. Voici ce
que cela nous donnerait en HTML :
<form method="POST">
<select name="mon_champ">
<option name="1">Java</option>
<option name="2">C/C++</option>
<option name="3">Delphi</option>
<option name="4">VB</option>
<option name="5">HTML</option>
<option name="6">PHP</option>
<option name="7">ASP</option>
</select>
<input type="submit" value="OK"/>
</form>
|
Nous supposerons que le webmaster a choisi d'utiliser le PHP pour
générer le formulaire pour la simple et bonne raison que la liste des
langages risque d'être souvent mise à jour. Nous possédons donc toutes
les informations nécessaires pour coder ceci en PHP (Nous utiliserons
le réaffichage du formulaire en cas d'erreur de la part de
l'utilisateur) :
<?php
define('MYSQL_HOTE', 'localhost');
define('MYSQL_UTILISATEUR', 'root');
define('MYSQL_MOT_DE_PASSE', '');
define('MYSQL_BASE_DE_DONNEES', 'mysql');
$choix = isset($_POST['choix']) ? $_POST['choix'] : '';
mysql_connect(MYSQL_HOTE, MYSQL_UTILISATEUR, MYSQL_MOT_DE_PASSE) or die('<h1>Connexion au serveur impossible !</h1>');
mysql_select_db(MYSQL_BASE_DE_DONNEES) or die('<h1>Connexion impossible à la base</h1>');
if ($choix) {
$query = mysql_query("SELECT langage FROM langages WHERE id='$choix';") or die (mysql_error());
$array = mysql_fetch_array($recup_langage);
echo 'Vous avez choisi le langage : ' . $array['langage'];
}
$query = mysql_query("SELECT * FROM langages;") or die (mysql_error());
if ($query) {
echo '<form method="post">';
echo '<select name="choix">';
while ($array = mysql_fetch_array($query)) {
if ($choix == $array["id"]) {
echo '<option value="' . $array['id'] . '" selected>' . $array['langage'] . '</option>';
} else {
echo '<option value="'.$array['id'] . '">' . $array['langage'] . '</option>';
}
}
echo '</select>';
echo '<input type="submit" value="OK">';
echo '</form>';
}
mysql_close();
?>
|
Il faut avouer que ce dernier exemple est un peu trop compliqué pour
des débutants, mais son but était de vous montrer l'intérêt des
formulaires générer dynamiquement avec PHP depuis une base de données,
ce qui est assez courant comme dans ce cas !
5.2. ... à sélection multiple
Les listes déroulantes peuvent également être utilisées pour permettre
de sélectionner plusieurs valeurs (voire une ou pas du tout). Ce cas
est strictement identique aux cases à cocher puisque l'on récupérera
au final une variable "tableau" qui hébergera le résultat. Voyons un
premier exemple avec un simple réaffichage des valeurs sélectionnées
par l'utilisateur :
<?php
$options = array(
'Option 1',
'Option 2',
'Option 3',
'Option 4'
);
if (isset($_POST['mon_champ'])) {
echo "Vous avez choisi :";
for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
echo '<br/><b>' . $_POST['mon_champ'][$i] . '</b>';
}
}
?>
<form method="POST">
<select name="mon_champ[]" size="4" multiple>
<?php
foreach ($options as $k) {
echo '<option>' . $k . '</option>';
}
?>
</select>
<input type="submit" value="OK"/>
</form>
|
Modifions maintenant l'exemple précédent afin de réafficher ce que
l'utilisateur a sélectionné :
<?php
$options = array(
'Option 1',
'Option 2',
'Option 3',
'Option 4'
);
if (isset($_POST['mon_champ'])) {
echo "Vous avez choisi :";
for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
echo '<br/><b>' . $_POST['mon_champ'][$i] . '</b>';
}
}
function est_selectionne($option) {
for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
if ($_POST['mon_champ'][$i] == $option) {
return TRUE;
}
}
return FALSE;
}
?>
<form method="POST">
<select name="mon_champ[]" size="4" multiple>
<?php
foreach ($options as $k) {
if (isset($_POST['mon_champ']) && est_selectionne($k)) {
echo '<option selected>' . $k . '</option>';
} else {
echo '<option>' . $k . '</option>';
}
}
?>
</select>
<input type="submit" value="OK"/>
</form>
|
6. Approfondissements
Pour éviter que des petits malins ne glissent des balises HTML dont
certaines peuvent être gênantes (<script>, <?, ...) je vous
recommande de traiter vos formulaires à l'aide d'une de ces fonctions :
Lorsque vous attendez un nombre entier, vous pouvez utiliser la fonction
intval() ainsi
les chaînes de caractère non valides donneront la valeur zéro.
Selon la configuration du serveur, vous pourrez remarquer que certains
caractères sont échappés (précédés par le caractère backslash (\)) comme
le backslash lui-même ou encore l'apostrophe. La fonction
get_magic_quotes_gpc()
vous permet de savoir si c'est le cas et la fonction
stripslashes()
vous permet de les supprimer. Toutefois, lors d'une insertion en base de
données du texte issu d'un formulaire vous devez impérativement échapper
les caractères spéciaux (apostrophe, backslash, ...) si ce n'est pas déjà
fait (à l'aide de fonctions comme
addslashes()
ou
mysql_real_escape_string()
ou
mysqli_real_escape_string()).


Copyright © 2006 julp. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.