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 :

Mise en forme, erreurs de validation de formulaire


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut Mise en forme, erreurs de validation de formulaire
    Je ne suis pas sûr que ce soit le bon forum mais je pose cette question de noob.

    Juste pour info, je comprends parfaitement la logique de ce que j'ai à faire (la vérification/validation de données est le B A BA), j'ai décidément du mal à le mettre en pratique sur un langage web.

    Ce que fait correctement mon script PHP sur un seul fichier :
    - démarrage de session
    - récupération de l'ensemble des données post dans $_SESSION (ex. $['SESSION']['PostValues'] = $_POST; )
    - Récupération des données POST d'un formulaire de login avec email et mot de passe
    - Redirection vers la bonne URL si les données sont OK après vérification dans une BDD

    RIen de compliqué, sauf qu'en cas d'erreur, il faut mieux tout simplement noter les messages d'erreur et les montrer à l'utilisateur. Dans mon cas cité : Merci de saisir correctement le mail et mot de passe.

    En toute logique, un <label> peut être utilisé pour ça, sauf que l'objectif est uniquement de l'afficher en cas d'erreur, et, d'un point de vue général, le faire sur l'ensemble des champs concernés.

    Si je mets il label, il sera affiché par défaut donc ça ne solutionne pas le problème.

    Pas de validation Javascript, validation sur le serveur uniquement, comment faire un code propre et potentiellement réutilisable ?

    Pas de frameworks utilisés.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Déjà sur le principe : Je ne vois pas trop l'intérêt de stocker les données du formulaire dans la session. Mieux veut stocker uniquement les données utiles (par exemple, l'identifiant de l'utilisateur), et ne pas stocker des choses sensibles (comme par exemple le mot de passe), et surtout les stocker uniquement après validation.

    Pour les messages de validation, le plus simple à mon avis est de faire un tableau de messages d'erreurs (remis à zéro à chaque validation du formulaire) et l'afficher en haut de la page dans une simple liste (avec une mise en forme pour mettre en évidence que ce sont des erreurs, par exemple un cadre rouge)

  3. #3
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut
    Merci pour ta réponse.

    En effet, stocker des données sensibles en session telles que des identifiants / mots de passe est dangereux. J'aurais du y penser. -> corrigé.

    Tu peux me montrer comment tu mets le tout en forme pour les messages d'erreurs avec un exemple pratique ?

    Je n'ai pas de problème de logique mais d'application en essayant de garder un code propre, réutilisable et maintenable.

    Est ce que ton résultat ressemblerait à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    $errorMessages = 
        [
          '0' => 'Veuillez saisir votre adresse email.',
          '1' => 'Champ non saisi.',
          '2' => 'Données incorrectes saisies. Merci de fournir de respecter ce schéma : mail@domaine.com.'
        ];
    ?>
    Ce qui donnerai lors de la première génération de formulaire :
    - Aucune donnée en POST puisque le formulaire vient d'être créé
    - Affichage dans une balise Label du champ 0 de errorMessage, tout se passe correctement

    Lors de la soumission du formulaire, test des valeurs et changement du champ d'erreur affiché en fonction de ce qui a été mal saisi. Pour donner un résultat plus user-friendly, modifier la classe du label pour mettre en valeur l'erreur. Exemple : la classe label-danger de Bootstrap.

    D'autres façons plus pratiques de voir les choses ?

  4. #4
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Salut Aizen64,

    Bon commençons par le formulaire d'inscription :

    1 - Validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // On teste si le visiteur a soumis le formulaire
    // Ici 'inscription' est le 'name' du bouton, 'Inscription' sa 'value'
    if (isset($_POST['inscription']) && $_POST['inscription'] == 'Inscription')
    {
    // Traitement
    }
    2 - Vérification des champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // On teste l'existence de nos variables. On teste également si elles ne sont pas vides
    if ( (isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['nom']) && !empty($_POST['nom'])) ) 
    {
    // Traitement
    }
    Renseigne toi bien sur les isset() et empty() pour bien comprendre leur fonctionnement si besoin.

    3 - Vérification de l'intégrité de certaine données
    Quand tu a vérifié les différents éléments, tu peux te connecté à ta base puis faire une recherche sur le login demandé.
    S'il y a déjà un login similaire, tu sais quoi faire ... Faut pensé à ce genre de truc.

    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
     
    // on recherche si ce login est déjà utilisé par un autre membre
    $sql = ... ; // Ta requete recherchant des correspondance
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    $data = mysql_fetch_array($req);
    if ($data[0] == 0) 
    {
    	$sql = 'INSERT INTO ... '; // Ta requete ajoutant le nouveau dans la base
     
    	session_start();
    	$_SESSION['login'] = $_POST['login'];
    	$_SESSION['nom'] = $_POST['nom'];
    	$_SESSION['prenom'] = $_POST['prenom'];
    	header('Location: Accueil.php');
    	exit();
    }
    else 
    {
    	$erreur = 'Un membre possède déjà ce login.';
    }
    Il est tard, j'ai plus forcement les idées claires, mais pense à utiliser des fonctions tel que : mysql_real_escape_string() sur tes variables $_POST avant de les utilisé avec ta BDD pour évité des petites injections sql, failles XSS etc...

    J'en profite aussi pour te dire que sur certains de mes exemples tu vois du "mysql". Essaye de passer sur pdo, ne suis pas bêtement mon exemple.

    4 - Les erreurs
    Si tu ne veux pas utilisé javascript, tu peux en effet utilisé les variables session, mais plus simplement des variables normales suffisent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(condition)
    {
      // Traitement
    }
    else
    {
       $erreurs = '/t Ceci est l\'erreur du siècle, vous serez condamné à m\'écouter raconter des conneries toutes la journées. <br />'; 
       $erreurs .= $errorMessages['2']"<br />"; // En suivant ton exemple de tableau
    }
    Une seule variable suffit, fait juste attention à faire un " .= " au lieu d'un simple égal pour ne pas effacer tes données précédentes.
    Plus loin dans ton fichier, par exemple juste en dessous ou haut dessus du formulaire, tu peux afficher les erreurs si la variable n'est pas vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    if (isset($erreur))
    {
    	echo '<p style="color:red">'.$erreur.'</p>';
    }
    ?>
    Voila voila, mon code n'est pas parfait mais j'espère qu'il t'aidera, dans le cas contraire j'aime à croire qu'il en aidera d'autres .

    Ah oui, pour ceux qui utilise Bootstrap, pour gérer une certaine apparence pour les formulaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <!-- Message d'erreur ou de succès -->
    <?php if(array_key_exists('erreurs', $_SESSION)): ?>
    	<div class="alert alert-danger"> // Have A Look !!
    		<?= var_dump($_SESSION['erreurs']); ?>
    	</div>
    <?php endif; ?>
     
    <?php if(array_key_exists('success', $_SESSION)): ?>
    	<div class="alert alert-success"> // Have A Look !!
    		<?= var_dump($_SESSION['success']); ?>
    	</div>
    <?php endif; ?>
    Tcho' !

  5. #5
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut
    Au niveau de mon de, je fais correctement de l'échappement de caractères avant de faire une requête sur la BDD, pour le coup, la fonction utilisée diffère de la tienne comme je n'utilise pas MySQL.

    J'ai d'autres interrogations sur des questions dont je n'ai pas trouvé la réponse. Comme il me semble avoir déjà dit, mon objectif est de combiner aussi bien une validation correcte des données, en ne faisant jamais faire confiance à l'utilisateur et de faire un code maintenable et compréhensible.

    J'utilise notamment, filer_var pour vérifier l'email :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $email = filter_var($_POST['inputEmail'], FILTER_VALIDATE_EMAIL);
    D'un point de vue plus concret, j'ai pris le modèle Bootstrap de base pour les sign-in ici.

    Pour tester la sécurité et donc les données du formulaire, j'ai désactivé Javascript dans Firefox via about:config.

    Le résultat me surprend, une saisie de mail invalide génère toujours un tooptip qui spécifie que la valeur saisie n'est pas valide. Comment est-ce possible de faire ça sans JS ? Ça m'échappe.

    Sur ce même sujet, j'ai 2 autres questions :
    - comment modifier le texte du tooltip affiché par Bootstrap ?
    - Comment l'adapter en cas de développement de site international (localisation) ?

  6. #6
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut
    Mes questions tiennent toujours.

    Ceci dit, j'ai trouvé une solution partielle au problème que je trouve pas trop mal, bien qu'un peu trop verbeuse et probablement pas assez modulaire.

    Lors du 1er chargement de page, aucune donnée en POST :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        $validationMsg =
        [
          "index"     => 0,
          "name"      => "id ou name du tag HTML concerné",
          "cssClass"  => "classe_css_validation_ok",
          "type"      => "Info",
          "message"   => "Message d'information si le formulaire a un label d'info."
        ];
    Lors du test de données POST, en cas d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
          $validationMsg =
          [
            "index"       => 0,
            "name"        => "id ou name du tag HTML concerné",
            "cssClass"    => "classe_css_validation_ko",
            "type"        => "Erreur",
            "message"     => "Champ incorrectement saisi [Raison]."
            //Incrémentation de la valeur Index en fonction du nombre d'erreurs
     
          ];
    Cette méthode évite de trop se baser sur Javascript et jQuery, moins de problèmes en cas de désactivation de Javascript donc.

    Des choses à redire et des idées d'améliorations ?

Discussions similaires

  1. [AC-2010] Mise en forme champ texte enrichi dans formulaire
    Par Antoine B dans le forum IHM
    Réponses: 0
    Dernier message: 16/05/2013, 13h48
  2. [AC-2007] Mise en forme conditionnelle ligne entière sous-formulaire
    Par lio33 dans le forum IHM
    Réponses: 2
    Dernier message: 11/07/2011, 13h58
  3. Réponses: 4
    Dernier message: 21/01/2011, 16h03
  4. [CR 2008] Mise en forme d'un texte façon formulaire à cases
    Par mickamar dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 28/07/2010, 17h28
  5. Réponses: 2
    Dernier message: 05/03/2008, 10h31

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