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 :

Classe PHP - utilisation SPDO - avis sur la classe [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Classe PHP - utilisation SPDO - avis sur la classe
    (Mon premier Post....)

    Bonjour, étant débutant en POO, je souhaiterais avoir vos avis concernant une classe métier que j'ai développé par mes soins. En effet celle-ci permet d'interagir avec la base de données uniquement, en ce qui concerne la table "Membres".

    voici le code de ma classe Membre :
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    <?php
     
    class Membre
    {
     
    	//Attributs
    	private $email; //Clé primaire dans la base de données
    	private $dateNaissance;
    	private $dateInscription;
    	private $mdp;
    	private $nom;
    	private $prenom;
    	private $tel_principale;
    	private $tel_secondaire;
    	private $adresse1;
    	private $adresse2;
    	private $pays; //Dans la base de données, cela est une clé etrangere. J'ai alors
    	//Décidé que cet attributs ferait référence à un objet.
    	private $cp;
    	private $ville;
    	private $compteValide; //Booléen
     
    	//Méthodes d'acces
    	public function getEmail()
    	{
    		return $this->email;
    	}
    	public function getMdp()
    	{
    		return $this->mdp;
    	}
    	public function getNom()
    	{
    		return $this->nom;
    	}
    	public function getPrenom()
    	{
    		return $this->prenom;
    	}
    	public function getTelPrincipal()
    	{
    		return $this->tel_principale;
    	}
    	public function getTelSecondaire()
    	{
    		return $this->tel_secondaire;
    	}
    	public function getAdresse1()
    	{
    		return $this->adresse1;
    	}
    	public function getAdresse2()
    	{
    		return $this->adresse2;
    	}
    	public function getPays()
    	{
    		return $this->pays; //Retourne un objet de type "Pays"
    	}
    	public function getCp()
    	{
    		return $this->cp;
    	}
    	public function getVille()
    	{
    		return $this->ville;
    	}
    	public function getValiditéCompte()
    	{
    		return $this->compteValide;
    	}
    	//...
     
    	//Etant donnée que les données seront récupéré a partir de la base de données, 
    	//Je décide d'instancier l'objet avec un constructeur qui prendrait un seul parametre : La clé primaire dans la 
    	//Base de données -> L'email
    	public function __construct($unEmail)
    	{
    		$unEmail = addslashes($unEmail); //Securisation de la chaine (provisoire pour l'instant.) une classe de sécurisation
    		//Sera crée
     
    		$infos = SPDO::getInstance()->query('SELECT * FROM membres WHERE email = \''.$unEmail.'\';');
     
    		if ($infos->rowCount() == 0)
    		{
    			return false;           //Est-ce une bonne chose de faire ca ?
    		}
    		else 
    		{
    			$ligne = $infos->fetch(PDO::FETCH_ASSOC);
    			$this->email = $ligne['EMAIL'];
    			$this->mdp = $ligne['MDP'];
    			$this->nom = $ligne['NOM'];
    			$this->prénom = $ligne['PRENOM'];
    			$this->tel_principale = $ligne['TEL1'];
    			$this->tel_secondaire = $ligne['TEL2'];
    			$this->adresse1 = $ligne['ADRESSE1'];
    			$this->adresse2 = $ligne['ADRESSE2']; 
    			$this->pays = new Pays($ligne['PAYS']); //Est-ce aussi une bonne solution
    			$this->cp = $ligne['CP']; 
    			$this->ville = $ligne['VILLE']; 
    			$this->compteValide = $ligne['COMPTE_VALIDE']; 		
     
    			return true;
    		}
    	}
     
    	//Voici une méthode statique premettant d'ajouter un membre dans la base de données
    	//Je n'ecris pas le corps de la méthode, simplement pouvez vous me dire si cette facon de programmer est cohérente
    	public static function create($unEmail,$unMdp,$unNom,$unPrenom,$unTelPrincipale,$unTelSecondaire,$uneAdresse,$uneAdresse2,$unPays,$uneVille,$unCp,$unCompteValide)
    	{
     
    	}
     
    }
     
     
    ?>
    Voila, toutes les critiques sont bonnes à prendre.
    Je vous remercie d'avance.
    David

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    C'est quoi SPDO ?


  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    No sé. A première vue un PDO en singleton !?!?

    Toujours est il que des return dans un constructeur, c'est mal poli.
    Généralement si la "construction" échoue pour une raison quelconque, on balance une exception.
    Je sais même pas si le return est interprété. Et s'il l'est ça doit aboutir à des comportements assez surprenants

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Effectivement, SPDO est un PDO en singleton.

    Je me doutais que les "return" dans un constructeur était à proscrire, mais je ne savais pas que c'était mal poli .
    Je vais donc les supprimer et faire des "exceptions".
    Merci pour ce conseil.

    j'ai une autre questions, est ce que la méthode statique de création d'un membre est une "bonne" chose dans ce cas de figure.

    puis-je également créer une méthode statique "getMembreParMail($mail)" ?

    Merci de vos réponses.
    Bonne journée !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Je me doutais que les "return" dans un constructeur était à proscrire, mais je ne savais pas que c'était mal poli .
    Je m'excuse de ma manière "humour à deux balles" de tourner les phrases parfois

    Sinon en ce qui concerne les questions sérieuses, je prendrais le problème autrement :

    PHP ne permettant pas de surcharger les méthodes ou les constructeurs, je passerais par des méthodes statiques comme tu l'envisages, et limiterais le constructeur à __construct( $id , $nom , $machin, $truc... ) ou tu passes toutes les infos que tu récupères de ta DB.

    Dans ton cas de figure, si tu veux récupérer un membre par son ID ou par son nom par exemple, t'es mal. De même ton systeme ne permet pas de créer l'objet à partir de ce que tu pourrais récupérer depuis un formulaire.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Je m'excuse de ma manière "humour à deux balles" de tourner les phrases parfois
    Ne t'excuses pas, je ne t'en voulais pas !

    Bon, alors en lisant ce que tu m'as écris, j'ai compris cette solution !

    le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public __construct($unEmail,$unMdp,$unNom.....)
    {
    $this->email = $unEmail
    $this->mdp= $unMdp
    $this->nom= $unNom
    $this->... = ...
    }
     
    public static function getMembreParMail($unEmail)
    {
    ...
    }

    Pour la récupération d'un membre par son nom ou n'importe quelles autres informations, cela est impossible, étant donné que plusieurs membres peuvent avoir le même nom, voire même prénom a la fois.

    Est-ce la solution que tu as envisagé ? celle-ci me semble déjà plus cohérente que ma première solution.
    Merci !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Voila désormais a quoi ressemble ma classe :
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
     
    <?php
     
    class Membre 
    {
     
    	//Attributs
    	private $email; //Clé primaire dans la base de données
    	private $pays; //Dans la base de données, cela est une clé etrangere. J'ai alors
    	//Décidé que cet attributs ferait référence à un objet.
    	private $mdp;
    	private $nom;
    	private $prenom;
    	private $dateNaissance;
    	private $tel_principale;
    	private $tel_secondaire;
    	private $disponibilite;
    	private $adresse;
    	private $ville;
    	private $cp;
    	private $compteValide; //Booléen
    	private $dateInscription;
    	private $civilite;
     
    	//Etant donnée que les données seront récupéré a partir de la base de données, 
    	//Je décide d'instancier l'objet avec un constructeur qui prendrait deux s : La clé primaire dans la 
    	//Base de données -> L'email et son mot de passe
    	public function __construct($unEmail,$unPays,$unMdp,$unNom,$unPrenom,$uneDateDeNaissance,$tel1,$tel2,$uneDisponibilité,$uneAdresse,$uneVille,$unCp,$unCompteValide,$uneDateInscription,$laCivilite)
    	{
    		$this->email = $unEmail;
    		$this->pays = $unPays;
    		$this->mdp = $unMdp;
    		$this->nom = $unNom;
    		$this->prenom = $unPrenom;
    		$this->dateNaissance = $uneDateDeNaissance;
    		$this->tel_principale = $tel1;
    		$this->tel_secondaire = $tel2;
    		$this->disponibilite = $uneDisponibilité;
    		$this->adresse = $uneAdresse;
    		$this->ville = $uneVille;
    		$this->cp = $unCp;
    		$this->compteValide = $unCompteValide;
    		$this->dateInscription = $uneDateInscription;
    		$this->civilite = $laCivilite;
    	}
     
    	public static function getMembreParEmail($unEmail)
    	{
    		$unEmail = addslashes($unEmail); //Securisation de la chaine (provisoire pour l'instant.) une classe de sécurisation
    		//Sera crée
    		$unMdp = addslashes($unMdp);
     
    		$infos = SPDO::getInstance()->query('SELECT * FROM membres WHERE email = \''.$unEmail.'\' AND mdp = \''.$unMdp.'\';');
     
    		if ($infos->rowCount() == 0)
    		{
    			return false;           
    		}
    		else 
    		{
    			$ligne = $infos->fetch(PDO::FETCH_ASSOC);
    			$this->email = $ligne['EMAIL'];
    			$this->mdp = $ligne['MDP'];
    			$this->nom = $ligne['NOM'];
    			$this->dateNaissance = $ligne['DATE_NAISSANCE'];
    			$this->prenom = $ligne['PRENOM'];
    			$this->tel_principale = $ligne['TEL1'];
    			$this->tel_secondaire = $ligne['TEL2'];
    			$this->disponibilite = $ligne['disponibilite'];
    			$this->adresse = $ligne['ADRESSE1'];
    			$this->pays = new Pays($ligne['ID_PAYS']); 
    			$this->cp = $ligne['CP']; 
    			$this->ville = $ligne['VILLE']; 
    			$this->compteValide = $ligne['COMPTE_VALIDE']; 	
    			$this->dateInscription = $ligne['DATE_INSCRIPTION'];
    			$this->civilite = $ligne['CIVILITE'];				
     
    			return true;
    		}
    	}
     
     
    	public static function emailValide($unEmail) //Fonction qui test l'email n'est pas déja present dans la base de données
    	{
    		$unEmail = addslashes($unEmail); //Securisation de la chaine (provisoire pour l'instant.) une classe de sécurisation
    		//Sera crée
     
    		$infos = SPDO::getInstance()->query('SELECT email FROM membres WHERE email = \''.$unEmail.'\';');
    		if ($infos->rowCount() == 1)
    		{
    			return false;           //email deja présent.
    		}
    		else {
    			return true;
    		}
    	}
     
    	//Voici une méthode statique premettant d'ajouter un membre dans la base de données
    	//Je n'ecris pas le corps de la méthode, simplement pouvez vous me dire si cette facon de programmer est cohérente
    	public static function create($unEmail,$unMdp,$unNom,$unPrenom,$uneDateNaissance,$unTelPrincipale,$unTelSecondaire,$uneDisponibilite,$uneAdresse,$unPays,$uneVille,$unCp)
    	{
    		//sécurisation des chaines de caractere
    		$unEmail = addslashes($unEmail);
    		$unMdp = addslashes($unMdp);
    		$unNom = addslashes($unNom);
    		$unPrenom = addslashes($unPrenom);
    		$uneAdresse = addslashes($uneAdresse);
    		$uneVille = addslashes($uneVille);
    		$unCp = addslashes($unCp);
     
    		$dateEnregistrement = date('d-m-Y');
     
    		$sqlString = 'INSERT INTO membres VALUES (\''.$unEmail.'\',\''.'fr'.'\',\''.$unMdp.'\',\''.$unNom.'\',\''.$unPrenom.'\',\''.$uneDateNaissance.'\',\''.$unTelPrincipale.'\',\''.$unTelSecondaire.'\',\''.$uneDisponibilite.'\',\''.$uneAdresse.'\',\''.$uneVille.'\',\''.$unCp.'\',0,\''.$dateEnregistrement.'\',\'Mr\')';
     
    		if (SPDO::getInstance()->exec($sqlString))
    		{
    			return true;
    		}
    		else {
    			return false;
    		}
    	}
     
    	//Méthodes d'acces
    	public function getEmail()
    	{
    		return $this->email;
    	}
    	public function getMdp()
    	{
    		return $this->mdp;
    	}
    	public function getNom()
    	{
    		return $this->nom;
    	}
    	public function getPrenom()
    	{
    		return $this->prenom;
    	}
    	public function getTelPrincipal()
    	{
    		return $this->tel_principale;
    	}
    	public function getTelSecondaire()
    	{
    		return $this->tel_secondaire;
    	}
    	public function getAdresse()
    	{
    		return $this->adresse;
    	}
    	public function getPays()
    	{
    		return $this->pays; //Retourne un objet de type "Pays"
    	}
    	public function getCp()
    	{
    		return $this->cp;
    	}
    	public function getVille()
    	{
    		return $this->ville;
    	}
    	public function getValiditéCompte()
    	{
    		return $this->compteValide;
    	}
    }
     
    ?>

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    C'est exactement ça.

    Viennent ensuite certains choix à faire.

    Si par exemple tu reçois des données concernant Membre depuis un formulaire, l'objet est idéal pour vérifier ces données.

    Au choix donc :
    Soit tu fais un constructeur avec des valeurs nulles par défaut. Ce qui te permet de faire quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $membre = new Membre();
    $membre->setNom( $_POST['nom'] );
    etc...
    Chaque méthode setQuelqueChose() vérifiant que la valeur affectée ressemble à quelque chose d'attendu. Reste ensuite à voir si ces méthodes balancent une exception si la valeur n'est pas valide, ou si tu returne du true/false ou autre.

    L'autre choix est que ton constructeur s'appuie sur sur les méthode setMachin() pour valider les infos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function __construct( $nom , $prenom ... ){
        $this->nom = $this->setNom( $nom );
        etc...
    }
    La deuxième méthode ayant l'avantage de simplifier le code au niveau du procédural (qui est souvent la partie la plus bordélique d'un script). Le problème est que si tu te bases sur un système d'exceptions, je me rappelle plus si PHP peut faire "redescendre" les exceptions levées (throws java)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Juste un truc qui n'a rien à voir :

    addslashes() pour sécuriser les chaînes de caractères c'est relativement bof.

    Les requêtes préparées de PDO échappent les chaînes plus proprement. Regarde du coté de PDO::prepare(), ce serait dommage de se priver d'un truc pas trop mal foutu pour une fois

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Et bien avant tout : Merci !

    Cela m'a permis déjà d'y voir beaucoup plus clair ! Je préféré adopter de bonne manières de programmation pour mes projets actuels et futurs. que ce soit aussi bien au niveau de la sécurité qu'au niveau de l'organisation/optimisation du code !

    Je pense que je vais opter pour la seconde solution, concernant la "redescente" des exceptions levées, je vais chercher un petit peu sur le net !

    enfin, pour la sécurisation des chaines, merci pour l'info !

    Si j'ai d'autres questions, je n'hésiterais pas à les poster !

    Si je peux me permettre, as tu une formation dans le domaine ? si oui, laquelle ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    aucune

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

Discussions similaires

  1. [PHP 5.1] Votre avis sur mes classes de débutants
    Par arthuro45 dans le forum Langage
    Réponses: 0
    Dernier message: 17/10/2010, 08h44
  2. Utilisation de Thread sur une classe héritée
    Par Psymon dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 20/09/2010, 10h22
  3. [PHP 5.3] [POO] Classes PHP utilisables
    Par jcaspar dans le forum Langage
    Réponses: 1
    Dernier message: 09/08/2009, 01h13
  4. [php5] Votre avis sur ma classe Template
    Par cahnory dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 31/01/2009, 17h35
  5. [POO] cherche tuto simple sur les classes php
    Par single dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2008, 01h07

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