par
Ajoloca » 01 déc. 2006, 05:19
Bonsoir,
Voilà QQ chose qui me plait bien mieux, ça respecte réellement la philosophie Objet et celle de PDO.
Les class ne sont pas totalement terminées (commentaires, amélliorations, etc...)
La façon d'écrire la fonction n'est pas à prendre en exemple (ou si tu tiens à la prendre en exemple, c'est ceux qu'il ne faut jamais faire - global, etc..)
mais pour le test on peux le pardonner.
<?php
class MyPDO extends PDO{
const ALL_QRY = 0;
const DIRECT_QRY = 1;
const PREP_QRY = 2;
/*
*/
static $preparedQry = 0;
static $directQry = 0;
/*
*/
public function __construct($dsn, $user, $pass){
try{
parent::__construct($dsn, $user, $pass);
// Activation du mode de gestion des erreurs par levée d'exception
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On précise à PDO la class qui doit gérer les Statements
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
}
// Une exception de type PDO à été levée
catch(PDOException $e){
// On ne traite pas l'execption, on la transmet
throw $e;
}
}
/*
*/
public function query($params){
try{
self::$directQry++;
parent::query($params);
}
catch(PDOException $e){
throw $e;
}
}
/*
*/
public function exec($params){
try{
self::$directQry++;
parent::exec($params);
}
catch(PDOException $e){
throw $e;
}
}
/*
*/
public function addPreparedQry($objStatement){
// Permet de controler que la méthode à été appellée à partir de la class MyPDOStatement
// Evite de faire incrémenter les requêtes préparées d'un autre endroit
if(get_class($objStatement) === false || get_class($objStatement) != 'MyPDOStatement'){
throw new PDOException ('Appel invalide à la méthode <b>' . __METHOD__ . '</b>');
}
self::$preparedQry++;
}
/*
*/
public function getQryNumber($type = MyPDO::ALL_QRY){
switch($type){
case MyPDO::DIRECT_QRY :
return(self::$directQry);
case MyPDO::PREP_QRY :
return(self::$preparedQry);
case MyPDO::ALL_QRY :
default :
return(self::$preparedQry + self::$directQry);
}
}
}
/*
*
*
*
*/
class MyPDOStatement extends PDOStatement{
public $stmt;
protected function __construct($stmt){
$this->stmt = $stmt;
$this->setFetchMode(PDO::FETCH_OBJ);
}
/*
*/
public function execute($params = null){
$this->stmt->addPreparedQry($this);
parent::execute($params);
}
}
/*
*
*
*
*/
function executionRequetePreparee(){
global $stmt, $id;
try{
echo '<h3>Execute() ID <= ' . $id . '</h3>';
$stmt->execute();
echo '<table><tr><th>ID</th><th>Auteur</th><th>Titre</th></tr>';
while($row = $stmt->fetch(PDO::FETCH_OBJ)){
echo '<tr>';
echo '<td>' . $row->id . '</td><td>' . utf8_decode($row->Auteur) . '</td><td>' . utf8_decode($row->Titre) . '</td>';
echo '</tr>';
}
echo '</table>';
}
catch (PDOException $e){
die ('<h2>ERR execute() :</h2>' . $e->getMessage());
}
}
/*
*
*
*
*/
$dsn = 'mysql:host=localhost; dbname=test';
$user = '****';
$passWd = '****';
try{
$cnx = new MyPDO($dsn, $user, $passWd);
}
catch(PDOExecption $ePDO){
die ('<h2>ERR de Connexion :</h2>' . $ePDO->getMessage());
}
echo '<h2>Connexion OK !</h2>';
try{
$stmt = $cnx->prepare('SELECT id, Auteur, Titre FROM livres WHERE id <= :id');
}
catch (PDOException $e){
die ('<h2>ERR de préparation de Qry :</h2>' . $ePDO->getMessage());
}
echo '<h2>Prepare() OK !</h2>';
$stmt->bindParam(':id', $id);
$id = 20;
executionRequetePreparee();
$id = 30;
executionRequetePreparee();
$id = 40;
executionRequetePreparee();
echo '<h2>Requêtes préparées = ' . $cnx->getQryNumber(MyPDO::PREP_QRY) . '</h2>';
$cnx = null;
?>
Bonsoir,
Voilà QQ chose qui me plait bien mieux, ça respecte réellement la philosophie Objet et celle de PDO.
Les class ne sont pas totalement terminées (commentaires, amélliorations, etc...)
La façon d'écrire la fonction n'est pas à prendre en exemple (ou si tu tiens à la prendre en exemple, c'est ceux qu'il ne faut jamais faire - global, etc..)
mais pour le test on peux le pardonner.
[php]<?php
class MyPDO extends PDO{
const ALL_QRY = 0;
const DIRECT_QRY = 1;
const PREP_QRY = 2;
/*
*/
static $preparedQry = 0;
static $directQry = 0;
/*
*/
public function __construct($dsn, $user, $pass){
try{
parent::__construct($dsn, $user, $pass);
// Activation du mode de gestion des erreurs par levée d'exception
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// On précise à PDO la class qui doit gérer les Statements
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
}
// Une exception de type PDO à été levée
catch(PDOException $e){
// On ne traite pas l'execption, on la transmet
throw $e;
}
}
/*
*/
public function query($params){
try{
self::$directQry++;
parent::query($params);
}
catch(PDOException $e){
throw $e;
}
}
/*
*/
public function exec($params){
try{
self::$directQry++;
parent::exec($params);
}
catch(PDOException $e){
throw $e;
}
}
/*
*/
public function addPreparedQry($objStatement){
// Permet de controler que la méthode à été appellée à partir de la class MyPDOStatement
// Evite de faire incrémenter les requêtes préparées d'un autre endroit
if(get_class($objStatement) === false || get_class($objStatement) != 'MyPDOStatement'){
throw new PDOException ('Appel invalide à la méthode <b>' . __METHOD__ . '</b>');
}
self::$preparedQry++;
}
/*
*/
public function getQryNumber($type = MyPDO::ALL_QRY){
switch($type){
case MyPDO::DIRECT_QRY :
return(self::$directQry);
case MyPDO::PREP_QRY :
return(self::$preparedQry);
case MyPDO::ALL_QRY :
default :
return(self::$preparedQry + self::$directQry);
}
}
}
/*
*
*
*
*/
class MyPDOStatement extends PDOStatement{
public $stmt;
protected function __construct($stmt){
$this->stmt = $stmt;
$this->setFetchMode(PDO::FETCH_OBJ);
}
/*
*/
public function execute($params = null){
$this->stmt->addPreparedQry($this);
parent::execute($params);
}
}
/*
*
*
*
*/
function executionRequetePreparee(){
global $stmt, $id;
try{
echo '<h3>Execute() ID <= ' . $id . '</h3>';
$stmt->execute();
echo '<table><tr><th>ID</th><th>Auteur</th><th>Titre</th></tr>';
while($row = $stmt->fetch(PDO::FETCH_OBJ)){
echo '<tr>';
echo '<td>' . $row->id . '</td><td>' . utf8_decode($row->Auteur) . '</td><td>' . utf8_decode($row->Titre) . '</td>';
echo '</tr>';
}
echo '</table>';
}
catch (PDOException $e){
die ('<h2>ERR execute() :</h2>' . $e->getMessage());
}
}
/*
*
*
*
*/
$dsn = 'mysql:host=localhost; dbname=test';
$user = '****';
$passWd = '****';
try{
$cnx = new MyPDO($dsn, $user, $passWd);
}
catch(PDOExecption $ePDO){
die ('<h2>ERR de Connexion :</h2>' . $ePDO->getMessage());
}
echo '<h2>Connexion OK !</h2>';
try{
$stmt = $cnx->prepare('SELECT id, Auteur, Titre FROM livres WHERE id <= :id');
}
catch (PDOException $e){
die ('<h2>ERR de préparation de Qry :</h2>' . $ePDO->getMessage());
}
echo '<h2>Prepare() OK !</h2>';
$stmt->bindParam(':id', $id);
$id = 20;
executionRequetePreparee();
$id = 30;
executionRequetePreparee();
$id = 40;
executionRequetePreparee();
echo '<h2>Requêtes préparées = ' . $cnx->getQryNumber(MyPDO::PREP_QRY) . '</h2>';
$cnx = null;
?>[/php]