Une seule et même fonction pour différents systèmes de gestion de base de données

Publié dans PHP objet | Marqué avec , , , , , ,
Share

Je suis depuis longtemps déjà un féru utilisateur de FluxBB (anciennement PunBB), un système de forum bien fichu, valide W3C, très léger et donc configurable à souhait. En ce moment ce projet open source bat un peu de l’aile, mais de nouvelles mises à jours sortent encore assez régulièrement et la nouvelle version (attendue depuis des années) semble de nouveau repartir sur de bonnes bases. Mais bref, je parle de cela car FluxBB gère les bases de données MySQL, PostgreSQL (ou PgSQL) et même SQLite je crois. Pour se faire, au lieu d’avoir un switch ou des if else à chaque requête à effectuer, ils ont créé une class qui regroupe toutes les fonctions utiles (connect, query, fetch_array, …) et dans le code ils y font appelle après avoir instanciée cette class : $db->query, $db->fetch_array. Reste à sélectionner le type de sa base de données dans la partie administration et hop, on change de SGBD sans rien changer au code ! Pratique ! Je n’ai pas encore fini d’apprendre le PHP objet, mais j’avais envi de pratiquer un peu, alors sans regarder ailleurs, j’ai commencé à coder. Et voici une première version. Ma classe oublie surement pas mal de fonctions, et je n’ai pas pu la tester partout, et puis il manque la gestion des erreurs, j’aurai pu ajouter un compteur de requêtes, mais c’est ma première véritable class, alors soyez indulgent ^^

<?php
class Sgbd {
	public $nom;
	public function __construct($nom) {
		$this->nom = $nom;
	}
	public function connect($hote, $port, $nomBdd, $utilisateur, $mdp) {
		switch ($this->nom) {
			case 'pg':
			$requete = 'host='.$hote.' port='.($port == NULL ? '5432' : $port).' dbname='.$nomBdd.' user='.$utilisateur.' password='.$mdp;
			pg_connect($requete);
			break;
			default:
			mysql_connect($hote.($port == NULL ? ':3307' : ':'.$port), $utilisateur, $mdp);
			mysql_select_db($nomBdd);
		}
	}
	public function close() {
		switch ($this->nom) {
			case 'pg':
			pg_close();
			break;
			default:
			mysql_close();
		}
	}
	public function query($requete) {
		switch ($this->nom) {
			case 'pg':
			$result = pg_query($requete);
			break;
			default:
			$result = mysql_query($requete);
		}
		return $result;
	}
	public function fetch_array($result) {
		switch ($this->nom) {
			case 'pg':
			$arr = pg_fetch_array($result);
			break;
			default:
			$arr = mysql_fetch_array($result, MYSQL_BOTH);
		}
		return $arr;
	}
	public function fetch_row($result) {
		switch ($this->nom) {
			case 'pg':
			$row = pg_fetch_row($result);
			break;
			default:
			$row = mysql_fetch_row($result);
		}
		return $row;
	}
	public function num_rows($result) {
		switch ($this->nom) {
			case 'pg':
			$num_rows = pg_num_rows($result);
			break;
			default:
			$num_rows = mysql_num_rows($result);
		}
		return $num_rows;
	}
}
$sgbd = new Sgbd('mysql');
?>

3 Responses to Une seule et même fonction pour différents systèmes de gestion de base de données

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *