Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE DE CONNEXION À UNE BASE DE DONNÉE MYSQL


Information sur la source

Description

Voila c'est la toute premiere source que je poste, j'ai fait cette classe pour commencer la programmation objet en PHP, j'ai voulu respecter le design pattern Singleton. J'aimerais avoir le maximum d'avis sur le code ( proposez des optimisations possible, me signaler des maladroitesses de programmation) et sur la conception (respect du Singleton, utilisation de la notion d'objets).
Je penseque le code est assez documenté mais si vous avez des questions n'hesitez pas à meles posez.
Merci
Zefyre
 

Source

  • <?php
  • /*
  • *
  • * Auteur: Zefyre
  • *
  • * Fichier: connexion.php
  • *
  • * Date: 24 mar. 07
  • *
  • */
  • class Connexion {
  • /**
  • * *La classe Connexion permet lors d'une instanciaction de créer une connexion a une base de données, à partir d'un nom d'hote(serveur), un nom d'utilisateur et d'un mot de passe de selecionner la base d'étude et de détruire la connexion. Pour s'assurer qu'une seule connection est établie à la base on déclare le constructeur de la classe privé et l'unique facon de créer un objet et d'utiliser la seule méthose public getConnection qui verifie l'unicité de la connection ce schema s'inspire du pattern Singleton dessiné en uml:
  • */
  • /* |+++++++++++++++++++|
  • | Singleton |
  • |+++++++++++++++++++|
  • | -instance: |
  • | Connection |
  • | (static) |
  • | |
  • |+++++++++++++++++++|
  • | -Singleton() |
  • | +getInstance() |
  • | (static) |
  • |+++++++++++++++++++|
  • */
  • /**
  • * Une connection est definie par:
  • * -Un identifiant de connexion (id)
  • * -Un nom de serveur (host)
  • * -Un nom d'utilisateur (user)
  • * -Un mot de passe (pass)
  • * -Une base visée (base)
  • * -Une instance de Connexion (instance)
  • *
  • */
  • /**
  • * *L'identifiant de connexion
  • */
  • private $id;
  • /**
  • * *Le nom d'hote
  • */
  • private $host;
  • /**
  • * *Le nom d'utilisateur
  • */
  • private $user;
  • /**
  • * *Le mot de passe
  • */
  • private $pass;
  • /**
  • * *Le nom de de la base d'etude
  • */
  • private $base;
  • /**
  • * *Une instance static de Connexion
  • */
  • private static $instance;
  • /**
  • * *Constructeur de la classe Connexion
  • */
  • private function __construct($host, $user, $pass, $base)
  • {
  • $this->setHost($host); //Les differents setter
  • $this->setUser($user); //Methodes permettant l'acces en erciture des variables
  • $this->setPass($pass);
  • $this->setBase($base);
  • try {
  • $this->id = $this->connect($this->host, $this->user, $this->pass);
  • } //Tentative de connexion à la base
  • catch (Exception $e) { // Gestion de l'exception
  • header("Location:./erreur.php?erreur='" . $e->getMessage() . "'&code='1'"); //Redirection et affichage du message, du fichier et de la ligne d'origine de l'exception
  • // DEBUGAGE echo $e->getMessage().'<br>Fichier: '.$e->getFile().'<br>Ligne: '.$e->getLine();
  • }
  • try {
  • $this->selection($base, $this->id);
  • } //Tentative de selection de la base
  • catch (Exception $e) {
  • header("Location:./erreur.php?erreur='" . $e->getMessage() . "'&code='1'");
  • // DEBUGAGE echo $e->getMessage().'<br>Fichier: '.$e->getFile().'<br>Ligne: '.$e->getLine();
  • }
  • }
  • /**
  • * *Permet de modifier la valeur de la variable host
  • */
  • private function setHost($host)
  • {
  • if (!isset($host)) // test si lavariable est initialisé
  • header("Location:./erreur.php?erreur='serveur_vide'&code='1'"); //Si non -> redirection
  • else
  • $this->host = $host; //Si oui affectation
  • }
  • /**
  • * *Permet de modifier la valeur de la variable user
  • */
  • private function setUser($user)
  • {
  • if (!isset($user))
  • header("Location:./erreur.php?ereur='user_vide'&code='1'");
  • else
  • $this->user = $user;
  • }
  • /**
  • * *Permet de modifier la valeur de la variable pass
  • */
  • private function setPass($pass)
  • {
  • if (!isset($pass))
  • header("Location:./erreur.php?erreur='pass_vide'&code='1'");
  • else
  • $this->pass = $pass;
  • }
  • /**
  • * *Permet de modifier la valeur de la variable base
  • */
  • private function setBase($base)
  • {
  • if (!isset($base))
  • header("Location:./erreur.php?erreur='base_vide'&code='1'");
  • else
  • $this->base = $base;
  • }
  • /**
  • * *Permet de selectionner une base
  • */
  • private function selection ($base, $db)
  • {
  • $ret = mysql_select_db($base, $db); //fonction de selection PHP
  • if (isset($ret) && empty($ret)) // Test si le code de retour de la fonction est existant et vide
  • throw new Exception("selection_base_impossible"); //Gestion de l'erreur
  • return $ret;
  • }
  • /**
  • * *Permet de se connecter a la base de données MySQL
  • */
  • private function connect($host, $user, $pass)
  • {
  • $ret = mysql_connect($host, $user, $pass) or die(); //fonction de connexion a la base
  • if (isset($ret) && empty($ret))
  • throw new Exception("connexion_base_impossible");
  • return $ret;
  • }
  • /**
  • * *Permet d'obtenir une instance de Connection
  • */
  • public static function getConnexion($host, $user, $pass, $base)
  • {
  • if ((!isset($instance))) // Si aucune instance de Connexion
  • $instance = new Connexion($host, $user, $pass, $base); //Alors on en créer une
  • return $instance; //Dans tous les cas on retourne une instance (soit la nouvelle soit l'existante)
  • }
  • /**
  • * *Execute une requete SQL qui ne ne retourne aucun resultat (INSERT,UPDATE,DELETE).
  • */
  • public function execute($requete)
  • {
  • if (!isset($this->id) && empty($this->id)) // Test si une connexion existe si elle n'existe pas
  • $this->getConnexion($host, $user, $pass, $base); //on essaye dans créer une.
  • else {
  • if (!isset($requete) && empty($requete))
  • header("Location:./erreur.php?erreur='requete_invalide'&code='1'");
  • else {
  • try {
  • mysql_query($requete) or die("Erreur" . mysql_error());
  • }
  • catch(Exception $e) {
  • header("Location:./erreur.php?erreur='requete_impossible'&code='1'");
  • }
  • }
  • }
  • }
  • /**
  • * *Retourne le nombre de lignes affectées par la dernière opération SQL.
  • */
  • public function getNbLignes()
  • {
  • if (!isset($this->id) && empty($this->id)) // Test si une connexion existe si elle n'existe pas
  • $this->getConnexion($host, $user, $pass, $base); //on essaye dans créer une.
  • else
  • return mysql_affected_rows($this->id); //On retourne le nombre de lignes
  • }
  • /**
  • * *Retourne le resultat brut d'une selection
  • */
  • public function select($req)
  • {
  • if (!isset($this->id) && empty($this->id)) // Test si une connexion existe si elle n'existe pas
  • $this->getConnexion($host, $user, $pass, $base); //on essaye dans créer une.
  • else {
  • if (!isset($req) && empty($req))
  • header("Location:./erreur.php?erreur='requete_invalide'&code='1'");
  • else {
  • try {
  • $resultat = mysql_query($req);;
  • }
  • catch(Exception $e) {
  • header("Location:./erreur.php?erreur='requete_impossible'&code='1'");
  • }
  • return $resultat;
  • }
  • }
  • }
  • /**
  • * *Destructeur de la classe Connection
  • */
  • public function __destruct()
  • {
  • if ( !isset($this->instance) && empty($this->instance)) //On ne détruit l'instance que si elle existe
  • {
  • try
  • {
  • mysql_close($this->id);
  • }
  • catch(Exception $e)
  • {
  • header("Location:./erreur.php?erreur='fermeture_impossible'&code='1'");
  • }
  • }
  • else
  • header("Location:./erreur.php?erreur='fermeture_impossible'&code='1'");
  • }
  • }
  • ?>
