PHP - MySQL [Retour au menu]

Validation d'un formulaire et redirection sur une autre page PHP

Avant d'attaquer cette rubrique, consultez le passage de paramètres ici. Toute une section concernant la construction de formulaires (en interaction avec JavaScript) se trouve ici.

Admettons le cas suivant : Vous avez 2 pages PHP : La première (saisiedonnee.php) contient un formulaire de saisie des données (Par exemple un champ Prenom et un champ Nom), ainsi qu'un bouton d'envoi des données.

Le bouton d'envoi des données envoie les données vers la page resultat.php, qui est sensée les afficher simplement. Tout ceci serait très simple s'il n'y avait pas une validation a effectuer : En effet, si le nom ou le prénom a été omis, il faut demander à 'utilisateur de bien vouloir remplir tous les champs.

On peut très bien, en renvoyant les données vers resultat.php, créer une procédure de vérification des paramètres, et si le nom ou le prénom ne sont pas remplis correctement, installer un message de style "Veuillez entrer votre nom et votre prénom", muni d'un lien hypertexte qui renvoie vers saisiedonnee.php.

L'autre manière de faire consisterait à ne pas envoyer les données de saisiedonnee.php vers saisiedonnee.php (vers elle-même donc), et d'opérer à une validation. Il serait alors facile dans ce cas de vérifier la bonne tenue de la saisie du nom et du prénom, et de mettre un lien hypertexte qui, cette fois, dirait "Bravo. Vous avez tout bien saisi, cliquez ici pour voir le résultat"

Mais ces deux solutions ne sont pas élégantes : En effet, dans chaque cas, l'utilisateur doit chaque fois cliquer sur un lien : Bof bof bof...

L'idéal est ceci :

- A la fin de la saisie, l'utilisateur clique sur le bouton Submit, qui renvoie à la même page saisiedonnee.php
- Une vérification est fairte sur la bonne tenue du nom et du prénom
     - Si l'un des deux champs n'est pas rempli, on affiche un message d'erreur, et l'utilisateur voit réapparaître son formulaire de saisie
     - MAIS S'il a bien tout rempli les 2 champs, une REDIRECTION automatique va être effectuée vers resultat.php qui n'a plus du tout de vérification à faire

C'est parti !

Pour commencer, nous allons concevoir un bête formulaire de saisie qui se renvoie à lui même. Voici la première ébauche de la saisiedonnee.php :

<html>
  <head>
  </head>
  <body>
    <form name="MonFormulaire" method="post" action="saisiedonnee.php">
      Votre nom :    <input type="text" name="Nom"> <br>
      Votre prénom : <input type="text" name="Prenom"> <br>
      <input type="submit" name="Submit" value="Envoyer">
    </form>

  </body>
</html>

Les noms et prénoms sont ils remplis ?

Comme il se renvoie sur lui-même, ça ne va pas donner des résultats impressionnants en l'état. Nous allons donc rajouter du code PHP pour indiquer les éventuelles erreurs :

<form name="MonFormulaire" method="post" action="saisiedonnee.php">
  Votre nom :
  <?
    if (strlen($Nom) == 0)
    echo "PAS DE NOM VIDE";
  ?>
  <input type="text" name="Nom">

  <br>
  <!----------------------------------->
  Votre prénom :
  <?
    if (strlen($Prenom) == 0)
    echo "PAS DE PRENOM VIDE";
  ?>
  <input type="text" name="Prenom">

  <br>
  <input type="submit" name="Submit" value="Envoyer">
</form>

Ce qui est déjà nettement mieux. Par contre, il y a juste une petite peccadille : La toute première fois que l'utilisateur se rend sur ce formulaire, il se fait immédiatement engueuler avec un message "PAS DE NOM VIDE", et "PAS DE PRENOM VIDE", ce qui n'est pas très sympathqiue. Il faudrait qu'on sache si l'utilisateur est nouveau sur ce formulaire.

Utilisation d'un champ caché de formulaire (HIDDEN)

Pour le savoir, nous allons ajouter un espion, à savoir un champ invisible (HIDDEN), qui va être envoyé en même temps que le nom et le prénom quand l'utilisateur aura cliqué sur le bouton, et il suffit de contrôler si cet espion contient bien une valeur pour se permettre d'engueuler l'utilisateur à bon escient !

Voici le champ de formulaire que vous allons utiliser :

<input type="hidden" name="Espion" value="JaiToutVu">

La première fois que nous entrons dans le formulaire de saisie, ce champ est évidemment vide, mais dès qu'on clique sur SUBMIT pour recharger la même page, cet espion vaut JaiToutVu. Il suffit de tester son contenu, de cette manière :

