J'ai QQ chose qui tourne mais ne conviens pas trop.
Elle "déforme" la philosophie de PDO, on doit faire l'execute à partir de l'objet PDO au lieu de la faire à partir PDOStatment.
Je vais réfléchir à la chose, je te donne ce que j'ai fait pour l'instant
@Cyrano, je sais, les commentaires. Je te promets qu'il y seront une fois la (les) classe(s) finalisée(s)
<?php
/**
* Extension de la class PDO
*
* Le but de cette class est de comptabiliser
* - le nombre de requêtes retournant des données
*
* @package
* @access public
* @author Ajoloca
* @copyright
* @version 1.0
*/
class MyPDO extends PDO{
/**
* Variable contenant le nombre requêtes
*
* @staticvar numeric
*/
static $qriesCount = 0;
static $qryPrepared = 0;
static $directQry = 0;
public $stmt = null;
/**
* Méthode constructeur
*
* Fait appel à la class parente (PDO)
*
* @access public
* @param string $dsn chaine de type DSN (Data Server Name)
* @param string $user utilisateur
* @param string $pass mot de passe pour l'utilisateur
* @exception PDOException
* @see PDOException
*/
public function __construct($dsn, $user, $pass){
// Appel au constructeur parent
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);
}
// Une exception de type PDO à été levée
catch(PDOException $e){
// On ne traite pas l'execption, on la transmet
throw $e;
}
}
/**
* Méthode de gestion des requêtes qui retournent des données
*
* Utilise (redéfinit) la méthode prente du même nom
* Incrémente le nombre de requêtes
*
* @access public
* @param string $qry requête à exécuter
*
*/
public function query($qry){
try{
$this->query($qry);
self::$directQry++;
return($tmp);
}
catch(Exception $eQry){
throw $eQry;
}
}
public function prepare($qry){
try{
$this->stmt = parent::prepare($qry);
echo '<h4>Je prérepare la requête<br />' . $qry . '</h4>';
return ($this->stmt);
}
catch(PDOEsception $e){
throw $e;
}
}
public function execute($params = null){
try{
self::$qryPrepared++;
return ($this->stmt->execute($params));
}
catch(PDOEsception $e){
throw $e;
}
}
public function getQueryCount(){
return (self::$qriesCount);
}
public function getQueryPrepared(){
return (self::$qryPrepared);
}
}
/**
*
*
*
*/
$dsn = 'mysql:host=localhost; dbname=test';
$user = '******';
$passWd = '########';
try{
$cnx = new MyPDO($dsn, $user, $passWd);
}
catch(PDOExecption $ePDO){
die ('ERR de Connexion :<br />' . $ePDO->getMessage());
}
echo '<h3>Connexion OK</h3>';
echo 'Requêtes : ' . $cnx->getQueryCount() . '<br />';
// Construction de la requête
$qrySel = 'SELECT id, Auteur, Titre FROM livres WHERE id <= :id';
try{
// Préparation de la requête
$stmt = $cnx->prepare($qrySel);
}
catch(PDOException $e){
die($e->getMessage());
}
// Association des àramètres nommés à une variable
try{
$stmt->bindParam(':id', $i);
}
catch(Exception $e){
echo '<h3>Dans execute</h3>';
die($e->getMessage());
}
// Exécution de la requête
try{
$i = 20;
echo '<h2>Premier execute id <= ' . $i . '</h2>';
$cnx->execute();
while($row = $stmt->fetch(PDO::FETCH_OBJ))
echo 'id = ' . $row->id . ' Auteur : ' . utf8_decode($row->Auteur) . ' Titre : ' . utf8_decode($row->Titre) . '<br />';
$i = 30;
echo '<h2>nouvel execute id <= ' . $i . '</h2>';
$cnx->execute();
while($row = $stmt->fetch(PDO::FETCH_OBJ))
echo 'id = ' . $row->id . ' Auteur : ' . utf8_decode($row->Auteur) . ' Titre : ' . utf8_decode($row->Titre) . '<br />';
echo '<h2>Préparées = ' . $cnx->getQueryPrepared() . '</h2>';
}
catch(Exception $e){
die($e->getMessage());
}
?>
Comme tu le vois il-y-a des affichages totalement inutiles, mais tu est développeur...