<?php
/*
 *
 * Auteur: Zefyre
 *
 * Fichier: connexion.php
 *
 * Date: 24 mar. 07
 *
 */

class Connexion {
    /**
     * *La classe Connexion permet lors d'une instanciaction de créer une connexion a une base de données, à partir d'un nom d'hote(serveur), un nom d'utilisateur et d'un mot de passe de selecionner la base d'étude et de détruire la connexion. Pour s'assurer qu'une seule connection est établie à la base on déclare le constructeur de la classe privé et l'unique facon de créer un objet et d'utiliser la seule méthose public getConnection qui verifie l'unicité de la connection ce schema s'inspire du pattern Singleton dessiné en uml:
     */
    /*	|+++++++++++++++++++|
		|  Singleton  		|
		|+++++++++++++++++++|
		|  -instance: 		|
		|  Connection 		|
		|  (static)   	   	|
		|             	   	|
		|+++++++++++++++++++|
		| -Singleton()		|
		| +getInstance()    |
		|   (static)       	|
		|+++++++++++++++++++|

*/
    /**
     * Une connection est definie par:
     * -Un identifiant de connexion (id)
     * -Un nom de serveur (host)
     * -Un nom d'utilisateur (user)
     * -Un mot de passe (pass)
     * -Une base visée (base)
     * -Une instance de Connexion (instance)
     *
     */

