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 ! :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Parametre de ma classe connexion et connexion/deconnexion [ par sebos63 ] Bonjour, 1. J'ai une classe de connexion et je souhaiterais savoir où il est judicieux de spécifier les paramètres d'une connexion. (Dans mon construc connexion mysql avec mot de passe crypté [ par vincenteraptor ] Bonjour,J aurai voulu savoir sil etait possible de se connecter à un base de données via un password déja crypté avec le cryptage de mysql??exemple : Problème de création de table Mysql [ par perig ] BonjourVoilà je cherche à créer une table dans ma base Mysql (je suis chez free).Mon programme fonctionne (je consulte tous les codes d'erreur et tout Pb de script entre php et mysql pour afficher une table [ par FloTheShark ] Salut à tous Voilà g free, donc host, sql.free.fr et ainsi de suite je veux faire afficher une table(ce qu'il y a à l'intérie besoin d'1 info sur connexion/deconnexion a mysql [ par simsai ] Hello a tous,Je suis entrain de réaliser un site web en php dans lequel j'appelle des fonctions php d'insertion,suppression,update,...Pour chacune de tjr probleme de sessions. [ par Zebra1928 ] Hi all;j'ai toujours un probleme de sessions.qlq peut m'aider SVP ??, mon code est le suivant:******************************************************** probleme de connexion [ par gromito ] Je suis chez multimania et j ai un petit probleme de connexion a ma base de donn&#233;e si quelqu u n pouveit m aider. Mon code est le suivant: &lt; probleme de connexion à base mysql [ par loutwice ] salut!ben voilà le problème:j'ai fait des pages en php gérant les sesions et tout et tout....et quan je veux les réutiliser dans un autre site, et bie Problème affichage BD multiples [ par ekipage2 ] Bonjour,j'ai plusieurs BD : eleve / matières / et exercicesLorque l'élèv se connecte, il peut afficher la liste des exercices correspondants à sa clas Formulaire avec select et update de bdd mysql [ par arnold002 ] Bonjour &#224; tous,J'ai un formulaire qui contient 2 champs de type select : classe et annee.Je veux associer chaque classe &#224; chaque ann&#233;e


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,390 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é.