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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Formulaire et gestion des erreurs


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut Formulaire et gestion des erreurs
    Bonjour à tous,

    voilà, j'ai un formulaire dans une page1.html

    qui appel la page2.html après validation. J'utilise la méthode post.

    Mais la page1.html est mal renseignée, comment faire afficher les messages d'erreurs dans la page1.html ?

    En effet, la vérification s'effectue dans la page2.html, donc les messages vont s'afficher dans la page2.html et non dans la page1.html.

    Comment faîtes-vous pour gérer les erreurs dans un tel cas ?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    A mon sens, il te faudrait creer un troisieme fichier , en .php du style "controleur.php".

    ta page1.html appelle controleur.php en post.
    Dans controleur tu effectues les tests nécessaires pour assurer la validité du formulaire.
    Si c'est ok, tu renvois via la fonction "header" vers page2 sinon tu renvois vers page1 avec un code d'erreur te permettant d'afficher les erreurs en question.

    En plus de celà tu peux réaliser des controles en javascript sur ton formulaire page1.html afin d'améliorer l'ergonomie de ton appli.

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut
    Bonjour Raideman et merci pour la réponse.

    Mais pourquoi alourdir le processus et passer par un troisième fichiers ?

    pourquoi ne pas gérer directement les erreurs dans la page2.html et mettre le header dans cette page ?

    J'évite au maximum d'utiliser le javascript (car il n'est pas activé chez tous les internautes..)

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Pour ma part, le plus simple c'est de rester dans la même page (page1.php).

    En faite, le formulaire (page1.php) pointe sur elle même (donc la recharge), et s'il y a une erreur, et bien on ne fait surtout pas de redirection (header ou autre), on s'arrange de stocker l'erreur ou les divers erreurs au fur et à mesure qu'on les détectent.
    Ceci qui permet par la suite d'afficher en 1er les erreurs, puis de ré-afficher le formulaire avec les données précédemment saisies (POST).

    Ce n'est que lorsqu'il n'y a pas eu d'erreur qu'on fait tout ce qu'il y a à faire avec ces données qu'on vient de recevoir :
    -> Enregistrement dans la Bdd
    -> Création de fichiers
    -> Mettre en mémoire dans la sessions certaines données utiles pour la suite.
    -> etc, etc ...
    Puis au bout on fait une redirection vers l'étape suivante (page2.php).


    En somme, pourquoi faut il que ça soit la page suivante (l'étape suivante) qui doit gérer le problème de la page précédentes (ou celle où on se trouve) ?
    Ca me semble pas logique. Il me semble mieux de ne pas passer l'étape suivante tant que la 1ère n'est pas conforme.


    Pour la gestion pure des erreurs d'un formulaire, utiliser les sessions c'est pas mal.
    Mais c'est juste pour les messages d'erreurs, genre : "Veuillez saisir votre nom.", etc ...
    Mais pas pour stocker les données saisie reçues en POST, j'ai jamais adhéré à ce principe.
    Donc les messages sont dans une session, (une classe MessageStack en parallèle aussi).
    Si la session contient un message, on affiche tous les messages, et la session est détruite tout de suite après.

    Mais cette session/classe ne fait pas que gérer les erreurs, mais tous les messages divers qu'il pourrait avoir, il y a un "type" de message (info, alerte, erreur) qui débouche sur 3 mises en formes différentes.

    C'est ainsi que je procède.
    Maintenant, à chacun sa méthode.

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut
    Bonjour RunCodePhp,

    merci pour ton explication mais il y a une chose qui m'échappe :

    Les valeur du formulaire ( en méthode post) sont envoyés donc à la même page qui contient le formulaire : page1.php

    Alors au moment ou tout est bon( c'est-à-dire s'il n'y a pas d'erreur),

    j'effectue un header vers ma page2.php, mais comment fais-tu pour transférer les données du formulaire ( méthode post) de la page 1 vers la page 2.

    Moi ce que je trouvais pratique dans ma méthode, c'est que lees données sont transférer directement vers la page2.

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    mais comment fais-tu pour transférer les données du formulaire ( méthode post) de la page 1 vers la page 2.

    Moi ce que je trouvais pratique dans ma méthode, c'est que lees données sont transférer directement vers la page2.
    C'est justement ça qui n'est pas pratique, le fait de pointer le formulaire vers une autre page.
    C'est la source même de ton problème, donc ta façon de procéder n'est pas si pratique que ça, elle parait juste plus logique (mais juste en apparence).

    Si tu reste sur la même page, les données en POST sont là, du coup, on peu tout faire, comme les ré-afficher en cas d'erreur (plus de prise de tête à retransmettre)
    Aussi, vu que ces données sont là, autant faire ce qu'il y a à faire de suite.

    Tu admettras qu'à un moment donné, il faudra faire quelque chose avec ces données, non ?
    Donc quelque part, on s'en fiche où ce trouve le code. Autant le mettre là où c'est le plus pratique.

    L'étape 2 est une autre étape, autre problème, autres données à afficher et à gérer, etc, etc, même si elle dépend de l'étape précédente.

    Le truc, c'est de réfléchir qu'est ce qu'on fait avec ces données de l'étape 1 dans le cas où tout est correcte, donc avant de faire la redirection vers l'étape 2.
    Les enregistrer dans la Bdd ?
    Les mettre en session ?
    Voir les 2 ?
    Ca, j'en sais rien, c'est à toi de voir qu'est ce qu'il est le plus pratique.

    Le truc, c'est de faire en sorte que cette étape 2 s'appuie sur un minimum de données dépendante de l'étape 1, comme sur 1 ou 2 identifiants.
    S'il y a des données à afficher dépendantes de ces données, on fait une ou plusieurs requêtes.
    En tout cas, on évite de transmettre toutes les données de l'étape1 vers l'étape2, sinon, ça ne sert à rien, où cette étape 1 est mal faite, ou la relation étape1/étape2 est mal conçue.

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut
    Bon,

    ben je pense que je ne vais pas échapper aux session. c'est ce que je voulais éviter mais je n'ai le choix. Et la base de données, je pense que ce n'est pas fait pour.

    j'ai 6 données à faire parvenir à la page 2 :

    continent, pays, ville, date_debut, date_fin et type.

    je vais peut-être utilisder la méthode get.

    c'est à dire récupérer la valeur des données dans la page 1 et faire un header en mettant ces données dans l'url...

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    ben je pense que je ne vais pas échapper aux session. c'est ce que je voulais éviter mais je n'ai le choix. Et la base de données, je pense que ce n'est pas fait pour.
    J'ai plutôt l'impression tu tombe dans le cas d'une mauvaise relation entre l'étape1 et 2.
    (D'ailleurs, si je regarde ton autre problème, autre topic, c'est ce que je me dis).

    Pose toi bien la question s'il y a pas moyen de fusionner ces 2 pages pour en faire qu'une.
    C'est l'impression que j'en ai, ce qui t'éviteras de passer des trucs en paramètres ou autre trucs en session.
    Ton étape 2 serait beaucoup trop dépendante de le 1ère, autant les fusionner.
    Ca peu se faire, et quand bien même que ça débouche sur beaucoup de codes, car 2 étapes dans une, ça serait à mon sens plus pratique.
    Suffit de bien commenter le code pour bien séparer les choses.


    Enfin, c'est une idée.

  9. #9
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut
    OK.

    Je pense que c'est ce que je vais faire.

    Merci pour ces précieux conseils.

  10. #10
    Membre Expert
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Billets dans le blog
    1
    Par défaut
    Yop!

    Il est aussi possible de renvoyer toutes les valeurs du tableau $_POST de la page 2 vers la page 1, et de compléter la valeur des champ de la page 1 par l'entrée correspondante dans le table $_POST.

    A la première viste de la page1, tous les champs sont vides.

    Page 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo "<form action='page2.php' method=post>";
    echo "<input type=text name='field1' value='" . $POST["field1"] . "'>";
    echo "<input type=text name='field2' value='" . $POST["field2"] . "'>";
    echo "<input type=submit value='go'>";
    echo "</form>";
    Page 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    errors = 0;
    if ( $_POST["field1"] == "" )
    {
      echo "T'as oublié le champ field1, man<br>";
      errors = 1;
    }
    if ( $_POST["field2"] == "" )
    {
      echo "T'as oublié le champ field2, man<br>";
      errors = 1;
    }
     
    if ( errors == 0)
    {
      ce que tu dois faire si tout va bien....
    }
    else
    {
      echo "faudra recommencer, man...<br>";
      echo "<form action='page1.php' method=post>";
      foreach($_POST as $index => $valeur)
        echo "<input type=hidden name='" . $index . "' value='" . stripslashes($valeur) . "'>";
      echo "<input type=submit value='recommencer'>";
      echo "</form>";
    }
    Le foreach($_POST as $index => $valeur) évite de devoir renvoyer chaque champ individuellement.

  11. #11
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut
    Bonjour man ;-),

    je n'ai pas tout compris..

    Apparemment, c'est dans la page 2 que l'on détecte les erreurs de saisie, mais je ne vois pas à quel moment tu bascule vers la page 1 en cas d'erreur, il n'y a aucun header...

  12. #12
    Membre Expert
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Billets dans le blog
    1
    Par défaut
    Yop!

    Le retour n'est pas automatique. Dans la page 2, on affiche la liste des champs qui doivent être complétés (t'as oublié le champ machintruc, man), il y a une FORM avec les champs cachés et un bouton "Recommencer" qui pointe vers la page 1, et quand on revient à la page 1, les champs sont pré-remplis avec les valeurs tirées du tableau $_POST que la page 2 renvoie en champs cachés.

    C'est le système que j'emploie, et les utilisateurs ne se sont jamais plaints.

  13. #13
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 937
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 937
    Par défaut
    Ha oui ça y est j'ai compris, je n'ai vu le champ hidden.

    Effectivement, c'est astucieux.

    Merci pour cette technique, elle me plaît bien

    Ca vaut bien un petit résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/01/2013, 22h10
  2. Formulaire, redirections et gestion des erreurs
    Par xnopre dans le forum Langage
    Réponses: 7
    Dernier message: 18/08/2011, 09h58
  3. Gestion des erreurs de formulaire
    Par TempusFugit dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2009, 16h34
  4. gestion des erreurs (validation de formulaires)
    Par mattyeux dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 26/11/2007, 08h53
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 23h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo