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 :

[POO] requete sql dans une methode


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Designer API
    Inscrit en
    Octobre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Designer API

    Informations forums :
    Inscription : Octobre 2003
    Messages : 280
    Par défaut [POO] requete sql dans une methode
    Bonjour,

    Il m'arrive de faire des méthodes dans des classes contenant des requêtes. J'aimerais savoir quelle est la meilleur façon pour lui passer le pointeur de connexion. Global ? dans le constructeur ? Par une méthode ? Ou en paramètre de la ou les méthodes de la classe ?

  2. #2
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    Si lors de la création de l'instance de ta classe, tu as forcement un 'pointeur de connexion' ou ressource , tu utilises les getteurs/setteurs pour initialiser une variable (avec une portée comme tu veux Private/Protected selon l'utilisation) de ta classe contenant ce pointeur.

    Alors ton instance aura toujours une connexion ... oui mais, si cette ressource est fermé par une autre partie de script

    Donc la solution adaptée, un script (ou une combinaison) va donner un résultat web et alors ouverture d'une ressource en début de traitement et fermeture avant l'affichage (Sinon pour éviter des problèmes, une ressource pour un des ensembles de traitement etc, ...)

  3. #3
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    perso j'initialise un objet BD en début de traitement et je le refile par référence à toutes les méthode utilisatrice (je n'aime ni global ni le fonctionnement "base par défaut" ). pour le côté fermeture des connexions c'est tout géré implicitement par php, mode feignasse... sauf dans de rare cas ou j'avais une base tierce et dont je sais que je ne vais plus avoir besoin.

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Global sûrement pas, c'est une très mauvaise pratique qui va introduire du couplage inutile.

    Il te reste à choisir entre:
    • public function __construct (PDO $pdo, ...)
    • public function setConnection (PDO $pdo)
    • public static function registerConnection (PDO $pdo)
    • public function myMethod (PDO $pdo)


    Ce choix va dépendre de la forme de ta classe et surtout de son rôle: si c'est une classe modèle (donc destiné à l’interaction avec les données de la bdd) alors, il y a fort à parier que beaucoup de ses méthodes auront besoin d'une connection active, donc garder une référence sur l'instance de PDO au sein de la classe (comme propriété d'instance ou de classe, à toi de voir) est une bonne idée. L'avantage à en faire une propriété statique (avec la troisième forme) c'est que tous les objets de la classe auront cette référence sans qu'on ait besoin de leur passer, c'est moins flexible mais si tu n'utilise qu'une seule connexion à la fois, ce sera bien.
    Si au contraire ta classe est plus un métier ou un service et qu'elle n'a besoin d'effectuer des requêtes qu'occasionnellement, on peut envisager de passer l'instance PDO sur la méthode en question. Encore que la meilleure approche dans ce cas reste la délégation à une classe modèle.

    Bref, ton problème est en fait l'un des plus ardus de la conception objet (à mon sens) à savoir: comment répartir les responsabilités entre nos classes. Il faut toujours faire attention à ne pas créer une galaxie de classes minimaliste qui n'ont plus vraiment de pertinence et il ne faut pas non plus créer des classes "couteau-suisse" faisant presque tout. Il faut avant tout que ce soit cohérent.

  5. #5
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    Par défaut
    Pour aller encore plus loin dans le découplage, on peut utiliser le design pattern "data mapper", qui est le principe fondateur de l'ORM Hibernate en java et de l'ORM Doctrine 2 en PHP :
    • Les classes modèles (entités) ignorent complètement l'aspect persistance, donc pas d'accès à un quelconque objet de connexion à la base ! Elles ne font "que" gérer leurs attributs (correspondant aux colonnes des tables en base) et méthodes métier.
    • Les modèles peuvent être persistés et récupérés via une classe "repository", qui est la seule à avoir une connexion avec la base.

    http://docs.doctrine-project.org/pro...g-started.html

    Cette méthode, bien que semblant peu naturelle au premier abord, est pourtant une bonne pratique qui sépare la persistance du métier. On peut ainsi imaginer de changer complètement l'aspect persistance des données d'une appli en modifiant uniquement les repositories : non seulement passer d'un moteur de DB à un autre, mais aussi passer à un stockage xml ou bien à un webservice ! Tout cela en laissant intactes les classes de la couche métier.

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

Discussions similaires

  1. Envoi d'une valeur d'une requete sql dans une variable ?
    Par olivierc25 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/04/2007, 14h11
  2. [MySQL] Requetes SQL dans une boucle PHP
    Par Siteac dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2006, 15h35
  3. Réponses: 3
    Dernier message: 18/06/2006, 00h15
  4. Importer valeur requete SQL dans une Requete
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/03/2006, 15h24
  5. Recuperer un enregistrement de requete SQL dans une variable
    Par kleenex dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/09/2005, 16h59

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