2012-01-24 13 views
22

Zawsze chcę PDO rzucać wyjątków w przypadku wystąpienia błędu, a ja zawsze używać PDO tak:Set PDO rzucać wyjątki domyślnie

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

Byłoby miło, gdyby nie było to plik konfiguracyjny mogę edytować aby było tak, że PDO domyślnie wyrzuca wyjątki - czy to możliwe?

Powodem chcę to tak nie mam napisać ten wiersz za każdym razem:

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

Aktualizacja - I od tego czasu stworzył bibliotekę, która obsługuje dostęp do bazy danych (dla mnie w tym ustawienie PDO do zgłaszania wyjątków).

+4

Nie sądzę, co proponujesz jest możliwe. Więc, umm, jeśli jest to coś, co robisz często, dlaczego nie utworzyć obiektu wokół funkcjonalności lub przynajmniej oddzielić funkcjonalność w pliku zawartym proceduralnie? – rdlowrey

+0

W rzeczywistości, jeśli po nawiązaniu połączenia wystarczy przechwycić wyjątki PDO, nie trzeba ustawiać atrybutu ATTR_ERRMODE. PDO :: __ construct() zawsze rzuci wyjątek PDOException, jeśli połączenie nie powiedzie się bez względu na to, które PDO :: ATTR_ERRMODE jest aktualnie ustawione – rodrunner

+0

Nie jest konieczne ustawianie PDO, aby uzyskać informacje o błędzie (jeśli istnieje) i unikać sekwencji escape lub SQL Zaleca się, aby wtryskiwanie korzystało z Przygotowanych instrukcji, PDOStatement :: errorInfo zwraca informacje, których szukasz bez względu na ATT_ERRMODE. – Ivanzinho

Odpowiedz

33

Możesz dodać funkcję setAttribute do konstruktora:

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

Ale nie mogę znaleźć sposobu, aby dodać go do pliku php.ini lub innego pliku konfiguracyjnego.

21

W przedłużenie komentarzu rdlowrey jest najprostszym sposobem byłoby:

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

} 

inwokacja po prostu to kwestia

$dbh = new MyPDO("mysql:host=$kdbhost;dbname=$kdbname",$kdbuser,$kdbpw); 
Powiązane problemy