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 :

mysqli, POO et MVC [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut mysqli, POO et MVC
    Bonjour,

    je suis en train de développer une application web en php5 (POO) selon le modèle MVC et j'ai une petite interrogation concernant la gestion de la connexion sql (mysqli).

    J'ai une classe sql qui contient le singleton de connexion défini comme ceci :

    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
     
    class sql{
     
    	// singleton sql
    	private static $mysqli;
     
    	// constructeur privé
    	private function __construct(){
    		try{		
    			self::$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    		}
    		catch(Exception $e){
    			die('db connexion error');
    		}
    	}
     
    	// fonction qui retourne l'objet de connexion sql
    	public static function getCnx(){
    		return isset(self::$mysqli) ? self::$mysqli : new sql();
    	}
     
    	// appel de la méthode mysqli::query
    	public function query($q){
    		return self::$mysqli->query($q);
    	}
    Ma classe core model.php (dont héritent toutes mes autres classes model) permet de centraliser les appels au fonctions de requêtes :

    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
     
    class model{
     
    	private $sql;
     
    	// récupération du singleton sql
    	public function __construct(){
    		//$this->sql = sql::getCnx();
    	}
     
    	// exécution d'une requête et renvoie un tableau de résultats
    	public function query($q){
    		try{
    			$r = sql::getCnx()->query($q);
    			return $r->fetch_all();
    		}
    		catch(Exception $e){
    		}
    	}
     
    	// exécution d'une requête qui ne retourne pas de résultats
    	public function nonquery($q){
    		try{
    			sql::getCnx()->query($q);		
    		}
    		catch(Exception $e){
     
    		}
    	}
     
    }
    Le truc qui me perturbe est que dans la classe sql, je doive implémenter la méthode query !

    - En effet, lorsque je fais un sql::getCnx(), j'obtiens bien une instance de mysqli, non ?
    - Et comme toutes les instances de classe, elle devrait implémenter les méthodes de mysqli, non ?
    - Et dans ce cas, pourquoi dans ma classe core model, ne puis-je pas faire directement sql::getCnx()->query($q); ?
    - En effet, si je supprime la méthode query de ma classe sql, mon code ne fonctionne plus !

    Je dois mélanger certains trucs, mais je n'arrive pas à comprendre quoi !

    Merci de votre aide !

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    Il y a une erreur dans ta fonction "getCnx", un coup tu renvoies un objet de type "sql", un coup tu renvoies un objet mysqli :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static function getCnx() {
            if (!isset(self::$mysqli)) {
                new sql();
            }
            return self::$mysqli;
        }
    Ceci dit il y a quelque chose d'assez illogique dans ton fonctionnement, normalement on peut accéder à un attribut static sans instancier la classe, or dans ton cas il est obligatoire d'instancier la classe SQL pour accéder à l'attribut mysqli.
    En toute logique, la création de cet objet ne doit pas avoir lieu dans le constructeur de la classe. Dans ton cas il suffit de le déplacer dans "getCnx" pour que cela devienne plus cohérent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public static function getCnx() {
            if (!isset(self::$mysqli)) {
                try {
                    self::$mysqli = new mysqli('localhost', 'root', 'admin', 'vcl');
                } catch (Exception $e) {
                    die('db connexion error');
                }
            }
     
            return self::$mysqli;
        }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    En effet, je me suis pas mal mélangé les pinceaux !

    déjà la définition de mon singleton n'était pas bonne et en plus la méthode query de ma classe sql n'était pas définie comme static !

    toutefois ma question reste pour le moment sans réponse : Pourquoi alors que self::getCnx renvoie un objet de type mysqli (instancié par un new mysqli()) dois-je implémenter la méthode query dans ma classe sql ? en effet, les instances de mysqli implémentent déjà la méthode query !

    Merci de votre aide !

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    J'ai bien répondu à ta question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return isset(self::$mysqli) ? self::$mysqli : new sql();
    tu retournes un objet de type sql quand ton objet mysqli n'existe pas. Donc tu appelles la fonction "query" sur un objet de type "sql".

    J'ai corrigé cette méthode dans mon premier message pour que celle-ci retourne toujours un objet mysqli.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Oups ! Oui, pardon...
    Entre temps, j'ai mis en pratique ton conseil sur la modification de getCnx afin de faire un vrai singleton ! Et puis je me suis dit que je n'avais finalement pas besoin d'une classe sql qui multiplie les couches et donc la complexité. J'ai donc remonté l'initialisation de la connexion à la BD dans la classe core model dont hérite les classes model des controller.

    Ainsi je manipule plus directement mon objet mysqli, je trouve que c'est plus simple...

    je ferrai peut être un rollback pour revenir à mon dev initial et mettre en oeuvre ta solution pour confirmer que cela fonctionne ! En tous cas, merci pour ton aide et tes précieux conseils !

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

Discussions similaires

  1. POO et MVC..
    Par Kandyn dans le forum Langage
    Réponses: 2
    Dernier message: 31/07/2013, 12h30
  2. [POO] Modèle MVC et appel de controller
    Par sourivore dans le forum MVC
    Réponses: 9
    Dernier message: 13/09/2009, 03h16
  3. [POO] Centralisation MVC
    Par T0xF0x dans le forum Langage
    Réponses: 8
    Dernier message: 01/03/2007, 03h45
  4. [MVC]Modélisation POO avec BD
    Par fremsoi dans le forum MVC
    Réponses: 1
    Dernier message: 08/11/2005, 13h53

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