30 avril 2008

Les différentes méthodes d’accès à un SGBD en PHP

Le but de ce billet est de faire un rapide état des lieux des différentes méthodes permettant, en PHP, d'interroger un Système de Gestion de Base de Données (SGBD)

Le choix du SGBD ne sera pas abordé ici. Les différentes méthodes présentées peuvent en théorie être utilisée indifféremment que l'on utilise que soit Oracle, MySql ou encore Sqlite...

La liste que je propose n'est pas forcement exhaustive, mais elle présente au moins toute les méthodes que je connais de près ou de loin.

Les Fonctions natives

Plusieurs SGBD possèdent une interface native sous forme de fonctions PHP. Ces fonctions permettent d'utiliser simplement le "driver" d'accès fourni par chaque SGBD. Une liste des SGBD supporté par PHP est disponible dans la documentation officielle de PHP

Le principe avantage est de pouvoir utiliser au mieux le SGBD, mais c'est aussi un inconvénient car on devra réécrire son code dans le cas ou l'API cliente évolue ou si l'on souhaite changer de SGBD. Pour MySQL, il existe 2 APIs (MySQL et mysqli). Pour Oracle, l'API en est à sa troisième version majeure (ORA, OCI8 et maintenant OCI), chaque version étant incompatible avec la précédente.

Si la majorité de ses fonctions natives sont des interfaces procédurales. Certaines APIs sont orienté objet. C'est la cas par exemple pour mysqli.

Les couches d'abstraction

MDB2

  • Couche d'abstraction d'accès à un SGBD.
  • Interface orienté objet.
  • En standard dans PEAR.

MDB2 utilise les fonctions PHP natives propres à chaque SGBD. On notera que MDB2 détecte automatiquement la structure des tables mais visiblement sans notion de Cache. Autre point MDB2 permet la création de table de données sans se soucier du SGBD. Cette fonctionnalité peut être intéressant si l'on souhaite déployer un schéma quand on ne connait pas le type du SGBD qui sera utilisé.

Exemple

require_once 'MDB2.php';
$mdb2 =&
MDB2::connect('mysql://root:secret@localhost/test');
if (PEAR::isError($mdb2)) {
  die($mdb2->getMessage());
}
$res = $mdb2->
query('SELECT num, nom FROM departement ');
while (($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC))) {
  echo $row['num'] .'-'.$row['nom'] "\n";
}

PDO

  • Couche d'abstraction d'accès à un SGBD
  • Interface orienté objet
  • En standard dans PHP

Contrairement à toute les autres, PDO est écrit en C, et donc fourni de manière native dans PHP.

Exemple


require_once 'MDB2.php';
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'secret');
$res = $mdb2->query('SELECT num, nom FROM departement ');
while (($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC))) {
  echo $row['num'] .'-'.$row['nom'] "\n";
}

ADODB

à approfondir ...

Les Object Relational Mapping (ORM)

Il existe plusieurs solutions d'ORM en PHP. Pour mettre à disposition du développeur des objets de manipulations des données, les systèmes d'ORM doivent connaitre le schéma de la base. Pour cela il existe plusieurs techniques :

* détection automatiquement à l'exécution avec éventuellement une mise en cache
* en différé avec un script qui va générer soit des fichiers de description en XML soit directement des fichiers PHP
* à la main...

Au final, l'ajout, la suppression, la modification d'une ligne de données pourra ressembler à ceci :

$car = new Car;
$data = array(
   'model' => 'Super Trooper',
   'hp'    => 140,
   'color' => 'black',
   'clima' => 0,
   'price' => 19000

);
$newCarId = $car->save($data);

Zend_Db

  • Couche d'abstraction d'accès à un SGBD.
  • Interface orienté objet
  • ORM
  • En standard dans le Zend Framework

Zend_DB se décompose en plusieurs sous modules. Zend_DB propose à priori la même chose que MDB2 mais il lui ajoute la couche ORM. A noter que derrière les objets PHP on retrouve le module PDO. Comme MDB2, Zend_Db devine les structres de données mais visiblement cette opération peut être mis en cache.

Propel

  • En standard dans le Framework Symphony

jDao

  • En standard dans le Framework Jelix (Ne peut pas s'utliser en dehors)
  • Description des tables à écrire en XML

MDB_QueryTool

  • Couche d'abstraction d'accès à un SGBD
  • Interface orienté objet
  • ORM simplifié
  • Fourni par PEAR

DB_DataObject

  • ORM simplifié
  • Fourni par PEAR

PMO

à approfondir ...

Doctrine

à approfondir ...

AutoCRUD

à approfondir ...

REST et Radar

On peut également décider d'architecturer son application suivant le concept nommé
RADAR. Le principe veut que l'application soit construite autour d'une API de type REST.

La communication avec le SGBD se fera donc en s'appuyant sur des APIs REST. Ce type d'APIs peut être entièrement spécifique à l'application mais on peut aussi utiliser des APIs prête à l'emploi. En voici quelles unes :