2012-01-24 21 views
22

ho sempre voglia DOP per gettare eccezioni se si verifica un errore, come ho sempre usare DOP in questo modo:Set PDO per gettare le eccezioni di default

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.'); 
} 

Sarebbe bello se ci fosse un file di configurazione ho potuto modificare per renderlo così PDO genera eccezioni di default - è possibile?

La ragione per cui voglio che questo è in modo da non dover scrivere questa linea ogni volta:

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

Aggiornamento - allora ho creato una libreria che gestisce l'accesso al database per me (inclusa l'impostazione di PDO per generare eccezioni).

+4

Non credo che quello che suggeriscono è possibile. Quindi, se è qualcosa che fai spesso, perché non creare un oggetto attorno alla funzionalità o almeno separare la funzionalità in un file incluso proceduralmente? – rdlowrey

+0

In realtà, se è necessario rilevare le eccezioni PDO quando viene stabilita la connessione, non è necessario impostare l'attributo ATTR_ERRMODE. PDO :: __ construct() genererà sempre una PDOException se la connessione fallisce indipendentemente da quale PDO :: ATTR_ERRMODE è attualmente impostato – rodrunner

+0

Non è necessario impostare PDO, per ottenere le informazioni di errore (se esiste) ed evitare sequenze di escape o SQL Si consiglia l'iniezione per utilizzare le istruzioni preparate, PDOStatement :: errorInfo restituire le informazioni che si cercano indipendentemente ATT_ERRMODE. – Ivanzinho

risposta

33

È possibile aggiungere la funzione setAttribute al costruttore:

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

ma non riesco a trovare un metodo per aggiungere al file php.ini o qualche altro file di configurazione.

21

In estensione al commento di rdlowrey, il modo più semplice sarebbe:

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); 
    } 

} 

invocazione poi semplicemente è una questione di

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