2012-01-24 2 views
22

Je veux toujours PDO à lancer des exceptions en cas d'erreur, comme je l'utilise toujours AOP comme ceci:Set PDO pour lancer des exceptions par défaut

try { 
    $dbh = new PDO("mysql:host=$kdbhost;dbname=$kdbname",$kdbuser,$kdbpw); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    // some queries 
} 
catch (PDOException $e) { 
    error_log('PDO Exception: '.$e->getMessage()); 
    die('PDO says no.'); 
} 

Ce serait bien s'il y avait un fichier de configuration que je pourrais modifier pour faire en sorte que PDO jette des exceptions par défaut - est-ce possible?

La raison pour laquelle je veux c'est donc je ne pas écrire cette ligne à chaque fois:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Mise à jour - J'ai depuis créé une bibliothèque qui gère l'accès de base de données pour moi (y compris la définition de PDO pour lancer des exceptions).

+4

Je ne pense pas que ce que vous proposez est possible. Donc, si c'est quelque chose que vous faites souvent, pourquoi ne pas créer un objet autour de la fonctionnalité ou au moins séparer la fonctionnalité dans un fichier inclus dans la procédure? – rdlowrey

+0

En fait, si vous avez juste besoin d'intercepter des exceptions PDO lorsque la connexion est établie, vous n'avez pas besoin de définir l'attribut ATTR_ERRMODE. PDO :: __ construct() lancera toujours une exception PDOException si la connexion échoue quel que soit le PDO :: ATTR_ERRMODE actuellement défini – rodrunner

+0

Il n'est pas nécessaire de définir PDO, afin d'obtenir les informations d'erreur (si existantes) et d'éviter les séquences d'échappement ou SQL Injection est conseillé d'utiliser les instructions préparées, PDOStatement :: errorInfo retourner l'information que vous recherchez malgré ATT_ERRMODE. – Ivanzinho

Répondre

33

Vous pouvez ajouter la fonction setAttribute au constructeur:

$pdo = new PDO('mysql:host=localhost;dbname=someTable', 'username', 'password', array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
)); 

Mais je ne peux pas trouver une méthode pour l'ajouter au fichier php.ini ou un autre fichier de configuration.

21

Dans le prolongement au commentaire de rdlowrey, la façon la plus simple serait:

class MyPDO extends PDO { 

    public function __construct($dsn, $username = null, $password = null, array $driver_options = null) { 
     parent :: __construct($dsn, $username, $password, $driver_options); 
     $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

} 

invocation alors est simplement une question de

$dbh = new MyPDO("mysql:host=$kdbhost;dbname=$kdbname",$kdbuser,$kdbpw); 
Questions connexes