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 :

Gestion des erreurs et gestionnaire de connexions [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut Gestion des erreurs et gestionnaire de connexions
    Bonjour à tous !

    Avant de débuter, désolé pour le titre, je suis demeuré 2 minutes le curseur dans la case et j'ai pas trouvé plus explicite.


    Bon, ce qui m'amène à vous.

    Le contexte:
    J'ai un site, qui est un jeu, avec des centaines d'actions possibles. Chaque action est en fait une simple classe, avec une méthode statique qui reçoit les objets requis en référence.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Member_Action_Perso_Soigner {
     
    	public static function generatePage(&$tpl, &$db, &$session, &$account, &$perso)
     
    	{
    Jusque là, "ca va" (enfin, à mes yeux ca va)

    Là ou ca se corse, c'est au sujet de $db:
    $db est en fait une Classe qui s'occupe de gérer les rapports d'erreurs et les diverses statistiques, sans trop me compliquer l'utilisation normale le mysql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result = $db->query('SELECT......');
    Cette syntaxe est simple à utilisée, et si jamais une requête plante, ma classe s'occupe de m'envoyer un email toute seule (par exemple).
    Bref, elle m'est très pratique. Et je vous l'explique pour ne pas que vous me disiez qu'elle est inutile

    Le souci:
    Mon action soigner interagi avec des $perso, qui représente un personnage: Dans ce cas-ci, nous avons $perso (Le joueur), et le soigné, qui est instancié dans la méthode statique, afin de lui prodiguer les soins.

    Si je veux changer les points de vie du personnage, j'ai un code qui ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $victime->setPV($db, 34);
    $perso->gainXP($db, 'soin', 3);
    Et c'est là que je trouve mes classes "intanciables" (Perso, Lieu, Item, etc.) peu intuitive d'utilisation: Parfois il faut passer &db, parfois non. Ce n'est pas toujours aussi évident que dans cet exemple. J'aimerais retirer complètement la nécessité de passer $db à ces méthodes.

    Contraintes:
    #1: J'ai besoin d'accéder à 2 bases de données : pas de singleton (à priori).
    #2: J'aimerais utiliser une bonne pratique, et pas une solution tordue.
    #3: Je pense éventuellement à implémenter PDO. La solution ne devra pas poser de problème d'évolution à ce niveau.


    Mes solutions:

    #1:
    Passer par référence $db au constructeur de chaque objet qui pourrait en avoir besoin. Les objet stockeraient $db. (toujours par référence). Les méthodes pourrait donc faire $this->db->query(....);

    Avantage: Je n'ai plus à passer $db dans les paramètres de mes méthodes d'objet
    Désavantage: Je dois encore passer $db à mes actions (statique), car parfois l'action instancie de nouveau personnages, ou des objets d'usage système.

    #2:
    global $db;

    Avantage: Cool, il est partout
    Désavantage: Contrainte #2: Il me semble que ce n'est pas une bonne pratique.

    #3:
    Créer une classe singleton qui gère des instances de $db.
    Son usage ressemblerait à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Dans ma page index.php:
    $dbs = new DbSingleton();
    $dbs->newDb('connexion1', HOST, BASE, USER, PASS); //Créer une classe $db, contenu dans un array du singleton ( $this->arrDb['connexion1'] = new MySQLdb(...); )
     
    //Dans une méthode quelconque:
    $dbs = new DbSingleton(); //Retourne l'instance du singleton existant
    $db = $dbs->getConnexion('connexion1'); //Retourne l'objet $db par référence
    $db->query(...);

    Avantage: Cool, il est partout (enfin je crois, j'ai pas souvent utilisé de singleton)
    Désavantage: Contrainte #2: Ca me semble tordu.


    Bon, je doute d'avoir réussit à être clair, alors si vous avez des questions, n'hésitez pas. Et je sais que je ne dois pas être le premier à avoir fait face à ce problème, peut-être pourrez-vous m'éclairer sur la meilleure approche ?

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 439
    Points : 15 813
    Points
    15 813
    Par défaut
    Citation Envoyé par FMaz Voir le message
    #3:
    Créer une classe singleton qui gère des instances de $db.
    j'utilise souvent cette solution avec une petite différence par rapport à ton code : la connexion ce fait au moment de la création du singleton et pas dans le fichier index.php

  3. #3
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Ha voilà qui me rassure !

    Si tu gère la connexion directement dans le constructeur du singleton, comment fais-tu pour instancier plus d'une connexion ? (de façon dynamique)

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 439
    Points : 15 813
    Points
    15 813
    Par défaut
    Citation Envoyé par FMaz Voir le message
    Ha voilà qui me rassure !

    Si tu gère la connexion directement dans le constructeur du singleton, comment fais-tu pour instancier plus d'une connexion ? (de façon dynamique)
    pour ça je stocke les informations de connexion dans la configuration et pas dans le code
    et j'utilise 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
    class BDD
    {
        public static function obtientConnexion($nomConnexion)
        {
            if (!isset(self::$tabConnexion[$nomConnexion])) {
                self::$tabConnexion[$nomConnexion] = new BDD($nomConnexion);
            }
     
            return self::$tabConnexion[$nomConnexion];
        }
     
        private function __construct($nomConnexion)
        {
            // recherche de la configuration pour $nomConnexion
     
            // connexion
     
        }
     
        private static $tabConnexion;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $bdd1 = BDD::obtientConnexion('bdd1');
    $bdd1->requete('...');
     
    $bdd2 = BDD::obtientConnexion('bdd2');
    $bdd2->requete('...');
     
    $bdd1->requete('...');

  5. #5
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Très pertinent,

    merci beaucoup, ce sera sans aucun doute mis en pratique très bientôt

  6. #6
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Je met en résolu, mais tu serais pas mieux de faire:

    return &self::$tabConnexion[$nomConnexion];


    ... car la ton return va créer une nouvelle variable pour stocker ton objet en mémoire à chaque fois que tu le retourne ... non ?

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

Discussions similaires

  1. Gestion des erreurs de connexion sur Android
    Par khaledfayala dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 22/02/2012, 15h53
  2. [Oracle] [PHP] Gestion des erreurs de connexion
    Par Mimo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/06/2006, 02h17
  3. [VB6 + Mysql]Gestion des erreurs de connexion
    Par Deejoh dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/01/2006, 21h01
  4. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 18h19
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 23h41

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