IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les formulaires et PHP5

Date de publication : 30 juillet 2006 , Date de mise à jour : 11 septembre 2006


V. Améliorations de l'expérience utilisateur
V-A. Les boutons "actualiser" et "précédent" du navigateur
La fonction header()
Bien organiser son code
V-B. Un peu de JS (JavaScript)
Les évènements disponibles
Vérifier que le formulaire est complètement rempli
Contrôler que les deux mots de passe sont identiques
V-C. Un peu de CSS (feuilles de style)


V. Améliorations de l'expérience utilisateur

Ce tutoriel ne traite pas des formulaires sous toutes leurs coutures. Je n'ai la prétention d'être un spécialiste ni de JavaScript (et ses déclinaisons) ni des feuilles de style. Cependant, il est toujours utile de savoir faire le minimum...
Notez que JavaScript, CSS et PHP sont des éléments totalement indépendants. Vous avez seulement besoin du code HTML pour le reste. La partie PHP est souvent indispensable mais certaines situations permettent de s'en passer.

Vous pouvez l'habiller avec ce que vous voulez :
  • HTML seul (nu)
  • HTML + PHP
  • HTML + CSS
  • HTML + JS
  • HTML + JS + CSS
  • HTML + PHP + JS + CSS
  • etc.

V-A. Les boutons "actualiser" et "précédent" du navigateur

Il faut prendre garde aux boutons "actualiser" et "précédent" du navigateur, car ils peuvent nous poser des problèmes. La solution la plus simple consiste à utiliser la méthode proposée par Ramazan Korkmaz (maximenet) dans son tutoriel : fr Éviter le renvoi de données POST au rafraîchissement d'une page.
Il s'agit simplement de réafficher la page avec la méthode GET, ce qui supprime les données POST et remplace la page actuelle de l'historique du navigateur.


La fonction header()

La fonction header() nous permet d'ordonner au navigateur de demander une autre page Web. Il convient de lui expliquer pourquoi nous lui donnons cet ordre, ce qui peut être fait à l'aide des en-têtes HTTP. Nous allons utiliser le code HTTP 204 : "contenu vide".
header('HTTP/1.1 204 No Content');
header('Location: script.php');
exit;
Le mot clef exit nous assure que le navigateur ne chargera pas d'informations inutiles.

warning Dans les exemples de formulaire réparti sur plusieurs pages (présents dans de ce tutoriel), il faut empêcher l'exécution systématique de la commande echo implode() en la remplaçant par ceci :
if(empty($_POST))
{
    echo implode(' - ', $items).'<br /><br />';
}

Bien organiser son code

Afin d'obtenir un formulaire optimal, il est préférable d'effectuer dès que possible tous les traitements sur les données soumises par l'utilisateur. Cela permet d'enregistrer le contenu d'un formulaire dans une variable de session ou dans une base de données avant d'avoir envoyé quoi que ce soit au navigateur, nous permettant ainsi d'utiliser la fonction header().


V-B. Un peu de JS (JavaScript)

Dans certains cas, JavaScript peut être très utile dans les formulaires. D'après le W3C, un formulaire ne peut être envoyé que si tous les contrôles (ayant un nom et une valeur), ainsi que quelques exceptions, sont valides. Le bouton submit qui a été cliqué fait partie des contrôles qui doivent être valides pour que le navigateur envoie le formulaire.
Cela nous permet d'effectuer un traitement JavaScript en utilisant l'évènement onsubmit du bouton submit. La fonction JavaScript appelée permettra éventuellement d'invalider le bouton submit et ainsi de ne pas soumettre le formulaire. C'est particulièrement utilisé pour les mots de passe.

