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

ALM Discussion :

Couche Service/Entity/DAO - Validation des données


Sujet :

ALM

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut Couche Service/Entity/DAO - Validation des données
    Bonjour,

    Où faut-il la validation des données d'une entité ?

    Exemple avec une classe User.
    Une fonction qui vérifie que l'e-mail est du bon format et qu'il n'est pas utilisé.


    Dans l'entité ou dans le service ?

    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La maîtrise des données, c'est le boulot du SGBD.

    À lire : l'article de SQLPro sur les bases de données épaisses.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Merci pour cet article très intéressant.

    C'est vrai que je reste perplexe sur la pratique de cette théorie.
    Valider les données au niveau le plus bas est le plus sécurisé mais j'ai du mal à croire que ce soit la solution la plus performante, bien au contraire.

    Est ce que cette théorie est applicable avec MySQL ?
    Comment faudrait-il faire ?

    Prénons un cas tout simple, valider une inscription utilisateur avec :
    - un login, unique en base, alphanumérique, entre 3 et 20 caractères
    - un email, unique en base, format valide, certains domaines refusés

    Comment gérer cette validation côté base ? Par procédure stockée ?
    Comment surtout remonter toutes les erreurs à la fois ?

    Merci

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    L'unicité d'un login ou d'une adrel est garantie par un index de type UNIQUE chez MySQL. Il n'y a rien d'autre à programmer que de mettre un index UNIQUE sur ces colonnes. Il faut juste gérer le retour d'erreur de MySQL dans le programme si la contrainte d'unicité est violée.

    La solution "vérification par le programme" de ces contraintes d'unicité consisterait à lancer une requête vers le SGBD avec le login et l'adrel saisis par l'utilisateur pour vérifier s'ils exsitent déjà en BDD. Quitte à lancer une requête, autant n'en lancer qu'une : celle d'insertion du nouvel utilisateur en BDD !

    En plus, le temps que cette vérification soit faite par le programme, un autre utilisateur peut venir avec le même login !

    MySQL étant en retard de 20 ans avec certains éléments de la norme SQL, il ne connaît pas les contraintes CHECK qui permettrait de vérifier la longueur du login et sa composition alphanumérique.

    Il faut, chez MySQL mettre alors en oeuvre un trigger before insert, qui vérifiera en même temps a validité de l'adrel.

    Donc avec la méthode "contrôle par la BDD" :
    - le programme envoie la requête d'insertion ;
    - le SGBD fait toutes les vérifications et renvoie un code d'erreur ou l'identifiant auto-incrémenté de l'utilisateur créé.
    - le programme gère le code d'erreur reçu ou continue sa tâche de succès de la création de l'utilisateur.

    Avec la méthode "contrôle par le programme" :
    - le programme vérifie que le login ne comporte que des lettres et des chiffres, ainsi que sa longueur et agit en conséquence (là, pas de requête vers le serveur) ;
    - le programme vérifie le format de l'adrel et agit en conséquence (là, pas de requête vers le serveur) ;
    - le programme envoie une requête pour demander si le domaine de l'adrel saisi par l'utilisateur n'est pas interdit ;
    - le SGBD renvoie un comptage de ligne trouvée ;
    - le programme lit et gère le résultat ;
    - le programme lance une requête pour vérifier l'unicité du login et de l'adrel ;
    - le SGBD renvoie un comptage de lignes trouvées, de 0 (ok) à N (ko).

    Qu'est-ce qui est le plus rapide et le plus sûr ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    1/ Entièrement d'accord pour l'unicité d'envoyer l'insert directement mais beaucoup plus sceptique par un traitement sgbd trigger si la base n'est pas nécessaire. La c'est plus lourd et long de traverser toutes les couches.

    2/ Si on se concentre sur l'exemple est-il techniquement possible qu'un trigger remonte 3 erreurs :
    - problème format d'un champ
    - email non unique
    - login non unique

    3/ Pour les deux unicités, la requête ne bloque t-elle pas dès la 1ere contrainte violée?

    Merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dorian53 Voir le message
    1/ Entièrement d'accord pour l'unicité d'envoyer l'insert directement mais beaucoup plus sceptique par un traitement sgbd trigger si la base n'est pas nécessaire. La c'est plus lourd et long de traverser toutes les couches.
    Quelles couches ?

    2/ Si on se concentre sur l'exemple est-il techniquement possible qu'un trigger remonte 3 erreurs :
    - problème format d'un champ
    - email non unique
    - login non unique
    Oui avec quelques astuces. Il faudrait retrouver la discussion où ce genre de choses avait été abordé dans le forum MySQL.
    Un autre SGBD serait je crois capable de RAISE ERROR naturellement mais MySQL étant ce qu'il est, il faut ruser.

    3/ Pour les deux unicités, la requête ne bloque t-elle pas dès la 1ere contrainte violée?
    Il est fort possible en effet que MySQL ne renvoie qu'un seul message d'erreur, sur la première contrainte d'unicité qu'il trouve violée.

    Je ne sais pas si c'est pareil avec les autres SGBD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Quelles couches ?
    À titre d'exemple :
    - Présentation
    - Service
    - Métier
    - DAO

    Merci en tout cas pour cette réponse, il y a des choses intéressantes à prendre.

    D'autres avis ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/04/2011, 15h07
  2. [EXCEL] Validation des données saisies - nouvelle Question :-)
    Par Paloma dans le forum Macros et VBA Excel
    Réponses: 39
    Dernier message: 29/11/2006, 13h28
  3. Réponses: 5
    Dernier message: 01/10/2006, 13h48
  4. [PHP-JS] validation des données
    Par emma des bois dans le forum Langage
    Réponses: 6
    Dernier message: 10/02/2006, 15h28
  5. dbgrid AND validation des données
    Par samlerouge dans le forum Bases de données
    Réponses: 10
    Dernier message: 11/06/2004, 23h08

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