<form name="MonFormulaire" method="post" action="saisiedonnee.php">
  Votre nom :
  <?
    if (($Espion == "JaiToutVu") && (strlen($Nom) == 0))
      echo "PAS DE NOM VIDE";
  ?>
  <input type="text" name="Nom">
  <br>
  <!----------------------------------->
  Votre prénom :
  <?
    if (($Espion == "JaiToutVu") && (strlen($Prenom) == 0))
      echo "PAS DE PRENOM VIDE";
  ?>
  <input type="text" name="Prenom">
  <br>
  <input type="hidden" name="Espion" value="JaiToutVu">
  <input type="submit" name="Submit" value="Envoyer">
</form>

Remise en place des valeurs correctement saisies

Il y a encore un petit truc pas cool du tout : C'est que le formulaire se vide entièrement de tous ses champs dès qu'on arrive à nouveau dessus : Si l'utilisateur à entré correctement son nom mais pas son prénom, il faudrait que ce formulaire aie la politesse de lui réafficher son nom sans qu'il aie besoin d e le ressaisir... La propriété VALUE va nous permettre cette élégante astuce :

<form name="MonFormulaire" method="post" action="saisiedonnee.php">
Votre nom :
<?
if (($Espion == "JaiToutVu") && (strlen($Nom) == 0))
echo "PAS DE NOM VIDE";
?>

<input type="text" name="Nom" value=<? echo $Nom;?>>
<br>
Votre prénom :
<?
if (($Espion == "JaiToutVu") && (strlen($Prenom) == 0))
echo "PAS DE PRENOM VIDE";
?>

<input type="text" name="Prenom" value=<? echo $Prenom;?>>
<br>
<input type="hidden" name="Espion" value="JaiToutVu">
<input type="submit" name="Submit" value="Envoyer">
</form>

Redirection vers la page de visualisation

Maintenant, c'est bien. Ou plutôt, c'est maintenant que nous entrons dans le vif du sijet : Si l'utilisateur a entré correctement ses noms et prénoms, il ne s'agit plus de lui renvoyer dans la figure perpétuellement le même formulaire de saisie : Il faut automatiquement le REDIRIGER vers la page d'affichage.

La redirection est une ligne HTML qui s'installe dans la section HEAD. Vous pouvez visualiser un exemple simpliste de cette fonction ici.

La ligne est :

<html>
<head>

<meta http-equiv="refresh" content="0; url=nouvellepage.php">

<title>Saisie des donnéees</title>
</head>
<body>

<form name="MonFormulaire" method="post" action="saisiedonnee.php">
...

Mais bien entendu, il ne faut opérer à cette redirection QUE dans le cas ou toutes les données ont été correctement saisies : On va afficher cette meta avec PHP :

<html>
<head>
<?
    if ((strlen($Nom) > 0) && (strlen($Prenom) > 0))
      echo "<meta http-equiv='refresh' content='0; url=resultat.php'>";
?>

<title>Saisie des donnéees</title>
</head>
<body>
<form name="MonFormulaire" method="post" action="saisiedonnee.php">

On a même pas besoin de tester la valeur de l'espion : Il suffit de contrôler la validité du nom et du prénom. S'ils sont tous bien remplis, OK, on peut appliquer la redirection. MAIS MAIS il y a juste une petit truc : Maintenant, ce n'est plus le bouton SUBMIT qui envoie les données vers resultat.php, c'est le META ! ALors, attention ! Les variables $Nom et $Prenom ne seront pas transférées !

Il faut donc remplacer

echo "<meta http-equiv='refresh' content='0; url=resultat.php'>";

par

echo "<meta http-equiv='refresh' content='0; url=resultat.php?Nom=$Nom&Prenom=$Prenom'>";

C'est terminé

Voici le code complet de cet exemple

<html>
  <head>
    <?
      if ((strlen($Nom) > 0) && (strlen($Prenom) > 0))
        echo "<meta http-equiv='refresh' content='0; url=resultat.php?Nom=$Nom&Prenom=$Prenom'>";
    ?>
  <title>Saisie des donnéees</title>
  </head>

  <body>
    <form name="MonFormulaire" method="post" action="saisiedonnee.php">
      <!------------------------------------------------>
     
Votre nom :
      <?
        if (($Espion == "JaiToutVu") && (strlen($Nom) == 0))
          echo "PAS DE NOM VIDE";
      ?>
      <input type="text" name="Nom" value=<? echo $Nom;?>>
      <br>
      <!------------------------------------------------->
      Votre prénom :
      <?
        if (($Espion == "JaiToutVu") && (strlen($Prenom) == 0))
          echo "PAS DE PRENOM VIDE";
      ?>
      <input type="text" name="Prenom" value=<? echo $Prenom;?>>
      <br>
      <!------------------------------------------------->
      <input type="hidden" name="Espion" value="JaiToutVu">
      <input type="submit" name="Submit" value="Envoyer">
    </form>
  </body>
</html>

Maintenant, vous allez pouvoir tester sur pièce : Essayez :

- N'entrez ni nom ni prénom et cliquez sur SUBMIT
- Entrez seulement votre nom, et cliquez sur SUBMIT
- Entrez votre nom ET prénom et cliquez sur SUBMIT

Cliquez ici pour tester la saisie des données