Lorsque l'on veut utiliser un formulaire, nous distinguons deux parties :
- L'affichage du formulaire.
- Le traitement des données.
Exemple :
Formulaire.php
<html>
<head>
<title>Formulaire</title>
</head>
<body>
<form action="traitement.php" method="post">
<p>Entrez votre nom : <input type="text" name="nom" /></p>
<p><input type="submit" value=" OK " /></p>
</form>
</body>
</html>
Traitement.php
<html>
<head>
<title>Formulaire</title>
</head>
<body>
<p>Bonjour <?php echo $_POST['nom'] ?></p>
</body>
</html>
Seulement, il n'est pas rare de devoir effectuer des contrôles sur les données, et en cas d'erreur, cela nécessite de réafficher le formulaire avec un message d'information et les données précédemment saisies.
Pour accomplir cette tâche, au lieu de saisir deux fois le code du formulaire, nous allons placer celui-ci dans un script que l'on pourra inclure où l'on veut. Ainsi, toute modification du formulaire sera prise en compte dans les différents scripts qui l'utilisent.
Formulaire.inc.php
<form action="traitement.php" method="post">
<p>Entrez votre nom : <input type="text" name="nom" value="<?php echo $nom ?>" /></p>
<p><input type="submit" value=" OK " /></p>
</form>
Formulaire.php
<html>
<head>
<title>Formulaire</title>
</head>
<body>
<?php
$nom = '';
require 'formulaire.inc.php';
?>
</body>
</html>
Dans ce script, il est nécessaire d'initialiser la variable $nom afin que l'affichage du formulaire ne génère pas d'erreur.
Traitement.php
<html>
<head>
<title>Formulaire</title>
</head>
<body>
<?php
$nom = trim( $_POST['nom'] );
if( preg_match('`^[- a-zàâäéèêëïîôöùûü\']{2,}$`i', $nom ) ) {
echo '<p>Bonjour ', $nom, '</p>';
} else {
echo '<p>Votre nom ne peut pas contenir de caractères spéciaux !</p>';
require 'form.inc.php';
}
?>
</body>
</html>
Avec ce script, si l'utilisateur saisie un caractère spécial, un message d'avertissement est affiché ainsi que le formulaire.
Maintenant, regardez de plus près : Lorsque l'utilisateur fait une erreur de saisie, le script courant est " traitement.php ". S'il fait une deuxième erreur de saisie, c'est à nouveau le script " traitement.php " qui est appelé à partir de … " traitement.php ". Autrement dit, traitement.php s'appelle lui-même, c'est ce que nous appelons l'auto-invocation. A ce stade, on peut donc envisager de se passer du script " formulaire.php ", et appeler directement " traitement.php ". Seulement, cela va générer une " Notice " car $_POST['nom'] n'existe pas et le message d'erreur va s'afficher. Il faut donc architecturer différemment notre code.
Voici un exemple simple de formulaire auto-invoqué sans traitement d'erreur :
<html>
<head>
<title>Formulaire</title>
</head>
<body>
<?php if( isset( $_POST['nom'] ) ) { ?>
<p>Bonjour <?php echo $_POST['nom'] ?></p>
<?php } else { ?>
<form action="formulaire.php" method="post">
<p>Entrez votre nom : <input type="text" name="nom" /></p>
<p><input type="submit" value=" OK " /></p>
</form>
<?php } ?>
</body>
</html>
Dans ce script, selon qu'il existe ou non une donnée, on affiche le résultat ou on affiche le formulaire.
Maintenant, si on ajoute le traitement d'erreur, cela donne :
<html>
<head>
<title>Formulaire</title>
</head>
<body>
<?php
$afficheFormulaire = true;
$nom = '';
if( isset( $_POST['nom'] ) ) {
$nom = trim( $_POST['nom'] );
if( preg_match('`^[- a-zàâäéèêëïîôöùûü\']{2,}$`i', $nom ) ) {
$afficheFormulaire = false;
echo '<p>Bonjour ', $_POST['nom'], '</p>';
} else {
echo '<p>Votre nom ne peut pas contenir de caractères spéciaux !</p>';
}
}
if( $afficheFormulaire ) { ?>
<form action="formulaire.php" method="post">
<p>Entrez votre nom : <input type="text" name="nom" value="<?php echo $nom ?>"/></p>
<p><input type="submit" value=" OK " /></p>
</form>
<?php } ?>
</body>
</html>
A ce stade, lorsque vous envoyez une donnée correcte, le message s'affiche avec le nom saisi, mais si vous utilisez la fonction de rafraichissement de votre navigateur, vous pouvez constater que celui-ci vous averti qu'il va renvoyer les données. Ce n'est pas très gênant, sauf si après le traitement des données valides, on insère ces valeurs dans une base de données qui a ce moment là sont en double.
Pour éviter tous ces problèmes, nous allons donc utiliser l'en-tête de redirection, ce qui donne :
<?php
$nom = '';
$erreur = '';
if( isset( $_POST['nom'] ) ) {
$nom = trim( $_POST['nom'] );
if( preg_match('`^[- a-zàâäéèêëïîôöùûü\']{2,}$`i', $nom ) ) {
insèreEnBase( $nom );
header('location: merci.php' );
exit;
} else {
$erreur = 'Votre nom ne peut pas contenir de caractères spéciaux !';
}
}
?><html>
<head>
<title>Formulaire</title>
</head>
<body>
<form action="formulaire.php" method="post">
<p>Entrez votre nom : <input type="text" name="nom" value="<?php echo htmlspecialchars( $nom ) ?>"/></p>
<?php if( ! empty( $erreur ) ) echo ' <p>', $erreur, '</p>' ?>
<p><input type="submit" value=" OK " /></p>
</form>
<p><a href="/">home</a></p>
</body>
</html>
Ainsi, sur la page de remerciement, l'utilisateur peut cliquer autant de fois qu'il le désire sur le bouton de rafraichissement, les données ne seront pas insérer.
Comme vous pouvez le constater, la partie du code qui effectue le traitement des données et placé avant les premières balises HTML pour éviter d'erreur d'en-tête déjà envoyée.
Pour résumer, une bonne utilisation des formulaires doit se faire de la façon suivante : Le traitement des données et l'affichage du formulaire doit être placé au sein du même script et lorsque les données sont valides, celle-ci doivent être traitées puis la page redirigée.
Revenir aux mises au point