    /**
     * *L'identifiant de connexion
     */
    private $id;
    /**
     * *Le nom d'hote
     */
    private $host;
    /**
     * *Le nom d'utilisateur
     */
    private $user;
    /**
     * *Le mot de passe
     */
    private $pass;
    /**
     * *Le nom de de la base d'etude
     */
    private $base;
    /**
     * *Une instance static de Connexion
     */
    private static $instance;

    /**
     * *Constructeur de la classe Connexion
     */
    private function __construct($host, $user, $pass, $base)
    {
        $this->setHost($host); //Les differents setter
        $this->setUser($user); //Methodes permettant l'acces en erciture des variables
        $this->setPass($pass);
        $this->setBase($base);

        try {
            $this->id = $this->connect($this->host, $this->user, $this->pass);
        } //Tentative de connexion à la base
        catch (Exception $e) { // Gestion de l'exception
            header("Location:./erreur.php?erreur='" . $e->getMessage() . "'&code='1'"); //Redirection et affichage du message, du fichier et de la ligne d'origine de l'exception
            // DEBUGAGE echo $e->getMessage().'<br>Fichier: '.$e->getFile().'<br>Ligne: '.$e->getLine();
        }

        try {
            $this->selection($base, $this->id);
        } //Tentative de selection de la base
        catch (Exception $e) {
            header("Location:./erreur.php?erreur='" . $e->getMessage() . "'&code='1'");
            // DEBUGAGE echo $e->getMessage().'<br>Fichier: '.$e->getFile().'<br>Ligne: '.$e->getLine();
        }
    }

    /**
     * *Permet de modifier la valeur de la variable host
     */
    private function setHost($host)
    {
        if (!isset($host)) // test si lavariable est initialisé
            header("Location:./erreur.php?erreur='serveur_vide'&code='1'"); //Si non -> redirection
        else
            $this->host = $host; //Si oui affectation
    }

    /**
     * *Permet de modifier la valeur de la variable user
     */
    private function setUser($user)
    {
        if (!isset($user))
            header("Location:./erreur.php?ereur='user_vide'&code='1'");
        else
            $this->user = $user;
    }

    /**
     * *Permet de modifier la valeur de la variable pass
     */
    private function setPass($pass)
    {
        if (!isset($pass))
            header("Location:./erreur.php?erreur='pass_vide'&code='1'");
        else
            $this->pass = $pass;
    }

    /**
     * *Permet de modifier la valeur de la variable base
     */
    private function setBase($base)
    {
        if (!isset($base))
            header("Location:./erreur.php?erreur='base_vide'&code='1'");
        else
            $this->base = $base;
    }

    /**
     * *Permet de selectionner une base
     */
    private function selection ($base, $db)
    {
        $ret = mysql_select_db($base, $db); //fonction de selection PHP
        if (isset($ret) && empty($ret)) // Test si le code de retour de la fonction est existant et vide
            throw new Exception("selection_base_impossible"); //Gestion de l'erreur
        return $ret;
    }

    /**
     * *Permet de se connecter a la base de données MySQL
     */
    private function connect($host, $user, $pass)
    {
        $ret = mysql_connect($host, $user, $pass) or die(); //fonction de connexion a la base
        if (isset($ret) && empty($ret))
            throw new Exception("connexion_base_impossible");
        return $ret;
    }

    /**
     * *Permet d'obtenir une instance de Connection
     */
    public static function getConnexion($host, $user, $pass, $base)
    {
        if ((!isset($instance))) // Si aucune instance de Connexion
            $instance = new Connexion($host, $user, $pass, $base); //Alors on en créer une
        return $instance; //Dans tous les cas on retourne une instance (soit la nouvelle soit l'existante)
    }

