Bonjour,

En utilisant une classe abstraite avec le design pattern du singleton, j'ai conçu un script de connexion à une une Base de données MySQL.
La classe MySQL hérite de la classe abstraite DBfactory et surcharge dans son corps la méthode abstraite connect().
Cependant la connexion ne semble pas s'effectuer.

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
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
 
<?php
 
// Code permettant de se connecter à n'importe quel SGBDR dont on a définit la classe, avec 1 seul et même appel
// On instancie notre objet en lui passant en paramètre le nom de la base de données.
// N'autorise qu'une seule et unique instance de l'objet db
// Utilisation de la fonction magique __autoload()
// On crée une classe abstraite qui sera notre fabrique "factory" dont le but est d'être héritée par les classes filles
// Les classes filles seront les classes représentant un SGBDR quelconque
abstract class DBfactory {
 
    private static $getInstance;  // propriété statique qui va permettre de stocker l’unique instance de la classe.
    protected $config = array(); // Paramètres de configuration pour une base de donnée.
    public $default_cfg = array(); // Paramètres de configuration par défaut
 
    // On initialise les variables de connections et on active la connection à la base de donnée.
    // Nous mettons le constructeur en visibilité privée ce qui permet de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
    // Les paramètres de la future chaîne de connexion sont positionnés à null car ils sont modifiables
 
    private function __construct($server = null, $username = null, $password = null, $dbname = null) {
        // Les paramètres de configuration de chacune des bases de données seront stockées dans un tableau que nous appelons default_cfg
        // On lance une exception si cette variable n'est pas un tableau
        if (!is_array($this->default_cfg)) {
            throw new Exception("Vous devez remplir les paramètres de la configuration par defaut de votre base de donnée");
        }
        // On parcours notre tableau pour récupérer la valeur de chacune des clés
        foreach ($this->default_cfg as $key => $value) {
            // on stocke la clé ainsi que sa valeur dans le tableau des paramètres de configuration de la base de données
            $this->config[$key] = (isset($$key) ? $$key : $value);
        }
        unset($this->default_cfg); // On enlève les paramètres par defaut pour éviter toute confusion possible.
        $this->connect(); // On invoque la méthode de connexion qui sera définie dans les classes filles
    }
 
    // usinage : permet d'instancier la classe correcte en fonction de la base de données choisie
    // Le paramètre $type correspond à la classe (le nom de la base de données)
    public static function factory($type, $server = null, $username = null, $password = null, $dbname = null, $charset = "utf8") {
        if (class_exists($type)) { // On vérifie que la classe existe ...
            $classname = $type;
             echo 'connexion réussie avec ' . __CLASS__;
            // on retourne une instance ayant pour arguments les paramètres de configuration
            return new $classname($server, $username, $password, $dbname);
        } else { // ... sinon on lance une exception
            throw new Exception("Pas d'impl&eacute;mentation disponible pour " . $type);
        }
    }
 
    // Rappel : Singleton garantit qu’une classe n’a qu’une seule instance et fournit un point d’accès global à cette instance.
    // Voir http://design-patterns.fr/singleton
    // getInstance() est un pseudo-constructeur l'avantage est qu'il nous permet de retourner l'unique instance
    public static function getInstance() {
        // on teste si l'instance est unique
        if (!isset(self::$getInstance)) { // si l'instance est unique alors ...
            $class = __CLASS__; // on récupère le nom de la classe via la constante magique __CLASS__
            self::$getInstance = new $class; // on crée une instance de la classe et on stocke sa valeur dans cette propriété
        }
        return self::$getInstance; // on retourne la valeur de cette propriété
    }
 
    // on avertit le développeur qu'il n'a pas le droit de cloner l'objet instancié
    // puisque l'objet instancié doit être unique
    public function __clone() {
        trigger_error("Le clônage n'est pas autorisé. ", E_USER_ERROR); // trigger_error() est utilisé pour déclencher une erreur utilisateur
    }
 
    // méthodes abstraites (car une classe abstraite doit avoir au moins une méthode abstraite)
    abstract protected function connect(); // uniquement la signature de la méthode 
    abstract public function __destruct(); // uniquement la signature de la méthode 
}
 
?>

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
<?php
 
require_once 'dbfactory.php';
 
// Code permettant de se connecter à la Base de données MySQL
class MySQL extends DBfactory {
 
    // Le tableau stockant les paramètres de la chaîne de connexion
    protected $cfg_default = array(
        'host' => 'localhost',
        'username' => 'vigneron',
        'password' => 'dew46tr1564re',
        'dbname' => 'vineyard',
        // pour s'assurer de bénéficier de l'encodage des caractères en utf8
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
    );
 
    // connection à la base
    protected function connect() {
        if (isset($this->config["conn"])) { // Rappel : Penser à vérifier que la variable a été initialisée
            // On n'oublie pas de mettre tout ceci dans un bloc try{} catch() si quelque chose se passe mal
            try {
                // Construction de la chaîne de connexion
                $this->config['conn'] = new PDO(
                                $this->config['host'],
                                $this->config['username'],
                                $this->config['password'],
                                $this->config['dbname']
                );
                echo 'connexion réussie avec ' . __CLASS__;
                // on lance une exception si cela se passe mal.
                throw new Exception('Connexion à MySQL impossible : ');
            } catch (Exception $e) {
                // on attrappe cette exception
                echo $e->getMessage();
                die(); // Affiche un message et termine le script courant
            }
        }
    }
 
    // Fermeture de la base de données au moment de la destruction de la classe.
    public function __destruct() {
        $this->config['conn'] = null;
    }
 
}
 
?>

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
31
32
33
34
35
36
37
 
<?php
require_once 'core/dbfactory.php';
 
// on utilise la fonction magique __autoload pour charger automatiquement tous les fichiers de classe lorsqu'un appel est demandé.
function __autoload($classname) {
    include_once "core/" . $classname . ".php";
}
 
// il se peut que l'on ne puisse pas se connecter à la source de données (pour x ou y raisons)
// donc il indispensable d'utiliser un bloc try ... catch pour attraper et traiter l'incident 
// cf. Gestion des exceptions en PHP5
try {
    $db = DBfactory::factory("mysql", "localhost", "vigneron", "dew46tr1564re", "vineyard");
} catch (Exception $e) {
    die($e->getMessage());
}
?>
 
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="css/eltStyle.css" type="text/css" />
        <link rel="stylesheet" href="css/jquery.thumbnailScroller.css" type="text/css" />
 
        <title>Le cercle des vignobles - Carnets du vignoble</title>
    </head>
 
    <body>
        <!--<div id="bloc_page">
 
        </div>--> <!-- bloc_page-->
       <!--<div class="notice"><p>L'abus d'alcool est dangereux pour la sant&eacute;. Sachez consommer avec mod&eacute;ration.</p></div>-->
 
    </body>
</html>

En faisant des tests dans mon code, le problème vient de la surcharge de la méthode connect() dans le fichier mysql.php
Je regarde de ce côté, et je reviendrai ou pas vers vous.

Merci d'avance.
Transact.