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 :

Gérer les erreurs de validation d'un formulaire


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut Gérer les erreurs de validation d'un formulaire
    Bonjour à tous,

    j'ai une question qui me semble basique mais je n'ai pas trouvé de réponse appropriée :

    j'ai un formulaire avec disons 3 champs. Je souhaite faire des tests sur les saisies avant de valider le formulaire:
    1/ champ1 est-il rempli
    2/ champ2 est-il rempli
    3/ champ3 est-il rempli
    4/ champ1 remplit-il les conditions ?
    5/ champ2 remplit-il les conditions ?
    6/ champ3 remplit-il les conditions ?

    tout ca je sais faire avec des if/else, etc., mais je voudrais afficher aussi un message approprié (genre "champ1 n'est pas rempli, et champ3 ne remplit pas les conditions")

    Y a-t-il un moyen de faire ca de façon dynamique en ayant le moins de code à taper ? avez-vous un truc à me donner ?

    Merci d'avance !

    Cheers
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour la seule condition "rempli" tu pourrais faire une boucle sur tes champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $champs = array('username'=>'Nom', 'adresse'=>'Adresse');
    foreach ($champs as $key=>$value) {
      if (empty(trim($_POST[$key]))) {
          $erreur .= '<p>Le champs ' . $value . ' doit être renseigné</p>';
       }
    }
     
    if (isset($erreur)) {
       echo $erreur;
    }
    else {
       // traitement
    }
    mais pour des conditions plus évoluées, tu seras obligé de les traiter une par une.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    salut sabotage,

    merci pour la réponse !

    ma foi je vais faire avec, j'aurai essayé
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 383
    Points : 10 411
    Points
    10 411
    Par défaut
    La manière la plus simple est d'enregistrer les messages d'erreur dans un tableau. Et donc ensuite il suffit de lire le tableau pour afficher les différentes erreurs.
    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
    <?php
    $erreurs = array();
    if (condition1 == false)
    $erreurs[] = 'champ 1 non rempli';
     
    if (condition2 == false)
    $erreurs[] = 'champ 1 erroné';
     
    if (condition3 == false)
    $erreurs[] = 'champ 2  non rempli';
    //...
     
    if(count($erreurs) == 0)
    {
    // aucune erreur donc on peut faire le traitement du formulaire
    //...
    }
    ?>
    <html>
    code html...
    affichage des erreurs à corriger
    <?php if(is_array($erreurs) && count($erreurs) > 0)
    {
    foreach($erreurs as $value) echo '<p>'.$value.'</p>';
    }
    ?>
    </html>

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    un exemple de technique en situation :
    Système de Gestion-Affichage de Nouvelles : 4-C1. Traitement principal : news_traiter.php
    Code php : 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
    	// -----------------------------------------
    	// 2- GESTION des ERREURS
    	// -----------------------------------------
    	// Expression régulière pour vérifier qu'aucun en-tête n'est inséré dans les champs
    	$regex_head = '/[\n\r]/';
    	// pas de header dans les champs text */
    	if (preg_match($regex_head, $newsTitre)) {
    		$MsgErreurChamps 	.= 'Entêtes interdites dans les champs du formulaire !<br />';
    		$validNews 			= 2;
    	}
    	// ---------------------
    	// champs obligatoires
    	$champ_obligatoire = array();
    	if ($newsTitre=='') {			$validNews = 2;		$champ_obligatoire[] = 'Titre'; }
    	if ($newsContenu=='') {			$validNews = 2;		$champ_obligatoire[] = 'Contenu'; }
    	if($validNews==2 && count($champ_obligatoire)>0) {
    		$MsgErreurChamps 	.= 'Remplissez tous les champs obligatoires :<br /><b>'.implode('</b>, <b>',$champ_obligatoire).'</b><br />';
    	}
    	// ---------------------
    	if ($validNews!=2) {
    		$validNews 			= 1;
    		// -----------------
    	}
    A noter : l'utilisation de $champ_obligatoire.

    On peut ainsi "formater" le message d'erreur à afficher :
    Remplissez les champs suivants :
    champ1, champ3
    Ces champs ne remplissent pas les conditions :
    champ2

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    Bonjour,
    en partant du code de sabotage,
    je passe l'erreur dans la session pour la ré-afficher au bon endroit dans le formulaire,
    et en plus ajoute des regex facultatif en validation
    sauvegarde la saisie pour le remettre dans le formulaire en cas d'erreur

    traitement.php
    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
    <?php
    $validations = array(
        'username'=>array(
            'label'=>'Nom',
            'error'=>'Non dans un format inconnu',
            'regex'=>'#[a-c]{3,12}#'
        ),
        'adresse'=>array(
            'label'=>'Adresse'
        )
    );
     
    try {
        // validations
        session_start();
        unset($_SESSION['error']);
        unset($_SESSION['old']);
        foreach ($validations as $key=>$value)
        {
            $input=trim($_POST[$key]);
            $_SESSION['old'][$key]= $input; // sauvegarde de la valeur
            if (empty($input)) {
                $_SESSION['error'][$key]= 'Le champ ' . $value['label'] . ' doit être renseigné';
                throw( $_SESSION['error'][$key] );
            }
            if (isset($value['regex'])){
                if (!preg_match( $value['regex'] , $input, $match)){
                    $error= (isset($value['error'])) ? $value['error'] : $value['label'].' invalide'; 
                    $_SESSION['error'][$key]= $error;
                    throw( $error );
                }
            }
        }
    } catch (Exception $e) {
        header('Location: pageFormulaire.php'); exit;
    }
    // traitement si non erreur
    page formulaire.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    function getOldInput($name,$default='val venant de la bd'){ // restituer valeurs deja entrées 
        return (isset($_SESSION['old'][$name])) ? $_SESSION['old'][$name] : $default;
    }
    function getErrorInput($name){  // afficher si erreur présente
        return (isset($_SESSION['error'][$name])) ? '<p class="inputerror">'.$_SESSION['error'][$name].'</p>' : '';
    }
     
    echo '<input name="username" value="'.getOldInput('username','').'">'.getErrorInput('username');
    echo '<input name="adresse" value="'.getOldInput('adresse',$row['adresse']).'">'.getErrorInput('adresse');          
     
    // ...
    unset($_SESSION['error']);
      ?>
    $moi= ( !== ) ? : ;

  7. #7
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    bonjour à tous,

    waouh c'est de la BOMBE ! merci beaucoup, je vais m'inspirer de tout ca pour essayer d'en faire le moins possible rendre le truc le plus dynamique possible

    merci infiniment
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/04/2011, 21h27
  2. [XSD] Lister les erreurs de Validation
    Par Josy dans le forum Valider
    Réponses: 1
    Dernier message: 14/08/2006, 11h09
  3. Proc. Stock. : Gérer les erreurs
    Par audreyc dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 29/03/2006, 14h51
  4. gérer les erreurs intebase avec delphi
    Par mondanikoffi dans le forum Bases de données
    Réponses: 1
    Dernier message: 14/12/2004, 15h46

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