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 :

Connexion à une Base de données MySQL


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    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.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Tu réalises une classe de classe , pourquoi utiliser PDO qui est un moduel Orienté Objet, comme une simple commende

    Il faut revoir ta copie je crois.
    A++
    Christele

  3. #3
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Bonjour christele_r?

    En regardant mon code, je constate que le problème vient de la méthode connect() de la classe MySQL du fichier mysql.php.

    Tu réalises une classe de classe
    En effet, la classe MySQL hérite de la classe abstraite DBfactory.

    pourquoi utiliser PDO qui est un moduel Orienté Objet, comme une simple commende
    Comment devrais-je l'utiliser?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour ma part il n'est nul besoins de mettre une requête PDO dans une fonction, justement parce qu’il est naturellement traitable comme un objet,

    1) lorsque dans une page PHP tu as une ou dix fois a utiliser SQL il te suffit de te loguer en tête de PHP et HOP c'est oublié tu appel et utilises ton pointeur autant que tu le souhaites
    2) lorsque à l' interieur du PHP tu réalises un prepare, tu peux la encore y faire référence autant que tu le souhaites !

    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
    17
    18
     
    <?php
    //====le login====
    try {
      $bdd = new PDO('mysql:host=localhost;dbname=jplyne', 'root', '');
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     }
    catch(Exception $e) {
      die('Erreur : '.$e->getMessage());
     }
    //==========ensuite ou tu veux dans ta page==========
    $req = $bdd->prepare('SELECT * FROM visiteurs');
      $req->execute();
      while ($donnees = $req->fetch())
       {
        echo "<tr><td><input type='checkbox' name='LaTbl[]' value='".$donnees['id']."'>".$donnees['id']." - ".$donnees['prenom']." - ".$donnees['nom']."</td></tr>";
       }
    ?>
    A toi de voir

  5. #5
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Merci pour cette précision, j'avais effectivement procédé de cette façon dans un autre projet.
    J'ai voulu passer par le design pattern du singleton et du factory ... mais pourquoi faire compliqué lorsque l'on peut faire simple!

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

Discussions similaires

  1. Connexion à une base de données mysql
    Par hananemeryem dans le forum JDBC
    Réponses: 1
    Dernier message: 11/11/2007, 16h34
  2. Réponses: 1
    Dernier message: 19/07/2007, 21h09
  3. Problème de connexion à une base de donnée MySQL
    Par casho dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/06/2007, 14h04
  4. connexion à une base de données mysql depuis c++
    Par btissama4 dans le forum C++
    Réponses: 4
    Dernier message: 16/02/2007, 11h55
  5. Connexion à une base de données mysql via access
    Par eautret dans le forum Access
    Réponses: 2
    Dernier message: 07/04/2006, 10h02

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