public function query($q)
{
try{
self::$nbrQuery+=1;
return parent::query($q);
}catch(PDOException $e){
throw $e;
}
}
Sinon une dernière (c'est pas sûr hein...
<?php
class MyPDO extends PDO{
static $qriesCount = 0;
public function __construct($dsn, $user, $pass){
try{
parent::__construct($dsn, $user, $pass);
}
catch(PDOException $e){
throw $e;
}
}
public function query($qry){
try{
self::$qriesCount++;
return(parent::query($qry));
}
catch(Exception $eQry){
throw $eQry;
}
}
public function getQueryCount(){
return (self::$qriesCount);
}
}
$dsn = 'mysql:host=localhost; dbname=test';
$user = 'xxx';
$passWd = 'yyy';
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 />';
$qrySel = 'SELECT COUNT(*) nombre FROM `livres`';
for($i = 0; $i < 3; $i++){
$resQrySel = $cnx->query($qrySel);
if($i == 0){
$nbrRangs = $resQrySel->fetchAll(PDO::FETCH_OBJ);
echo 'Valeur trouvée = ' . $nbrRangs[0]->nombre. '<br />';
}
echo 'Requêtes : ' . $cnx->getQueryCount() . '<br />';
}
?>
try{
$cnx = new MyPDO($dsn, $user, $passWd);
}
catch(PDOExecption $ePDO){
die ('ERR de Connexion :<br />' . $ePDO->getMessage());
}
un peu lourd à réécrire dans le code, il n'y aurai pas un moyen de gérer ça en interne dans la classe un truc comme ça (sans commentaires... pardon cyrano [-o< )
public function query($q)
{
try{
self::$nbrQuery+=1;
return parent::query($q);
}catch(PDOException $e){
self::$error=$e->getMessage();
}
}
bon c'est peut-être du grand n'importe quoi le code que j'ai mis mais c'est pour montrer la façon dont je verrai les choses ...
Que retournerais-tu en cas d'erreur ?un peu lourd à réécrire dans le code, il n'y aurai pas un moyen de gérer ça en interne dans la classe un truc comme ça (sans commentaires... pardon cyrano Pray )
PHP:
public function query($q)
{
try{
self::$nbrQuery+=1;
return parent::query($q);
}catch(PDOException $e){
self::$error=$e->getMessage();
}
}
try {
$dbh = new SQL('mysql:host=xxx;dbname=xxx', $user, $pass);
foreach ($dbh->query('un requete fausse') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Erreur ! : " . $e->getMessage() . "<br/>";
die();
}
l'erreur retournée est :
alors que j'aurai aimé unWarning: Invalid argument supplied for foreach() in essaiPDO.php on line 100
tu comprends mieu?You have an error on your SQL syntaxe, check the manuel...
$dbh->query() Retourne une ressourceforeach itère, que retourne $dbh->query ?
donc c'est normal que ça ne marche pas...Une fonctionnalité intéressante de PDO::query() est qu'il vous permet d'itérer à travers un jeu de résultats retourné par une requête SELECT exécutée avec succès.
$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 `matable`';
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 "Enregistrement numéro ".$a."<br />";
foreach($b as $cle=>$valeur){
echo $cle." = ".$valeur."<br />";
}
}
}
echo 'Nombre de requêtes effectuées: '.$connec->getnbrQuery();
si je fait une mauvaise requête je n'ai aucune erreur PDO...Juste pour information, il se sert à rien de faire un try / catch dans le constructeur si le catch ne fait que renvoyer l'exception. Autant ne pas entourer le constructeur par un bloc try / catch<?php class MyPDO extends PDO{ static $qriesCount = 0; public function __construct($dsn, $user, $pass){ try{ parent::__construct($dsn, $user, $pass); } catch(PDOException $e){ throw $e; } } public function query($qry){ try{ self::$qriesCount++; return(parent::query($qry)); } catch(Exception $eQry){ throw $eQry; } } public function getQueryCount(){ return (self::$qriesCount); } } $dsn = 'mysql:host=localhost; dbname=test'; $user = 'xxx'; $passWd = 'yyy'; 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 />'; $qrySel = 'SELECT COUNT(*) nombre FROM `livres`'; for($i = 0; $i < 3; $i++){ $resQrySel = $cnx->query($qrySel); if($i == 0){ $nbrRangs = $resQrySel->fetchAll(PDO::FETCH_OBJ); echo 'Valeur trouvée = ' . $nbrRangs[0]->nombre. '<br />'; } echo 'Requêtes : ' . $cnx->getQueryCount() . '<br />'; } ?>
Je ne suis pas entièrement d'accord avec toi.Juste pour information, il se sert à rien de faire un try / catch dans le constructeur si le catch ne fait que renvoyer l'exception. Autant ne pas entourer le constructeur par un bloc try / catch
Je ne suis pas sur que ce soit acceptable.Fatal error: Uncaught exception 'PDOException' with message '....'
Je regarde ça, mais ça me semble biz...si je fait une mauvaise requête je n'ai aucune erreur PDO...
/**
* 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;
}
}