YBET informatique

Rue Albert 1er, 7

6810 Pin - Chiny

Route Arlon - Florenville

(/fax: 061/32.00.15

Les formations YBET sur Internet

YBET Forum webmaster Contact

16. Formulaire auto invoquant en PHP avec gestion des erreurs

1 Introduction - 2. le fonctionnement - 3. Insertion des données

D'abord, c'est quoi un formulaire PHP auto invoquant? Dans un formulaire standard, on affiche le formulaire et on renvoi vers une autre page qui traite les données insérées. En cas d'erreur, le visiteur doit revenir en arrière dans le navigateur (çà commence déjà bien) mais en plus doit tout retaper dès qu'il y a une erreur. En auto invoquant, en cliquant sur le bouton, on revient sur la même page qui fait le contrôle des données et réaffiche le formulaire en cas d'erreur. Ici aussi, en cas d'erreur l'utilisateur doit tout retaper le contenu de tous les champs mais (c'est là l'astuce)

Un formulaire avec gestion d'erreur va lui récupérer les valeurs tapées par l'utilisateur en même temps que la vérification mais aussi les réafficher comme valeur par défaut dans les différents champs et, en plus, afficher le message d'erreur à coté du champ en question. D'autres formes d'affichage des erreurs sont possibles avec une seule variable d'erreur.

2. La partie théorique

Pour les catégories d'annonces (l'exercice de cette formation), on va utiliser 3 champs: nom, description, attachement (dans le réel développement, il y en a beaucoup plus). L'important est de voire comment fonctionnent ces formulaires auto invoquant avec la gestion d'erreur. La partie "formulaire" est obligatoirement en PHP, soit comme ici avec une variable $form qu'on affiche ensuite, soit en HTML avec les variables inclues dans <?php echo variable; ?>

<?php

// test d'exécution du sommaire
/* 
la première partie est de définir les message d'erreur (que nous mettons à ce stade comme vides).
Elle doivent être obligatoirement reprise en début de fichier pour éviter les messages d'erreur dans le formulaire lors de la première ouverture de la page.
dans la vérification des erreurs, nous donnerons une valeur uniquement s'il y a une erreur
... et les différentes variables d'erreur sont affichées dans le formulaire.
*/
 $erreur_nom = "";
 $erreur_description = "";
 $erreur_attachement = "";
if (isset($_POST['go'])){
// on récupère les données si la variable go existe
 $nom = $_POST['nom'];
 $description = $_POST['description'];
 $attachement = $_POST['attachement'];
// vérification des données entrées, modification éventuelles des variables d'erreurs
  if ($_POST['nom'] == '')
   {
     $erreur_nom = "Le nom de la catégorie doit être renseigné<br>";
    } elseif ($_POST['description'] == '')
    {
     $erreur_description = "Entrez une description<br>";
    } elseif ($_POST['image'] == '')
    {
     $erreur_attachement = "Entrez un numéro<br>";
    } else {
            $ajout = "";
            écho"Entrée des valeurs dans la table";
   }
} else {
 // première lecture de la page, on donne une valeur par défaut à chaque champ du formulaire
   $nom = "Nom de la catégorie";
   $description = "Description de la catégorie";
   $attachement = "Numéro de la catégorie supérieure, 0 pour une catégorie";
 }
// Pour chaque champ, on attribue une valeur par défaut et à la suite, la variable d'erreur correspondante
$form = "<table>
<form METHOD=\"POST\">
<tr><td>Nom de la catégorie</td><td><input type=text name=nom value=\"$nom\" size=\"25\"><br>$erreur_nom</td></tr>
<tr><td>Description</td><td><input type=text name=description value=\"$description\" size=\"40\"> $erreur_description</td></tr>
<tr><td>Numéro de la catégorie supérieure</td><td><input type=text name=attachement value=\"$attachement\"><br>$erreur_attachement</td></tr>
<tr><td><input type=submit name=go value=sauve></td></tr>
</form>
</table>";
print($form);
?>

Examinons le fonctionnement de ce code.

  1. Premier passage sur la page: les variables d'erreurs sont mises à zéro, ensuite, si $_POST['go'] n'existe pas (ce qui est la cas), on donne une valeur par défaut sous forme de variable à chaque champ. En dernier on affiche le formulaire reprenant les valeurs par défaut et les messages d'erreur (les $erreur_variable qui ont été définies à ... vide).
  2. Le visiteur entre des données et clique sur le bouton sauve. Les variables d'erreurs sont remises à zéro, ensuite les données sont récupérées par $_POST. Si les tests sont corrects, on entre les valeurs dans la table et quitte la page (les codes ne sont pas mis ici). Par contre, en cas d'erreur sur une variable: on assigne l'erreur correspondante à la variable mais on ne remet pas à zéro les variables elles-mêmes. Prenons un exemple, l'utilisateur entre le nom d'une catégorie mais pas de description. La variable $erreur_description va reprendre le message "Entrez une description" qui va s'afficher à la suite du champ description. Par contre, comme le nom est tapé, il va être repris dans la variable $nom (via le $_POST) et ... afficher comme nouvelle valeur par défaut du champ.

A chaque passage, un seul message d'erreur est affiché (le plus haut dans la liste de tests) et chaque champ déjà rempli est aussi affiché. Pour les plus bas, dans l'exemple ci-dessus attachement, une erreur de description n'affichera pas d'erreur d'attachement mais réaffichera quand même la valeur par défaut. Le schéma est finalement:

Mise à Zéro des messages d'erreurs

Condition go

  • Oui
  • récupération des données du formulaire
  • Mise à zéro des erreurs
  • tests variables
  • OK
  • Données correctes, la catégorie peut-être enregistrée
  • Données non correctes
  • On récupère la première erreur par $erreur_variable et on réaffiche le formulaire
  • Non
  • On initialise les variables.

Fin condition: affichage du formulaire

Remarquez que nous n'avons pas vérifié si le nom et description existent. Je vous laisse le soin de créer les if conditionnels (et les messages d'erreurs associés) en fin de condition en lisant la table via une requete de type:

include ('includes /start.php'); // on ouvre la base de donnée

$requete="SELECT * FROM categorie where nom='$nom'";

$valeur=mysql_query($requete);

$ligne=mysql_num_rows($valeur); //va renvoyer le nombre de valeur trouvées avec le même nom et ... si $ligne=0 le nom n'est pas encore entré dans la table donc peut-être créé

3. L'insertion des données.

Dans les lignes de code ci-dessus, nous avons simplement affiché "Entrer des sonnées" via une commande ECHO. Dans la pratique, on va faire deux chose.

  1. Insérer les données dans la table
  2. renvoyer le visiteur sur une autre page, et donc plus afficher le formulaire

Rien de plus simple pour insérer les données:

include ('includes /start.php'); // on ouvre la base de donnée

$requete="INSERT categorie SET nom=\"".$nom.", description=\"".$description." ,attachement=\"".$attachement;

Reste à renvoyer le visiteur vers une autre page. Plusieurs méthodes sont possibles (y compris par javascritp) mais la plus simple est d'insérer à la suite la commande

die('<meta http-equiv="refresh" content="3; URL=index.php">');

4. Pour terminer

Vous pensez que cette partie est bonne? Ben non. Ce qu'il nous manque, c'est les fonctions addslashes pour la réception des données via $_POST et l'inverse pour l'affichage dans le formulaire STRIPSLASHES($variable).

En complément:

>17. Récupérer les données d'une table MySQL dans une liste déroulante

<15 . Table utilisateurs

Modification: 22/03/2012, suppression du développement catégories