Danygras

Sommaire - interface sql.class.php - mysqlext.class.php - mysqliu.class.php - mypdo.class.php

Abstraction SQL en PHP

Cet exemple pratique démontre l'utilité d'une interface

On est confronté au problème, chez free.fr, que la couche SQL disponible est une extention mysql qui est par ailleurs dépréciée quand elle n'a pas carrément disparu de la circulation. Ainsi, j'installe WAMP sur mon PC local et je dois tout refaire mon vieux site qui marche pourtant très bien chez free, car aujourd'hui WAMP ne connait plus mysql version procédural, mais seulement mysqli et PDO.

Ma solution ? Simple et élégante, je masque les fonctions sql derrière une interface. L'interface PHP expose les fonctions dont je vais avoir besoin, et je crée 2 classes qui implémentent cette interface, l'une pour mysql et l'autre pour mysqli. Le résultat va ressembler à ça :

<?php
/*
* MySQL : mysqli en local, mais mysql chez free
*/
if($_SERVER["HTTP_HOST"] == 'localhost')
	bdd::$bdd = new mysqliu(BDD_HOST, BDD_USER, BDD_PASS, BDD_BASE);
else
	bdd::$bdd = new mysqlext(BDD_HOST, BDD_USER, BDD_PASS, BDD_BASE);
?>

Avec une interface sql.class.php, une classe pour mysql, mysqlext.class.php et une autre pour mysqli, mysqliu.class.php (les noms sont choisis au mieux, je ne peux évidemment pas les appeler mysql et mysqli, déjà pris).

Et c'est tout ! Ce simple test à la connexion de la BDD (qu'on ne met traditionnelement qu'une seule fois sur un site s'il est pas trop mal structuré) me permet d'utiliser une BDD mysql peu importe l'extension disponible.

Notons aussi la classe bdd qui n'est en fait qu'un singleton me permettant d'atteindre mon objet sql comme s'il s'agissait d'une super-globale, i.e. de n'importe-où dans mon site :

<?php
/**
 * classe static pour atteindre la bdd et d'autres fonctions sql
 */
class bdd {

	public static $bdd = false;
	
	private function __construct() {
	}
}
?>