    /**
     * *Execute une requete SQL qui ne ne retourne aucun resultat (INSERT,UPDATE,DELETE).
     */
    public function execute($requete)
    {
        if (!isset($this->id) && empty($this->id)) // Test si une connexion existe si elle n'existe pas
            $this->getConnexion($host, $user, $pass, $base); //on essaye dans créer une.
        else {
            if (!isset($requete) && empty($requete))
                header("Location:./erreur.php?erreur='requete_invalide'&code='1'");
            else {
                try {
                    mysql_query($requete) or die("Erreur" . mysql_error());
                }
                catch(Exception $e) {
                    header("Location:./erreur.php?erreur='requete_impossible'&code='1'");
                }
            }
        }
    }

    /**
     * *Retourne le nombre de lignes affectées par la dernière opération SQL.
     */
    public function getNbLignes()
    {
        if (!isset($this->id) && empty($this->id)) // Test si une connexion existe si elle n'existe pas
            $this->getConnexion($host, $user, $pass, $base); //on essaye dans créer une.
        else
            return mysql_affected_rows($this->id); //On retourne le nombre de lignes
    }

    /**
     * *Retourne le resultat brut d'une selection
     */
    public function select($req)
    {
        if (!isset($this->id) && empty($this->id)) // Test si une connexion existe si elle n'existe pas
            $this->getConnexion($host, $user, $pass, $base); //on essaye dans créer une.
        else {
            if (!isset($req) && empty($req))
                header("Location:./erreur.php?erreur='requete_invalide'&code='1'");
            else {
                try {
                    $resultat = mysql_query($req);;
                }
                catch(Exception $e) {
                    header("Location:./erreur.php?erreur='requete_impossible'&code='1'");
                }
                return $resultat;
            }
        }
    }

    /**
     * *Destructeur de la classe Connection
     */
    public function __destruct()
	{
		if ( !isset($this->instance) && empty($this->instance))	//On ne détruit l'instance que si elle existe
			{
						try
				{
				mysql_close($this->id);
				}
				catch(Exception $e)
				{
				header("Location:./erreur.php?erreur='fermeture_impossible'&code='1'");
				}
			}
		else
		header("Location:./erreur.php?erreur='fermeture_impossible'&code='1'");
	}
}

?>

Commentaires et avis

signaler à un administrateur
Commentaire de neigedhiver le 04/05/2007 07:10:49

Salut,

Je n'ai eu que le temps de survoler.
Je vais te faire la même remarque que celle qu'on m'a faite pour ma premièr base : c'est dommage qu'il n'y ait pas d'abstraction et que tu te cantonnes à MySQL...

Sinon, ça a l'air très propre et clair.

Je tâcherai de regarder plus en détail ce soir.

signaler à un administrateur
Commentaire de garfield90 le 04/05/2007 09:42:00

un peu plus d'abstraction aurait sympa.
pourquoi garde tu en mémoire name, host, user et pass.

Tu ne dois pas faire de redirection dans ta classe.

fait simplement un throw new Exception( 'message ');

et quand tu appeles ta fonction (hors classe);

try{
   $sql = Connexion::getConnexion($n,$f,$d,$s);
}catch(Exception $e){
   $e->getMessage();
}

signaler à un administrateur
Commentaire de exar le 04/05/2007 12:39:39

D'accord avec les deux premiers commentaires, mais c'est déjà vraiment pas mal.

signaler à un administrateur
Commentaire de webdeb le 04/05/2007 13:37:07

Ce n'est pas si mal. Le code est propre et soigné. Présence des attributs privés, des setters, getters et d'un singleton. Néanmoins il manque des méthodes pour récupérer les résultats sous différentes formes (array, row, assoc, object) et la gestion des erreurs devrait être plus poussée.

Malgré tout ça reste un code d'une bonne qualité. Je te mets 8/10 ;)

Je suis entrain d'écrire ma classe d'abstraction de BDD qui se base sur le principe de PDO. J'espère que je pourrais vous en faire part très prochainement ici :)

signaler à un administrateur
Commentaire de FhX le 06/05/2007 17:10:56

#  public static function getConnexion($host=null, $user=null, $pass=null, $base=null)
# {
# if ((!isset($instance))) // Si aucune instance de Connexion
# $instance = new Connexion($host, $user, $pass, $base); //Alors on en créer une
# return $instance; //Dans tous les cas on retourne une instance (soit la nouvelle soit l'existante)
# }

Pour t'éviter de faire à chaque fois :
maclasse::getConnexion('host', 'user', 'passwd', 'basename');
Alors qu'un simple :
maclasse::getConnexion(); peut suffir :)

