2012-01-24 36 views
22

Tôi luôn luôn muốn PDO để ném ngoại lệ nếu một lỗi xảy ra, như tôi luôn luôn sử dụng PDO như vậy:Set PDO để ném ngoại lệ theo mặc định

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

Nó sẽ được tốt đẹp nếu có một tập tin cấu hình tôi có thể chỉnh sửa để làm cho nó như vậy PDO ném ngoại lệ theo mặc định - là điều này có thể?

Lý do tôi muốn điều này là vì vậy tôi không phải viết dòng này mỗi lần:

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

Cập nhật - Tôi có kể từ khi tạo ra một thư viện mà xử lý truy cập cơ sở dữ liệu cho tôi (bao gồm thiết lập PDO để ném ngoại lệ).

+4

Tôi không nghĩ rằng những gì bạn đề nghị là có thể. Vì vậy, umm, nếu nó là một cái gì đó bạn thường xuyên, tại sao không tạo ra một đối tượng xung quanh chức năng hoặc ít nhất là tách các chức năng vào một tập tin procedurally bao gồm? – rdlowrey

+0

Trên thực tế, nếu bạn chỉ cần bắt các ngoại lệ PDO khi kết nối được thiết lập, bạn không cần đặt thuộc tính ATTR_ERRMODE. PDO :: __ construct() sẽ luôn ném một PDOException nếu kết nối không thành công bất kể PDO :: ATTR_ERRMODE nào được đặt là – rodrunner

+0

Không cần thiết lập PDO, để lấy thông tin lỗi (nếu tồn tại) và tránh các chuỗi thoát hoặc SQL Tiêm được khuyến khích sử dụng báo cáo đã chuẩn bị, PDOStatement :: errorInfo trả về thông tin bạn đang tìm kiếm bất kể ATT_ERRMODE. – Ivanzinho

Trả lời

33

Bạn có thể thêm chức năng setAttribute để các nhà xây dựng:

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

Nhưng tôi không thể tìm thấy một phương pháp để thêm nó vào tập tin php.ini hoặc một số tập tin cấu hình khác.

21

Trong phần mở rộng để bình luận rdlowrey của, cách dễ nhất sẽ là:

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

} 

gọi sau đó chỉ đơn giản là một vấn đề của

$dbh = new MyPDO("mysql:host=$kdbhost;dbname=$kdbname",$kdbuser,$kdbpw); 
Các vấn đề liên quan