Toujours en quête d'apprentissage je me lance dans l'utilisation de la class PDO.
Je voudrais n'avoir qu'une instance de la class PDO tout comme je l'avais fait dans ma class Mysql, utilisant les fonction mysql_* .
J'ai donc crée une class multiton (MPDO) qui me permet de vérifier si une instance de PDO existe déjà, et si pas la crée.
Je peux donc avoir ce genre de code :
$www = MPDO::getInstance("beta_soez");
foreach ($www->pquery("SELECT id,pseudo FROM users") as $row) {
echo $row['id']." ) ".$row['pseudo'] ."<br/>";
}
$denora = MPDO::getInstance("denora");
foreach ($denora->pquery("SELECT chanid,channel FROM chan") as $row) {
echo $row['chanid']." ) ".$row['channel'] ."<br/>";
}
foreach ($www->pquery("SELECT id,pseudo FROM users") as $row) {
echo $row['id']." ) ".$row['pseudo'] ."<br/>";
}
echo "<br/><br/>Nous avons fait : ".MPDO::nbrReq()." requètes en ".MPDO::time()." secondes";
Vu que mon site doit pouvoir se connecter à plusieurs base de données simultanément.voiçi ma class :
<?
/*
Class MPDO permetant d'effectuer des requètes Mysql et retourner le résultat sous forme de tableau
-> Utilisation d'un multiton pour n'avoir qu'une instance de MPDO
*/
class MPDO {
private static $instance = array();
private static $dbinfo = Array();
private static $time;
private static $nb_req;
private $pdo;
/*
Constructeur de notre class MPDO.
*/
private function __construct($dbname) {
try {
$this->pdo = new PDO(self::$dbinfo[$dbname]['dsn'], self::$dbinfo[$dbname]['user'], self::$dbinfo[$dbname]['pass']);
}
catch(PDOException $e) {
echo 'Connexion échouée sur '.$dbname.' : ' . $e->getMessage() ;
}
}
/*
Fonction permetant de retourner la bonne instance de PDO en fonction de la base de donnée choissie.
*/
public function getInstance($dbname) {
require_once(dirname(__FILE__)."/../db.inc.php");
// Configue notre base de donnée
if(empty(self::$dbinfo)) {
self::$dbinfo = $db;
}
if(!array_key_exists($dbname,self::$dbinfo)) {
throw new Exception('[MySql] given database name "'.$dbname.'" is not configured');
}
// Si l'instance de connexion à la base de donnees n'existe pas, creation puis ajout à la liste des instances
if(!array_key_exists($dbname, self::$instance)) {
self::$instance[$dbname] = new MPDO($dbname);
}
return self::$instance[$dbname];
}
/*
Fonction qui envoi chaque méthodes passées à la class SPDO à notre instance PDO
*/
final public function __call($method, $args) {
$debut = null;
// Condition qui permet d'ajouter un timer à chaque exec ou query
if( in_array($method,Array("query","exec")) ) {
$debut = microtime(true);
}
$return = call_user_func_array(array($this->pdo,$method) , $args);
if(!is_null($debut)) {
$fin = microtime(true);
self::$time = self::$time = self::$time + ($fin - $debut).
self::$nb_req++;
}
return $return;
}
/*
Fonction qui renvoi le nombre de requète
*/
public function nbrReq() {
return self::$nb_req;
}
/*
Fonction qui renvoi le temps passé pour chaque requète.
*/
public function time() {
return round(self::$time,5);
}
}
?>
Qu'en pensez-vous ?J'avais dans un premier temps pensé à surcharger le class PDO pour avoir le compteur de requête et de temps, mais étant donnée que je n'ai pas accès au code de la méthode query et exec, il me semble que c'est impossible.
Merci pour votre avis !
A bientôt