signaler à un administrateur
Commentaire de masternico le 10/05/2007 01:58:36

J'aime bien l'idée de récuperer les erreurs. Il va faloir que j'intègre ça à mon propre source (en fait, qui n'a pas dejà fait son propre petit script de connexion mysql??? ;)
Par contre, abstraction, connais pas... ça marche en php4?

signaler à un administrateur
Commentaire de codefalse le 11/05/2007 10:52:45 administrateur CS

@Masternico : En php4, d'après ce que j'en ai entendu parler, tu ne peux pas vraiment faire de classes abstraites, mais tu peux tenter quelque chose qui s'y rapproche, mais ce sera quand meme plus utile et agréable a l'usage (et surtout à la maintenance) de la faire en php5.

@Zefyre : Quelque chose qui aurait été interessant (vraiment un truc tout banal :p), c'est de mettre l'url de redirection (le fichier erreur.php) dans une variable privée, comme ca on a juste a changer une valeur si la page change. Après c'est pas une grosse modification ! :)

signaler à un administrateur
Commentaire de aeterna le 13/01/2009 00:23:33

Bonjour et meilleurs voeux. Je mets tout doucement à la POO et j'aurai aimer savoir à quoi sert concrètement une classe de connexion. Qu'est-ce qui la diffère d'une connexion procédurale et si une âme charitable pouvait m'éclairer via un exemple d'utilisation comme par exemple l'authentification via login et mot de passe qui serait issue d'une classe utilisateur avec l'utilisation des sessions. C'est jouable ? Merci de votre aide. Cordialement, aeterna.

signaler à un administrateur
Commentaire de web2004 le 27/01/2009 11:17:15

c'est bien beau mais ton singleton ne fonctionne pas correctement !!! il insctancie plusieurs fois meme lorsque ton objet existe déja !!! je suppose que tu t'en es rendu compte sinon suffit de tester cette boucle pour s'en apercevoir :
$sql = Connexion::getConnexion('localhost','root','','em');
for($i=0; $i<10; $i++) {
$cnx = Connexion::getConnexion('localhost','root','','em');
echo '<pre>';
var_dump($cnx);
echo '</pre>';
}

pour plus de lisiblité ajouter un message "instance n'existait pas" et "instance existait déja" dans ta méthode getConnextion tu verras mieux.

bonne continuation

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Classe Connexion.php la plus simple possible .... [ par Tartuffe245 ] Bonjour à tous,J'ai créé une classe connexion pour mon site internet et il se trouve que j'ai une erreur qui revient souvent mais je ne sais pas comme PB de connexion à mysql depuis serveur apache sur mac [ par inaden ] Bonjour,voilà je suis sur mac os x 10.5.6. Le serveur apache fonctionne bien et j'ai, depuis peu, essayé d'installer mySQL sur la machine. Jusque là t php:aider moi(valider pseudo et mot de passe avec formulaire) [ par info3licen ] Bonjour,je travaille avec phpj'ai besoin d'aide,je n'arrive pas a trouvé la solution: j'ai fai un formulaire avec pseudo et mot de passe les utilisate Garder la connexion Mysql ouverte [ par farouk86 ] Bonjour a tous!J'ai une page login.PHP qui permet de s'authentifier et de se connecter a une base de donnée.J'ai une autre page ajouter.PHP qui permet a tous les pro du php [ par vrkill2 ] bonjour a tous qui peux mexpliqué clairement comment utiliser se code svp merci     &lt;?php // Démarage de la session PHP4// Il faut tou Connexion à mysql persitente [ par slurp ] Quelqu'un peut-il m'explique à quoi sert un connexion persistante !Merci d'avance problème concaténation [ par morpheus22170 ] Bonjour,comme le titre l'indique j'ai un problème de concaténation. Je suis sur une base de données de type "bibliothèque"Mon problème vient de l'inse Classe de gestion ftp: problème de passage de valeur? [ par spoutch ] Bonjour tout le monde ou tout du moins a ceux qui daignerons lire mon poste ^^Je travail en local sur le serveur Apache de wamp. A partir d'une source Connexion mysql [ par Leeloe6 ] Bonjour,Mon problème est que je n'arrive pas à me connecter à ma base de donnée sous linux. J'ai créé mes pages et ma bdd sous windows dans un premier projet php/mysql [ par simonano ] bonjour,je remercie bcp monsieur Bul3 d'avoir me repondre a chaque fois.enfin j'ai confiance a un endroit pour poster mon problème qui casse ma tête


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.