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 !