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 :

Gestion des erreurs


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 29
    Points : 26
    Points
    26
    Par défaut Gestion des erreurs
    Salut, j’essaie de faire un site façon MVC pour info...

    Si je valide mon formulaire inscription à vide et je voudrais qu'il m'affiche qu'il est incomplet, mais là il me l'affiche direct sans avoir fais le submit.

    Alors, ma question est quel est le meilleur moyen pour créer les messages d'erreurs ou de réussites suite au divers vérifications pour un formulaire et il y en a pas mal à faire tout de même.

    mais je pense que y'a beaucoup mieux à faire, éventuellement gérer tout ça avec les sessions aussi.

    Merci par avance pour votre aide et vos conseils.

    Controleur Global:
    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
    27
    28
    <?php
    session_start();
    require_once("modele/inscription.php");
    include("vue/entete.php");
    include("vue/header.php");
     
    include("vue/menu.php");
     
    if(!isset($_REQUEST['action'])){
        $action = 'accueil';
    }else{
        $action = $_REQUEST['action'];
    }
     
    switch($action){
        case 'accueil':
            include("vue/accueil.php");
            break;
        case 'login':
            include("controleur/c_authentification.php");
            break;
        case 'inscription':
            include("controleur/c_authentification.php");
            break;
    }
     
    include("vue/footer.php");
    ?>
    Controleur pour le login et inscription :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?php
     
    switch($action){
     
        case 'login':
            include("vue/login.php");
     
            if(isset($_POST['login']) && !empty($_POST['login']) &&
            isset($_POST['pass']) && !empty($_POST['pass'])){
     
     
            }else{
     
            }
     
            break;
     
        case 'inscription':
     
            if(isset($_POST['name_login']) && !empty($_POST['name_login']) && 
                isset($_POST['name_pwd']) && !empty($_POST['name_pwd']) && 
                isset($_POST['name_pwd_confirm']) && !empty($_POST['name_pwd_confirm']) && 
                isset($_POST['email']) && !empty($_POST['email'])
            ){
                $nom = trim($_POST['name_login']);
                $pass = trim($_POST['name_pwd']);
                $pass2 = trim($_POST['name_pwd_confirm']);
                $mail = trim($_POST['email']);
     
                //On vérifie à nouveau si les valeurs des champs ne sont pas vide.
                if(empty($nom) || empty($pass) || empty($pass2) || empty($mail)){
     
                    $message_error = "Le formulaire est incomplet !";
                //On vérifie que les mots de passe saisie sont identique
                }else if($pass != $pass2){
     
                    $message_error = "Le mot de passe n'est pas identique";
                //On vérifie que le login saisie n'est pas déjà présent dans la base.
                }else if(check_user_exist($nom)){
                    $message_error = "Le login $nom existe déjà";
                }
                //Insertion du nouvel utilisateur dans la base.
                else{
                    $message = insert_users($nom, $pass, $mail);
                    include("vue/login.php");
                }
     
            }else{
                $message_error = "Le formulaire est incomplet !";
                include("vue/inscription.php");
            }
     
            break;
    }
    ?>
    Formulaire d'inscription :
    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
    <a href="index.php?action=login">Retour Authentification<a/>
    <fieldset>
        <legend>Inscription : </legend>
     
        <?php 
            if(isset($message_error)){
                echo "<p class='message_err'>$message_error</p>";
            }
        ?>
     
        <form action="index.php?action=inscription" method="post">
            <p><label for="name_login">Login :</label><input type="text" name="name_login" id="name_login" /></p>
            <p><label for="name_pwd">Mot de passe :</label><input type="password" name="name_pwd" id="name_pwd" /></p>
            <p><label for="name_pwd_confirm">Confirmer mot de passe :</label><input type="password" name="name_pwd_confirm" id="name_pwd_confirm" /></p>
            <p><label for="email">E-mail :</label><input type="text" name="email" id="email" /></p>
            <input type="submit" name="submit" value="Inscription" />        
        </form>
    </fieldset>
    Alors j'avais pensé rajouter ce code à la fin du controleur pour l'inscription:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     //On vérifie que le formulaire est bien envoyé.
        //Affichage d'un msg d'erreur si un des champs est vide.
        }else if(isset($_POST['submit'])){
            $message_error = "Le formulaire est incomplet !";
        }
        //Si il existe un msg d'erreur on affiche à nouveau le formulaire d'inscription.
        if(!empty($message_error)){
            include("vue/inscription.php");
        //1er affichage du formulaire d'inscription.
        //Si aucun msg validant l'inscription on affiche le formulaire d'inscription.
        }else if(empty($message)){
            include("vue/inscription.php");
        }

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Personnellement, j'utilise les filtres pour valider les données en provenance d'un formulaire. Il suffit ensuite de faire correspondre les cas d'erreurs sur des messages et de construire le formulaire avec tout ça (j'ai une classe helper qui le fait pour moi).

    Exemple de validation:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    // messages 'champ manquant'
    $message_missing = array(
      'name'     => 'Le nom est manquant',
      'surname'  => 'Le prénom est manquant',
      'login'    => 'Le login est manquant',
      'password' => 'Le mot de passe est manquant',
      'age'      => 'L\'âge est manquant',
    );
     
    // message 'champ invalide'
    $message_invalid = array(
      'name'     => 'Le nom est invalide',
      'surname'  => 'Le prénom est invalide',
      'login'    => 'Le login est invalide',
      'password' => 'Le mot de passe est invalide',
      'age'      => 'L\'âge est invalide',
    );
     
    // les données reçues (POST, GET ou REQUEST, peu importe)
    // il manque le mot de passe et l'age est incorrect
    $form_data = array(
      'name'     => 'foo',
      'surname'  => 'bar',
      'login'    => '',
      'age'      => 'abc',
    );
     
    // on passe tout ça dans un filtre
    $validated_data = filter_var_array($form_data, array(
      'name'     => FILTER_SANITIZE_STRING,
      'surname'  => FILTER_SANITIZE_STRING,
      'login'    => FILTER_SANITIZE_STRING,
      'password' => FILTER_SANITIZE_STRING,
      'age'      => FILTER_VALIDATE_INT,
    ));
     
    $error_messages = array();
     
    // les champs invalides sont marqués à 'FALSE', on réccupère leurs clés
    $invalid_data_keys = array_keys($validated_data, false, true); // attention à ne pas oublier le paramète $strict
    // on ajoute les messages correspondant à ces clés au tableau de messages
    $error_messages += array_intersect_key($message_invalid, array_flip($invalid_data_keys)); // attention à ne pas oublier de "retourner" le tableau $invali_data_keys
     
    // les champs manquants sont marqués à NULL ou sont vides, on réccupère leurs clés
    $missing_data_keys = array_keys($validated_data, false); // ici pas de recherche stricte, on veut tout ce qui est évalué à FALSE
    // on ajoute les message correspondants à ces clés
    $error_messages += array_intersect_key($message_missing, array_flip($missing_data_keys));
     
    // voyons maintenant ce qu'on a dans $messages
    var_dump( $error_messages );
     
    /* on obtiens
     
    array
      'age' => string 'L'âge est invalide' (length=19)
      'login' => string 'Le login est manquant' (length=21)
      'password' => string 'Le mot de passe est manquant' (length=28)
     
    c'est cool non ? */
    Je te suggère de te fabriquer des fonctions ou des classes pour rendre cette validation générique, sinon c'est effectivement un peu fastidieux à faire, mais bon en gros voici l'idée:
    • on filtre les données à travers filter_input_array ou filter_var_array
    • on réccupère un tableau associatif
    • on isole les clés dont les valeurs strictement FALSE (invalide) puis équivalentes à FALSE (manquant)
    • on réalise l'intersection avec les tableaux de messages d'erreur pour produire un tableau de messages d'erreur final

    On note au passage qu'on utilise l'opérateur + sur les tableaux qui pour rappel permet d'ajouter des entrées dans un tableau si la clé n'est pas déjà présente, donc si l'erreur 'champ invalide' est déjà dans le tableau, elle ne sera pas écrasée par l'erreur 'champ manquant'.
    Si on veut tolérer des champs vides, il suffit de retirer les messages d'erreurs correspondants tout simplement.

    Ensuite, si ce tableau final n'est pas vide, il te suffit de retourner sur la formulaire et de le reconstruire avec les message d'erreur en regard de chaque champ.

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Au passage, voici une fonction qui permet de faire tout ça relativement simplement:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    function validate ($input, array $structure, array & $messages = null, $silent = false) {
        if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50200)
            throw new RuntimeException(__FUNCTION__ . " requires PHP 5.2 or higher");
     
        if (empty($structure))
            throw new InvalidArgumentException("Structure paramter is empty");
     
        if (is_int($input) && !in_array($input, array(INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV)))
            throw new InvalidArgumentException("Input parameter must be one of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV");
        elseif (is_int($input))
            $validate = 'filter_input_array';
        elseif (is_array($input))
            $validate = 'filter_var_array';
        else
            throw new InvalidArgumentException("Input parameter is expected to be integer or array," . gettype($input) . "given");
     
        $filter           = array();
        $messages_missing = array();
        $messages_invalid = array();
        foreach ($structure as $key => $value) {
            if (isset($value['filter'])) {
                $filter[$key] = $value['filter'];
            }
            else {
                !$silent && trigger_error("No filter specified for $key, using FILTER_UNSAFE_RAW", E_USER_WARNING);
                $filter[$key] = FILTER_UNSAFE_RAW;
            }
            if (isset($value['missing'])) $messages_missing[$key] = $value['missing'];
            if (isset($value['invalid'])) $messages_invalid[$key] = $value['invalid'];
        }
     
        if (!$data = $validate($input, $filter))
            return $data;
     
        $messages  = array();
        $messages += array_intersect_key($messages_invalid, array_flip(array_keys($data, false, true)));
        $messages += array_intersect_key($messages_missing, array_flip(array_keys($data, false)));
        return $data;
    }
     
    $structure = array(
      'a' => array(
        'filter' => FILTER_VALIDATE_INT,
        'missing' => 'A is missing',
        'invalid' => 'A is invalid',
      ),
      'b' => array(
        'filter' => FILTER_SANITIZE_STRING,
        'missing' => 'B is missing',
        'invalid' => 'B is invalid',
      ),
      'c' => array(
        'filter' => FILTER_VALIDATE_EMAIL,
        'missing' => 'C is missing',
        'invalid' => 'C is invalid',
      ),
    );
     
    $input = array(
      'a' => 'foo',
      'b' => 'bar',
    );
     
    var_dump(validate($input, $structure, $messages));
    var_dump($messages);

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    Salut,

    Ça m'a l'air intéressant les filtres, je ne connaissait pas, j'vais me pencher dessus et essayer de l'intégrer.

    En tout cas merci beaucoup pour ta réponse... à suivre !

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Les filtres, c'est LA solution pour valider et nettoyer des données en PHP, j'ai jamais rien trouvé de plus puissant pour faire çà

Discussions similaires

  1. [FB] Gestion des erreurs et application francophone
    Par Benjamin GAGNEUX dans le forum Installation
    Réponses: 10
    Dernier message: 20/05/2006, 14h54
  2. [struts][Datasource]Gestion des erreurs
    Par GreenJay dans le forum Struts 1
    Réponses: 8
    Dernier message: 15/09/2004, 16h51
  3. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20
  4. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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