class MyPDOStatment{
private $monStatment = null;
public function __construct (PDOStatment $leStatment){
$this->monStatment = $leStatment;
}
}
Pour le reste je laisse réfléchir.
class MyPDO extends PDO{
public function prepare($q,$opt=NULL){
// je fait pas non plus les try catch, pour simplifier
return parent::prepare($q,$opt);
}
}
class MyPDOStatement extends PDOStatement {
public function execute($param=NULL){
return parent::execute($param);
}
}
Seulement si on laisse le code comme ça, ben MyPDO::prepare va retourner une instance PDOStatementclass MyPDO extends PDO{
public function prepare($q,$opt=NULL){
// je fait pas non plus les try catch, pour simplifier
parent::prepare($q,$opt);
return new MyPDOStatement($q,$opt);
}
}
class MyPDOStatement extends PDOStatement {
private $statement=NULL;
private $options=NULL;
public function __construct($stat,$opt){
$this->statement=$stat;
$this->options=$opt;
}
public function execute($param=NULL){
}
}
ça serait déja mieu non? mais je sai spas quoi mettre dans la méthode execute...
class MyPDOStatment{
private $monStatment = null;
public function __construct (PDOStatment $leStatment){
$this->monStatment = $leStatment;
}
public function execute($param = null){
return $this->monStatment->execute($param);
}
}
et dans la class MyPDO
public function prepare($param){
return (new MyPDOStatment (parent::prepare($param)));
}
N'oublie pas tous les try/catch, etc...
<?php
/**
* Compteur de requêtes.
*
* Classe étendue de PDO destinée à compter le nombre de requêtes envoyées.
*/
class SQL extends PDO
{
/**
*redéfinition de la méthode prepare
*/
public function prepare($param){
try{
return (new SQLStatement (parent::prepare($param)));
} catch (PDOException $e){
throw $e;
}
}
}
class SQLStatement {
private $monStatment = null;
public function __construct (PDOStatment $leStatment){
$this->monStatment = $leStatment;
}
public function execute($param = null){
try{
return $this->monStatment->execute($param);
}catch (PDOException $e){
throw $e;
}
}
}
$user='xxx';
$pass='xxx';
try{
$connec=new SQL('mysql:host=xxx;dbname=xxx', $user, $pass);
} catch (PDOException $e) {
die("Erreur de connection: <br />".$e->getMessage());
}
$sql='SELECT * FROM `actions` LIMIT 0,10';
try{
$resQrySel = $connec->query($sql);
} catch (PDOException $e){
die("Erreur d'éxécution de la requête:<br />".$sql."<br />Erreur:<br />".$e->getMessage());
}
if($i == 0){
try{
$res = $resQrySel->fetchAll(PDO::FETCH_OBJ);
} catch (PDOException $e){
die("Erreur lors du traitement de la ressource: <br />".$e->getMessage());
}
foreach($res as $a=>$b){
echo "<br />Enregistrement numéro ".$a."<br />";
foreach($b as $cle=>$valeur){
echo $cle." = ".$valeur."<br />";
}
}
}
$sql='SELECT * FROM `actions` WHERE `id_action` = ?';
try{
$var=$connec->prepare($sql);
$var->execute(array(5));
$res=$var->fetchAll();
}catch(PDOException $e){
die('Erreur d\'éxécution de la requête préparée: '.$e->getMessage());
}
print_r($res);
echo 'Nombre de requêtes préparées effectuées: '.$connec->getnbrQuery(PREPARED);
?>
j'ai l'impression à l'appel de la page que le serveur ne répond pas....
<?php
class SQL extends PDO
{
/**
* Statement des requêtes préparées
*
* @var PDOStatement
*/
private $_statement = null;
/**
* Prépare une requête
*
* @param string $sql requête SQL à préparer
* @param array $params paramètres du driver PDO
*
* @return PDOStatement le statement généré
* @throws PDOException si une erreur se produit dans la préparation de la requête
*/
public function prepare($sql, $params = null)
{
//si la requête est vide, on ne peut pas la préparer
if( empty($sql) )
{
throw new PDOException(__METHOD__ . 'attend un chaîne SQL valide en 1er argument!');
}
// pas besoin d'entourer de try / catch, notre méthode lèvera une PDOException
// qu'il faudra rattraper lors de l'appel
$this->_statement = parent::prepare($sql, $params);
//ici on peut incrémenter le cpt de préparation de requête
return $this->_statement;
}
/**
* Exécute une requête préparée
*
* @param array | mixed $bindParams valeurs des paramètre de la requête
*
* @return bool true si la requête s'est bien exécutée, false sinon
* @throws PDOException si aucune requête préparée, ou si il manque un paramètre nommé
*/
public function execute($bindParams = array() )
{
// si la requête n'a pas été préparée, on ne peut pas l'exécuter
if( is_null($this->_statement) )
{
throw new PDOException(__METHOD__ . ' doit être appelée après avoir
préparer une reqûete avec SQL->prepare()');
}
$res = $this->_statement->execute( (array) $bindParams );
//ici on peut incrémenter le cpt de reqûete préparées exécutées
return $res;
}
/**
* Exécute la requpete SQL donnée et retourne le nb de lignes affectées.
*
* @throws PDOException si la requête SQL est vide
*/
public function exec($sql)
{
if( empty($sql) )
{
throw new PDOException('L\'argument attendu ne peut être vide');
}
$res = $this->exec($sql);
//si tout s'est bien passé, on reoturne le nb de lignes affectées
if( $res !== false)
{
//ici on peut incrémenter le cpt des requêtes non préparées
return $res;
}
//si on arrive ici, une erreur s'est produite
throw new PDOException('Une erreur s\'est produite : ' . print_r($this->errorInfo(), 1) );
}
//faire de même pour query
/**
* Retourne le statement de la dernière préparation de requête.
*
* @return PDOStatement
*/
public function getStatement()
{
return $this->_statement;
}
}
$user='xxx';
$pass='xxx';
try{
$connec = new SQL('mysql:host=xxx;dbname=xxx', $user, $pass);
} catch (PDOException $e) {
die("Erreur de connection: <br />".$e->getMessage());
}
$sql='SELECT * FROM `actions` LIMIT 0,10';
$resQrySel = 0;
try{
$resQrySel = $connec->query($sql);
} catch (PDOException $e){
die("Erreur d'éxécution de la requête:<br />".$sql."<br />Erreur:<br />".$e->getMessage());
}
if($resQrySel != 0){
try{
$res = $resQrySel->fetchAll(PDO::FETCH_OBJ);
} catch (PDOException $e){
die("Erreur lors du traitement de la ressource: <br />".$e->getMessage());
}
foreach($res as $a=>$b){
echo "<br />Enregistrement numéro ".$a."<br />";
foreach($b as $cle=>$valeur){
echo $cle." = ".$valeur."<br />";
}
}
}
$sql='SELECT * FROM `actions` WHERE `id_action` = ?';
try{
$var= $connec->prepare($sql);
$res = $var->execute(array(5));
if($res)
{
$datas = $var->fetchAll();
}
}catch(PDOException $e){
die('Erreur d\'éxécution de la requête préparée: '.$e->getMessage());
}
print_r($res);
s
//echo 'Nombre de requêtes préparées effectuées: '.$connec->getnbrQuery(PREPARED);
?>
Je maintiens que je ne vois pas l'intérêt de faire un try / catch pour faire seulement un throw dans le catch. autant laisser les méthode PDO de base lever une exception et les rattraper lors de l'appel des méthodes.