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 :

avis sur class php et sur vérification de saisie utilisateur


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 200
    Points : 157
    Points
    157
    Par défaut avis sur class php et sur vérification de saisie utilisateur
    Bonjour à tous,
    avant d'aller plus loin dans mon code, j'aurais souhaiter votre avis pour savoir si je démarre bien dans mon code. le résultat fonctionne mais je veux juste savoir si j'ai bien compris la poo et la facon de faire.
    j'ai un formulaire de type nom, prenom, date de naissance.
    j'utilise une class enfant pour vérifier la saisie utilisateur (par des REGEX). une fois cette vérification faite, je compte utiliser une class enfantManager qui me permettra notamment l'ajout en BDD.
    Pourriez vous me dire si je pars sur une bonne base SVP ? Est ce que la vérification de saisie est suffisante pour évier les injections sql (sachant que j'utiliserai PDO et les requêtes préparées pour l'insertion)?
    D'avance merci pour votre retour.
    l'instanciation de ma class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (isset($_POST['birth']))
    		{
    			$enfant = new Enfant($_POST['name'],$_POST['surname'],$_POST['birth']);
    			if ($enfant->getError() == true)
    			{
    				echo "Merci de vérifier les informations saisie:<p>".$enfant->getErrorMessage()."</p>";
    			} else {
    				$enfantManager = new EnfantManager($db);
    				$EnfantManager->addEnfant($enfant->getName(), $enfant->getSurname(),$enfant->getBirth());
    			}
    		}
    la class enfant:
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    class Enfant
    {
    	protected $_name;
    	protected $_surname;
    	protected $_birth;
    	protected $_erreur = false;
    	protected $_erreurMessage ="";
     
    	public function __construct($name,$surname,$birth)
    	{
    		$this->setName($name);
    		$this->setSurname($surname);
    		$this->setBirth($birth);
    	}
    	public function setError($erreur)
    	{
    		$this->_erreur=$erreur;
    	}
    	public function getError()
    	{
    		return $this->_erreur;
    	}
    	public function getErrorMessage()
    	{
    		return $this->_erreurMessage;
    	}
    	public function getName()
    	{
    		return $this->_name;
    	}
    	public function getSurname()
    	{
    		return $this->_surname;
    	}
    	public function getBirth()
    	{
    		return $this->_birth();
    	}
    	public function setName($name)
    	{
    			if (preg_match("#^[a-zA-Z]{1,}[a-zA-Z\- '][a-zA-Z]{1,}$#",$name) and strlen($name)>=2 and strlen($name)<=50) {
    				$this->_name=ucfirst(strtolower($name));
    			} else {
    				$this->_erreur=true;
    				$this->_erreurMessage.="Prénom invalide.<br />";
    			}
    	}
    	public function setSurname($surname)
    	{
    		if (preg_match("#^[a-zA-Z]{1,}[a-zA-Z\- '][a-zA-Z]{1,}$#",$surname) and strlen($surname)>=2 and strlen($surname)<=50) {
    				$this->_surname= strtoupper($surname);
    			} else {
    				$this->_erreur=true;
    				$this->_erreurMessage.="Nom de famille invalide.<br />";
    			}
    	}
    	public function setBirth($birth)
    	{
    		if (!empty($birth))
    		{
    			if (preg_match("#^(20|19)[0-9]{2}(-|/)((0[1-9]){1}|(1[0-2]){1})(-|/)((0[1-9]){1}|(1[0-9]){1}|(2[0-9]){1}|(3[0-1]){1})$#",$birth)) 
    			{
    				$this->_birth=$birth;
    			} else {
    				$this->_erreur=true;
    				$this->_erreurMessage.="Date de naissance invalide.";
    			}
    		} else {
    			$this->_erreur=true;
    			$this->_erreurMessage.="Date de naissance vide.";
    		}
    	}
    }

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur .NET/PHP/JAVA/C++
    Inscrit en
    Septembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur .NET/PHP/JAVA/C++

    Informations forums :
    Inscription : Septembre 2017
    Messages : 13
    Points : 21
    Points
    21
    Par défaut
    C'est pas mal mais je te suggère de faire une représentation uml de ton système d'information avant de passer au codage.
    Bien que ce ne soit pas obligatoire mais c'est une étape à ne pas negliger.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 200
    Points : 157
    Points
    157
    Par défaut
    Merci pour ton retour. pour l'UMl je verrais ca plus tard j'essaye de me concentrer d'abord sur la technique de la POO.
    si personne ne voit de problème conceptuel alors je considérerai comme résolu dans la journée

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    ce n'est pas une bonne approche.
    Tu ne devrais pas valider les données à la définition.
    Sans compter que tu peux très bien avoir une validation différente en fonction de l'action à réaliser (à l'insertion, tu vas avoir une validation et à la modification, tu vas en avoir une autre). Comment comptes-tu gérer ce cas de figure avec ton implémentation ?
    Comme tu ne peux jamais être certain de ce qui provient de l'internet, tu te dois de t'assurer que ce que tu manipules existe et est à disposition, chose que tu ne fais pas comme ici : $enfant = new Enfant($_POST['name'],$_POST['surname'],$_POST['birth']);, rien ne te dit que les clés dans le $_POST existent...

    Enfin, si tu ne veux pas avoir à recopier tes tests de validation partout, je t'invite à les factoriser afin de faciliter leur réutilisation. C'est un très bon exercice de conception abstraite en POO : concevoir une classe de validation générique et personnalisable en même temps.
    Et pour les dates, on utilise new DateTime() et surtout pas un regex.

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Moi j'avais pensée à quelque chose comme ça:
    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
    interface Validator
    {
        public function validate($data, ValidationErrors $err): boolean;
    }
     
    class StringValidator implements Validator
    {
        public function __construct(array $options) {}
     
        public function validate(string $data, ValidationErrors $err): boolean {}
    }
     
    class DateFormatValidator implements Validator
    {
        public function __construct(string $format) {}
     
        public function validate(string $data, ValidationErrors $err): boolean {}
    }
     
    class DateRangeValidator implements Validator
    {
        public function _construct(\DateTime $from, \DateTime $to) {}
     
        public function validate(\DateTime $data, ValidationErrors $err): boolean {}
    }
     
    class EnfantFactory
    {
        public static function create($data, ValidationErrors $err): ?Enfant {
            /* ...validations... */
     
            return $err->empty ? new Enfant($name, $surname, $birth)
                               : null;
     
        }
    }
     
    class Enfant
    {
        protected $_name;
        protected $_surname;
        protected $_birth;
     
        public function __construct($name, $surname, $birth) {}
    }
    Mais je me demande à quelle place mettre la validation de rang de la date (entre 1900 et maintenant): dans la factory ou dans la classe Enfant ?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    bonne approche, très bon code, je vais pousser plus loin vers l'agilité :
    - je voudrais savoir comment tu peux créer à la volée (à l'exécution, donc) un validateur et le mettre à disposition de la suite du code ?
    - je voudrais également pouvoir créer et manipuler un Enfant et tester sa validité quand bon me semble
    - comment chaîner simplement les validateurs afin d'avoir un système de validation très souple.


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

Discussions similaires

  1. [PHP 5.2] Classe PHP - utilisation SPDO - avis sur la classe
    Par david21.martins dans le forum Langage
    Réponses: 10
    Dernier message: 20/07/2009, 22h20
  2. Avis sur la vérification des données d'une fiche
    Par AlexB59 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/07/2005, 20h55

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