Mangeur de cigogne Hébergement du site en PHP et Mysql par WDMédia-hébergement
Vous aussi adpotez les éléPHPants de Vincent Pontier !
CONCOURS
 
 
PLUS DE PHP
 
 
PLUS DE JAVASCRIPT
 
COMMENT CA MARCHE
 
 
EXPLIQUE-MOI
 
 
NEWS LETTER
 

 
PARTENAIRES
 
Découvrez scriptsphp.org
Découvrez phpteam.net
Tout sur les expressions régulières
IE sucks :-)
 
DESIGN DU SITE
 
Bien gérer un formulaire

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



Ajouter une réponse
Nom
Email
Titre

Mise en forme : gras = [b]...[/b], italic = [i]...[/i], souligné = [u]...[/u], citation = [quote]...[/quote], lien = [url]liens_externe[/url] ou [url nom=texte]liens_externe[/url], code source : [code]...[/code]

Mémoriser mon nom et mon email : Oui Non
www.phpdebutant.org © 2008 - L'équipe de phpDebutant - Hébergement : WDMédia-hébergement
DEBUTEZ !
 
  0.  Introduction
  1.  Afficher une phrase ou une image
  2.  Afficher la date et l'heure
  3.  PHP dans du code HTML
  4.  La concaténation
  5.  Récupérer les valeurs d'un formulaire
  6.  Les structures de contrôle
  7.  Ecrire et lire dans un fichier texte
  8.  Les fonctions utilisateurs
  9.  Les variables d'environnement
  10.  Quelques fonctions utiles
  11.  SQL/MySQL (Create, Alter & Drop)
  12.  SQL/MySQL (Insert et Select)
  13.  SQL/MySQL (Delete et Update)
  14.  SQL/MySQL (Where)
  15.  Fonctions PHP pour mySQL
  16.  Interroger une table MySQL
  17.  Alimenter une ou plusieurs tables mySQL
  18.  Les pseudos-frames
  19.  Les sessions php4
  20.  Affichage page par page
  21.  Images dynamiques
  22.  Ca marche pas ?
  23.  Variables globales à OFF
  24.  Les variables dynamiques