info L'attribut HTML id est utilisé par la fonction JavaScript document.getElementById(). C'est celui que nous utiliserons, plutôt que l'attribut name qui est destiné à PHP (mais qui peut avoir la même valeur, ce qui est d'ailleurs assez courant).
warning Il faut toujours se souvenir que JavaScript est une technologie client, elle n'est donc pas exécutée dans l'environnement de confiance qu'est notre serveur Web. L'internaute peut désactiver le JavaScript ou s'arranger pour pour passer outre nos vérifications en JavaScript, ce qui fait que le script PHP ne devra absolument pas s'y fier. Les seules vérifications valides (point de vue sécurité) sont celles effectuées par le script PHP. Le script JavaScript ne permet que d'améliorer l'expérience utilisateur en évitant de soumettre un formulaire s'il n'est pas correctement rempli. Une vérification en JavaScript ne doit pas se substituer à une vérification en PHP, mais elle peut la compléter ou la renforcer. Il ne faut pas partir du principe qu'un formulaire reçu par PHP est un formulaire valide : l'internaute peut être en train de pirater (s'amuser avec) notre site.

Les évènements disponibles

Pour la balise : <form>
  • onsubmit : Le formulaire est envoyé
  • onreset : Le formulaire est réinitialisé à son état d'origine
Pour les contrôles : input et textarea
  • onfocus : Gain du focus
  • onblur : Perte du focus
  • onselect : Du texte a été sélectionné
  • onchange : La valeur a changé
Pour les contrôles : select, optgroup et option
  • onfocus : Gain du focus
  • onblur : Perte du focus
  • onchange : La valeur a changé
Pour le contrôle : button
  • onfocus : Gain du focus
  • onblur : Perte du focus

Vérifier que le formulaire est complètement rempli

Le formulaire :
  1. <form method="post" action="<?php echo basename(__FILE__); ?>" enctype="multipart/form-data"> 
  2.     <label> 
  3.         Nom d'utilisateur * : 
  4.         <input type="text" name="login" /> 
  5.     </label><br /> 
  6.     <label> 
  7.         Adresse e-mail * : 
  8.         <input type="text" name="e_mail" /> 
  9.     </label><br /> 
  10.     <label> 
  11.         Numéro de téléphone : 
  12.         <input type="text" name="phone" /> 
  13.     </label><br /> 
  14.     <label> 
  15.         Adresse : 
  16.         <input type="text" name="address" /> 
  17.     </label><br /><br /> 
  18.  
  19.     <input type="submit" value="Envoyer" /> 
  20.     <input type="reset" value="Rétablir" /> 
  21. </form> 
  22. Les champs marqués d'une * sont obligatoires. 
Vérification simple en PHP
  1. <?php 
  2.  
  3. if(!empty($_POST)) 
  4. { 
  5.     // 
  6.     // Debug 
  7.     // 
  8.     echo '<pre>'; 
  9.     print_r($_POST); 
  10.     echo '</pre>'; 
  11.  
  12.     // 
  13.     // Récupération normale des informations 
  14.     // 
  15.     $missing_fields = array(); 
  16.     if(empty($_POST['login'])) 
  17.     { 
  18.         $missing_fields[] = '"login"'; 
  19.     } 
  20.  
  21.     if(empty($_POST['e_mail'])) 
  22.     { 
  23.         $missing_fields[] = '"e_mail"'; 
  24.     } 
  25.  
  26.     if(empty($missing_fields)) 
  27.     { 
  28.         echo 'Tous les champs ont été renseignés'; 
  29.     } 
  30.     else 
  31.     { 
  32.         echo 'Les champs suivants doivent être remplis :<br />'; 
  33.         echo implode('<br />', $missing_fields); 
  34.     } 
  35.  
  36.     echo '<br /><br />'; 
  37. } 
  38.  
  39. ?> 
Vérification en JavaScript et en PHP
  1. <script type="text/javascript" language="Javascript"> 
  2.  
  3. function is_filled() 
  4. { 
  5.     missing_fields = ''; 
  6.  
  7.     if(document.getElementById("login").value == "") 
  8.     { 
  9.         missing_fields += "\n 'login'"; 
  10.     } 
  11.  
  12.     if(document.getElementById("e_mail").value == "") 
  13.     { 
  14.         missing_fields += "\n 'e_mail'"; 
  15.     } 
  16.  
  17.     if(missing_fields == "") 
  18.     { 
  19.         return true; 
  20.     } 
  21.     else 
  22.     { 
  23.         alert("Les champs suivants doivent être remplis :" + missing_fields); 
  24.         return false; 
  25.     } 
  26. } 
  27.  
  28. </script> 
  29.  
  30.  
  31. <?php 
  32.  
  33. if(!empty($_POST)) 
  34. { 
  35.     // 
  36.     // Debug 
  37.     // 
  38.     echo '<pre>'; 
  39.     print_r($_POST); 
  40.     echo '</pre>'; 
  41.  
  42.     // 
  43.     // Récupération normale des informations 
  44.     // 
  45.     $missing_fields = array(); 
  46.     if(empty($_POST['login'])) 
  47.     { 
  48.         $missing_fields[] = '"login"'; 
  49.     } 
  50.  
  51.     if(empty($_POST['e_mail'])) 
  52.     { 
  53.         $missing_fields[] = '"e_mail"'; 
  54.     } 
  55.  
  56.     if(empty($missing_fields)) 
  57.     { 
  58.         echo 'Tous les champs ont été renseignés'; 
  59.     } 
  60.     else 
  61.     { 
  62.         echo 'Les champs suivants doivent être remplis :<br />'; 
  63.         echo implode('<br />', $missing_fields); 
  64.     } 
  65.  
  66.     echo '<br /><br />'; 
  67. } 
  68.  
  69. ?> 
  70.  
  71.  
  72. <form method="post"  
  73.         action="<?php echo basename(__FILE__); ?>"  
  74.         enctype="multipart/form-data"  
  75.         onsubmit="return is_filled();"> 
  76.     <label> 
  77.         Nom d'utilisateur * : 
  78.         <input type="text" name="login" id="login" /> 
  79.     </label><br /> 
  80.     <label> 
  81.         Adresse e-mail * : 
  82.         <input type="text" name="e_mail" id="e_mail" /> 
  83.     </label><br /> 
  84.     <label> 
  85.         Numéro de téléphone : 
  86.         <input type="text" name="phone" id="phone" /> 
  87.     </label><br /> 
  88.     <label> 
  89.         Adresse : 
  90.         <input type="text" name="address" id="address" /> 
  91.     </label><br /><br /> 
  92.  
  93.     <input type="submit" value="Envoyer" /> 
  94.     <input type="reset" value="Rétablir" /> 
  95. </form> 
  96. Les champs marqués d'une * sont obligatoires. 

Contrôler que les deux mots de passe sont identiques

Vérification simple en PHP
  1. <?php 
  2.  
  3. if(!empty($_POST)) 
  4. { 
  5.     // 
  6.     // Debug 
  7.     // 
  8.     echo '<pre>'; 
  9.     print_r($_POST); 
  10.     echo '</pre>'; 
  11.  
  12.     // 
  13.     // Récupération normale des informations 
  14.     // 
  15.     if($_POST['password_1'] != $_POST['password_2']) 
  16.     { 
  17.         echo 'Erreur de mot de passe'; 
  18.     } 
  19.     else 
  20.     { 
  21.         echo 'Le mot de passe a été correctement saisi'; 
  22.     } 
  23.     echo '<br /><br />'; 
  24. } 
  25.  
  26. ?> 
  27.  
  28.  
  29. <form method="post" action="<?php echo basename(__FILE__); ?>" enctype="multipart/form-data"> 
  30.     <label>Nom d utilisateur : <input type="text" name="login" /></label><br /> 
  31.     <label>Mot de passe : <input type="password" name="password_1" /></label><br /> 
  32.     <label>Vérification : <input type="password" name="password_2" /></label><br /><br /> 
  33.  
  34.     <input type="submit" value="Envoyer" /> 
  35.     <input type="reset" value="Rétablir" /> 
  36. </form> 
Vérification en JavaScript et en PHP
  1. <script type="text/javascript" language = "Javascript"> 
  2.  
  3. function check_password(field_1, field_2) 
  4. { 
  5.     if(document.getElementById(field_1).value != document.getElementById(field_2).value) 
  6.     { 
  7.         alert('Les mots de passe ne correspondent pas'); 
  8.         return false; 
  9.     } 
  10.     else 
  11.     { 
  12.         return true; 
  13.     } 
  14. } 
  15.  
  16. </script> 
  17.  
  18.  
  19. <?php 
  20.  
  21. if(!empty($_POST)) 
  22. { 
  23.     // 
  24.     // Debug 
  25.     // 
  26.     echo '<pre>'; 
  27.     print_r($_POST); 
  28.     echo '</pre>'; 
  29.  
  30.     // 
  31.     // Récupération normale des informations 
  32.     // 
  33.     if($_POST['password_1'] != $_POST['password_2']) 
  34.     { 
  35.         echo 'Erreur de mot de passe'; 
  36.     } 
  37.     else 
  38.     { 
  39.         echo 'Le mot de passe a été correctement saisi'; 
  40.     } 
  41.     echo '<br /><br />'; 
  42. } 
  43.  
  44. ?> 
  45.  
  46.  
  47. <form method="post" 
  48.         action="<?php echo basename(__FILE__); ?>" 
  49.         enctype="multipart/form-data" 
  50.         onsubmit="javascript: return check_password('password_1', 'password_2');"> 
  51.     <label> 
  52.         Nom d utilisateur : 
  53.         <input type="text" name="login" id="login" /> 
  54.     </label><br /> 
  55.     <label> 
  56.         Mot de passe : 
  57.         <input type="password" name="password_1" id="password_1" /> 
  58.     </label><br /> 
  59.     <label> 
  60.         Vérification : 
  61.         <input type="password" name="password_2" id="password_2" /> 
  62.     </label><br /><br /> 
  63.  
  64.     <input type="submit" value="Envoyer" /> 
  65.     <input type="reset" value="Rétablir" /> 
  66. </form> 

V-C. Un peu de CSS (feuilles de style)

Les formulaires HTML ont une interface qui varie selon le navigateur utilisé et selon la configuration de ce navigateur (thèmes-skins, etc.) et cela ne correspond pas toujoursà la charte graphique de notre site Web.
Les feuilles de style (CSS) sont là pour nous aider.

info Nous utiliserons l'attribut HTML class pour définir l'apparence de nos formulaires.
Un formulaire avec du style
  1. <style type="text/css"> 
  2.  
  3. /* BODY */ 
  4. body { 
  5.     color: Black; 
  6.     background-color: #DDEEFF; 
  7.     font-family: Arial, Verdana, sans-serif; 
  8.     font-size: 13px; 
  9. } 
  10.  
  11. /* FORMULAIRE */ 
  12.  
  13. /* balises INPUT */ 
  14. input { 
  15.     background-color: #FAFAFA; 
  16.     border-width: 1px; 
  17.     border-color: #D1D7DC; 
  18.     color: Black; 
  19.     font-style: italic; 
  20. } 
  21.  
  22. /* balises spéciales dans le DIV des boutons */ 
  23. #submit input { 
  24.     font-weight: bold; 
  25.     font-style: normal; 
  26.     background-color: #D1D7DC; 
  27.     color: Black; 
  28.     border-color: Black; 
  29.     padding: 0px 10px 0px 10px; 
  30.     border-width: 2px; 
  31. } 
  32.  
  33. /* le reste du DIV des boutons */ 
  34. #submit { 
  35.     width: 400px; 
  36.     text-align: center; 
  37. } 
  38.  
  39. /* FIELDSET : bloc du formulaire */ 
  40. .form fieldset { 
  41.     border: solid; 
  42.     border-width: 1px; 
  43.     border-color: Black; 
  44.     width: 400px; 
  45.     padding: 15px 10px 10px 10px; 
  46.     margin: 0px 0px 15px 0px; 
  47.     background-color: White; 
  48.     color: Black; 
  49. } 
  50.  
  51. /* LEGEND : titre */ 
  52. .form legend { 
  53.     border: solid; 
  54.     border-width: 1px; 
  55.     border-color: Black; 
  56.     padding: 5px; 
  57.     background-color: #6389D8; 
  58.     font-weight: bold; 
  59.     color: White; 
  60.     font-size: 14px; 
  61. } 
  62.  
  63. /* LABEL : élements du formulaire */ 
  64. .form label { 
  65.     display: block; 
  66.     margin: 5px 0px 5px 0px; 
  67.     text-align: right; 
  68. } 
  69.  
  70. </style> 
  71.  
  72.  
  73. <?php 
  74.  
  75. if(!empty($_POST)) 
  76. { 
  77.     // 
  78.     // Debug 
  79.     // 
  80.     echo '<pre>'; 
  81.     print_r($_POST); 
  82.     echo '</pre>'; 
  83. } 
  84.  
  85. ?> 
  86.  
  87.  
  88. <form method="post" action="<?php echo basename(__FILE__); ?>" class="form"> 
  89.     <fieldset> 
  90.         <legend>Informations personnelles</legend> 
  91.         <label>Prénom : <input type="text" name="personal[first_name]" /></label> 
  92.         <label>Nom : <input type="text" name="personal[last_name]" /></label> 
  93.     </fieldset> 
  94.     <fieldset> 
  95.         <legend>Informations virtuelles</legend> 
  96.         <label>Pseudonyme : <input type="text" name="virtual[nickname]" /></label> 
  97.         <label>Site Web : <input type="text" name="virtual[website]" /></label> 
  98.         <label>Messagerie instantanée : <input type="text" name="virtual[instant_messenger]" /></label> 
  99.     </fieldset> 
  100.  
  101.     <div id="submit"> 
  102.         <input type="submit" value="Envoyer" /> 
  103.         <input type="reset" value="Rétablir" /> 
  104.     </div> 
  105. </form> 
 

Valid XHTML 1.1!Valid CSS!

Copyright © 2006 Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.