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

PHP & Base de données Discussion :

POO + CLASS et connection SQL pour les getter et setter


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 379
    Points : 358
    Points
    358
    Par défaut POO + CLASS et connection SQL pour les getter et setter
    Bonjour à tous,
    J'ai une question de bonne pratique.
    mes connaissances: POO (C++ C#), procedural (PHP)
    Je souhaite créer des classes liés à ma bdd (mysql).
    Quels sont les bonnes pratiques?

    Je souhaiterais créer une class php par table sql.
    J'avais donc comme idée de communiquer à chaque get et set avec ma bdd
    Comment dois-je donc faire du coup au niveau de la gestion de connection sql? car me connecter à chaque get set puis me déconnecter me semble lourd.

    De quels manière fonctionneriez vous?
    Question supplémentaire je n'ai pas très bien compris si il est finalement possible de créer plusieurs constructeurs pour une même class en PHP? et Si non pourquoi ne l'ont t'il pas implémenté?

    Merci d'avance pour votre aide

    Ajout:
    Faudrait-il le faire comme ça?
    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
    24
    25
    26
    27
    28
    29
    30
    class ana_liste
    {
        private $_suffixe;
        private $_nomAction;
     
        public get_suffixe(){
            return $_suffixe;
        }
     
        public get_suffixe(string $nom){
            // demander à sql suffixe depuis nomAction
            return $result;
        }
     
        public get_nomAction(){
            return $_nomAction
        }
     
        public get_nomAction(int $val){
            //demander à sql nomAction depuis suffixe
            return $_nomAction
        }
     
        public set_nomAction(string $nom){
            if($suffixe){
                //demander à sql mettre nom_action depuis suffixe
                return $result;
            }
        }    
    }

    Modification => [...] car me connecter à chaque get construct ou set puis me déconnecter me semble lourd.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    Quels sont les bonnes pratiques?
    Il y'a 2 écoles :

    Celle que j'utilise , c'est de créer une classe par table. Cette classe ne représente pas un objet de la table. Elle permet en revanche d'agir sur la table.
    Par exemple :
    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
    class UserDB extends BaseModel
    {
     
        public function __construct($db)
        {
            parent::__construct($db);
    		$this->table = 'users';
        }
     
    	public function getUsersByName(string $name): array {
     
    	}
     
    	public function save(array $users) {
    	}
    }
    D'un point de vue purement conceptuel ce n'est l'idéal. Mais dans les faits c'est très flexible et rapidement mis en oeuvre.

    L'autre solution qui est conceptuellement plus juste , mais aussi plus lourde à mettre en place et utiliser c'est :
    Une classe qui représente un enregistrement de ta table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class User
    {
    	private $id;
    	private $email;
    	private $password
    }
    Et ensuite une classe d’interaction avec la table qui ne prend en paramètre et retourne que des type de ta classe précédente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class UserDB
    {
    	private save(User $user);
    	private findById(int $id) : User;
    }
    C'est comme ca que fonctionne la plus part des framework , il se base sur des ORM qui map ta bdd vers une classe. Tu peux d'ailleurs tout à fait utiliser un ORM en tant que librairie de ton projet si ca te plait (disclaimer les performances en prennent un gros coup).

    J'avais donc comme idée de communiquer à chaque get et set avec ma bdd
    Comment dois-je donc faire du coup au niveau de la gestion de connection sql? car me connecter à chaque get set puis me déconnecter me semble lourd.
    En général on instancie une connexion à la bdd par script et la connexion se ferme en fin de script.Sauf cas très particulier on ne garde pas de connexion permanente.
    C'est dans les faits plus efficaces, car ton script s'execute quelques milliseconde , et donc la bdd ne conserve un thread et une connexion que pendant ce temps là. Cequi fait que avec une bdd qui autorise une seule connexion tu peux avoir plusieurs visiteurs "simultané" alors que ca ne serait pas possible avec une connexion persistante.

    Question supplémentaire je n'ai pas très bien compris si il est finalement possible de créer plusieurs constructeurs pour une même class en PHP? et Si non pourquoi ne l'ont t'il pas implémenté?
    Pas possible. Tu peux contourner un peu le problème en utilisant func_get_arg mais tu n'auras pas du polymorphisme cmme tu peux le rencontrer en C++ ou C#
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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,
    Citation Envoyé par Sparky95 Voir le message
    me connecter à chaque get construct ou set puis me déconnecter me semble lourd.
    je ne comprends pas cette partie.

    En PHP, tu peux très bien avoir une représentation abstraite de ta table sous forme de classe. Dans ce cas, je pense aussi qu'il va te falloir envisager une représentation abstraite de chaque type de donnée (VARCHAR, INTEGER, DATE...) pour profiter pleinement des possibilité de validation automatiques des valeurs utilisateur qu'un système de cet acabit devrait naturellement fournir, sinon cela n'a aucune utilité.

    Enfin, en PHP tu n'as le droit qu'à un seul et unique constructeur aucune surcharge n'est possible et les redéfinitions sont hyper restrictives.

    Pour la connexion, tiens regarde mon blog : PDOPlusPlus, il y a de quoi te mettre en appétit

  4. #4
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 379
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    je ne comprends pas cette partie.
    En claire j'avais imaginé un système de constructeurs polymorphiques mais visiblement en php ce n'est pas possible.
    Et donc l'idée aurait été de créer un constructeur qui prennent par exemple l'id en param recherches dans la bdd la ligne et insere dans les différentes variables de l'objet les données.
    Idem pour le setter ex. on auraient une class utilisateur ou l'on édit le nom, lorsqu'on appellerait utilisateur.setNom('michel') le setter demanderait à la bdd de modifier le nom et d'insérer michel à l'id correspondante.

    Et pour les connections bdd je le fais déjà en procédural, à vous de me dire si c'est dégueulasse et dangereux mais actuellement j’initialisais la connection à la bdd la premiere fois qu'on rentraient dans ma fonction de select et je tapais la connection pdo dans une $_session et avant la fin du script je détruisais cette $_session

  5. #5
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 379
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par grunk Voir le message
    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
    class UserDB extends BaseModel
    {
     
        public function __construct($db)
        {
            parent::__construct($db);
            $this->table = 'users';
        }
     
        public function getUsersByName(string $name): array {
     
        }
     
        public function save(array $users) {
        }
    }
    Pour cette manière quand gère tu la connection,.. dans chaque méthode?
    Comment gère tu le système de login?
    Tu appel une fonction, gère la connection dans ton constructeur ou la connection se fait dans ta class parente? (BaseModel)
    Puis tu appel le logout dans ton destructeur/destructeur du parent?

    J'imagines qu'une partie de la réponse se trouves à la ligne 6 mais je ne suis pas sur de l'avoir comprise alors


    Ajout: haaa non je penses avoir compris vous créez une méthode import export peut-être?

  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
    le système que tu imagines avec autant de mises à jour de la table que de modifications n'est pas approprié au monde PHP et au web en général.
    Il est préférable de regrouper toutes les données à mettre à jour et ensuite le faire qu'en une seule fois.

    Après, il y a un autre aspect important c'est la validation des données avant de les envoyer à la base de données. C'est un travail très redondant, il est préférable de le faire côté PHP et essayer tant bien que mal de ne présenter à la persistance que des données valides. Ainsi les seules erreurs que tu vas récupérer seront de l'ordre de l'intégrité (duplications, contraintes externes...).

  7. #7
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 379
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    le système que tu imagines avec autant de mises à jour de la table que de modifications n'est pas approprié au monde PHP et au web en général.
    Il est préférable de regrouper toutes les données à mettre à jour et ensuite le faire qu'en une seule fois.
    Oui effectivement je ne sais pas pourquoi je suis partis dans un update temps réel,... une fois tout fini, il vaut mieux avoir 2 methodes import et export.
    ça va merci beaucoup je vois déjà mieux pourquoi ça me choquait

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    Pour cette manière quand gère tu la connection,.. dans chaque méthode?
    Comment gère tu le système de login?
    Tu appel une fonction, gère la connection dans ton constructeur ou la connection se fait dans ta class parente? (BaseModel)
    Puis tu appel le logout dans ton destructeur/destructeur du parent?

    J'imagines qu'une partie de la réponse se trouves à la ligne 6 mais je ne suis pas sur de l'avoir comprise alors


    Ajout: haaa non je penses avoir compris vous créez une méthode import export peut-être?
    Comme tu l'as vu à la ligne 6 j'injecte la connexion à la base de données dans les classe qui en on besoin. Donc ma connexion est créer ailleurs (dans un service , un controller , peut importe) , puis injecté dans la classe ce qui lui donne la capacité de faire des requêtes.
    Ce n'est pas le rôle de ce genre de classe de se soucier de la connexion à la bdd.

    La classe mère BaseModel est juste là pour imposer certains comportement aux classes filles (par exemple obligation d'avoir une methode save()) , le stockage de l'instance de la bdd , des méhodes commune à tous mes models , etc
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/03/2016, 11h21
  2. Changer le refactor pour les getters and setters
    Par chezlui dans le forum NetBeans
    Réponses: 2
    Dernier message: 05/12/2011, 10h21
  3. méthode sans sql pour les doublons
    Par pat1545 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/08/2006, 20h29
  4. Requêtes SQL pour les Dates et numériques
    Par Ramage03 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2006, 17h26
  5. [ODBC] erreur SQL pour les unions qui renvoient vide
    Par fabriceMerc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/11/2003, 11h06

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