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 :

abstraction d'accès une base de donnée


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 125
    Points : 55
    Points
    55
    Par défaut abstraction d'accès une base de donnée
    Bon, déjà, je tends le bâton pour me faire frapper : je débute en POO et j'avoue que même si j'en vois l'intérêt, j'ai du mal à mettre en pratique.

    Mon but est de pouvoir avoir des classes qui me permettent de me connecter à une base, voire plusieurs base (mysql, mais ça pourrait changer) en même temps. J'ai donc lu de la "littérature" sur le multiton, qui me parait un bon candidat.

    voilà où j'en suis :
    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
     
    /**Interface Multiton*/
    abstract class ModInterface 
    {
    	public static $_instance = array();
     
    	public static function getInstance($name, $args = array()) 
    	{
    		if ( !isset(self::$_instance[$name]) ) 
    		{
    			if ( class_exists($name) ) 
    			{
    				// Création des arguments pour le constructeur de classe
    				$arglist = array();
    				for ($i = 0, $n = count($args); $i < $n; $i++) 
    				{
    					$arglist[] = '$args['.$i.']';
    				}
    				$arglist = implode(',', $arglist);
    				// Création d'une fonction temporaire pour l'instanciation de la classe
    				$new_class = create_function('$name, $args', 'return new $name('.$arglist.');');
    				define(strtoupper($name), NULL);
    				self::$_instance[$name] = $new_class($name, $args);
    			}
    		}
    		return self::$_instance[$name];
    	}
    }
     
     
    /**Classe générique de connection*/
    class Database
    {
    	private $server = ''; //nom du serveur
    	private $user = ''; //login
    	private $pass = ''; //password
    	private $database = ''; //nom de la base
     
    	public function __construct($server=null, $user=null, $pass=null, $database=null)
    	{
    		// error catching if not passed in
    		if ($server==null || $user==null || $database==null)
    		{
    			die('Les information de connection à la base doivent être passées lors de la création de l\'objet');
    		}
    		$this->server = $server;
    		$this->user = $user;
    		$this->pass = $pass;
    		$this->database = $database;
    	}
    }
     
     
    class mysql extends Database
    {
    	public function foo()
    	{
    		echo $this->user.':'.$this->pass.'@'.$this->server.' '.$this->database.'<br />';
    	}
    }
    le truc c'est que ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $server = '127.0.0.1';
    $user = 'root';
    $pass = '';
    $database = 'db1';
    $database2 = 'db2';
     
    $mysql0 = ModInterface::GetInstance('mysql', array($server, $user, $pass, $database));
    echo '<pre>';var_dump($mysql0);echo '</pre>';
    $mysql1 = ModInterface::GetInstance('mysql', array($server, $user, $pass, $database));
    echo '<pre>';var_dump($mysql0);echo '</pre>';
    $mysql2 = ModInterface::GetInstance('mysql', array($server, $user, $pass, $database2));
    echo '<pre>';var_dump($mysql2);echo '</pre>';
    j'obtiens bien le même object(mysql)#1, mais les paramètres ne sont pas pris en compte : c'est 'db1' qui est affiché 3 fois. Or je voudrais un object(mysql)#2 dans le cas de $mysql2.

    Je n'arrive pas à comprendre comment utiliser le principe d'utilisation des arguments dans ce cas, pour avoir 2 instances différentes, si les arguments sont différents.

    Merci d'avance de me dire ce qui cloche.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    Il y a un exemple d'implémentation PHP ici : http://en.wikipedia.org/wiki/Multiton_pattern

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Voici un autre extrait de code qui pourrait t'aider ici:

    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
    class connect_bdd
    {
            private static $instance = array();
     
            private function __construct($db_name)
            {
                    require_once('fichier_des_donnees_de_connexion');
     
                    // Permet de verifier que la base de donnees demandee existe
                    if( !array_key_exists($db_name, $database) )
                            throw new Exception('[connect_bdd] given database name "'.$db_name.'" is not configured');
     
                    mysql_select_db($database[$db_name], $connection);        
            }
     
            public static function getInstance($db_name)
            {
                    // Si l'instance de connexion à la base de donnees n'existe pas, creation puis ajout à la liste des instances
                    if( !array_key_exists($db_name, self::$instance) )
                    {
                            self::$instance = new connect_bdd($dbname);
                    }
     
                    return self::$instance[$db_name];
            }        
    }
     
    connect_bdd::getInstance('db1');
    connect_bdd::getInstance('db2');
    connect_bdd::getInstance('db1');

Discussions similaires

  1. [C#] Accés à une base de données AS400
    Par Green Hornet dans le forum Accès aux données
    Réponses: 8
    Dernier message: 14/11/2011, 12h26
  2. Réponses: 4
    Dernier message: 15/01/2005, 17h05
  3. Accès à une base de données ACCESS
    Par Invité dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/01/2005, 09h23
  4. [JDBC]acces à une base de données mysql
    Par sehaba dans le forum JDBC
    Réponses: 13
    Dernier message: 07/12/2004, 01h39
  5. Réponses: 2
    Dernier message: 01/10/2004, 16h13

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