Le problème c'est que c'est difficile de donner une explication ... mais pour donner un code simple :
imagine tu dois créer un projet, qui doit être compatible avec MySQL et PostGreSQL (un autre type de base de donnée). Dans ton code tu vas pas te taper des
if ($config_sgbd == 'mysql')
{
$result = mysql_query($sql);
}
else
{
$result = pgsql_query($sql);
}
a tout bout de champ.
La solution serait donc de passer par une fonction, par exemple :
function exec_requete($sql)
{
global $config_sgbd;
if ($config_sgbd == 'mysql')
{
$result = mysql_query($sql);
}
else
{
$result = pgsql_query($sql);
}
return ($result);
}
// Et donc
$result = exec_requete($sql)
C'est une solution, mais il y a mieux : faire une classe. Voilà un exemple :
class Database
{
// Une propriété qui compte le nombre de requete effectuées
public $total = 0;
// Pour executer une requête
public function query($sql)
{
// Appel la méthode _query() qui sera définie dans les classes filles
$result = $this->_query($sql);
// En cas d'erreur autant la loguer, ça peut servir pour le debug
if (!$result)
{
log_erreur('Erreur SQL : ' . $sql);
trigger_error('Une erreur a été rencontrée sur le site, désolé pour la gène ocasionée');
}
// +1 requête
$this->total++;
}
}
// Pour gérer MySQL
class Database_mysql extends Database
{
public function _query($sql)
{
return (mysql_query($sql));
}
}
// Pour gérer PostGreSQL
class Database_pgsql extends Database
{
public function _query($sql)
{
return (pgsql_query($sql));
}
}
ce qui donnera à l'utilisation :
if ($config_sgbd == 'mysql')
{
$db = new Database_mysql();
}
else
{
$db = new Database_pgsql();
}
$db->query('Ma requete SQL');
(...)
echo 'Page executée avec ' . $db->total . ' requetes';
Tu peux bien sur ajouter d'autres méthodes (fonctions en gros) à tes classes pour gérer le reste (mysql_fetch_row(), mysql_num_rows(), etc ...)
Les avantages :
- Tu utiliseras partout dans ton script ton objet $db donc au simple coup d'oeil, toi ou un autre développeur saura qu'il s'agit d'une manipulation de la base de donnée.
- Si demain tu dois aussi gérer Sql Server, il te sufira de créer une classe Database_sqlserver étendant Database
- La POO te permet une organisation très poussée du projet (une classe pour la base de donnée, pour le thème, pour le XML, pour les news de ton site, pour tes membres, etc ...)
- La POO donne accès à pas mal d'outils (interfaces, abstract, public / private / protected, héritage, surcharge, etc...)
Pour pousser un poil plus et résoudre définitivement la lourdeur du code
if ($config_sgbd == 'mysql')
{
$db = new Database_mysql();
}
else
{
$db = new Database_pgsql();
}
tu peux implémenter ce design pattern :
class Database
{
// Une propriété qui compte le nombre de requete effectuées
public $total = 0;
public static function &factory()
{
global $config_sgbd;
$class = 'Database_' . $config_sgbd;
if (!class_exists($class))
{
trigger_error($config_sgbd . ' n\'est pas une SGBD supportée par le projet');
}
$obj =& new $class();
return ($obj);
}
// Pour executer une requête
public function query($sql)
{
// Appel la méthode _query() qui sera définie dans les classes filles
$result = $this->_query($sql);
// En cas d'erreur autant la loguer, ça peut servir pour le debug
if (!$result)
{
log_erreur('Erreur SQL : ' . $sql);
trigger_error('Une erreur a été rencontrée sur le site, désolé pour la gène ocasionée');
}
// +1 requête
$this->total++;
}
}
// et pour créer l'objet :
$db = Database::factory();
Bien sur ça reste complexe tout ça, c'est pour ça que je t'encourage à te mettre dans le code, ça t'aidera beaucoup à comprendre.