2012-01-24 188 views
22

我总是想,如果发生错误,PDO抛出异常抛出异常,因为我总是使用PDO像这样:设置PDO默认

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

这将是很好,如果有一个配置文件,我可以编辑为了让PDO默认引发异常 - 这可能吗?

我想这样做的原因是,所以我没有写这行每次:

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

更新 - 因为我已经创建了处理数据库的访问对我来说是库(包括设置PDO来抛出异常)。

+4

的问题,我不认为你所说的其实是可能的。那么,呃,如果这是你经常做的事情,那么为什么不围绕这个功能创建一个对象,或者至少将这个功能分成一个程序化包含的文件? – rdlowrey

+0

实际上,如果您只需在建立连接时捕获PDO异常,则不需要设置ATTR_ERRMODE属性。 PDO :: __ construct()将始终抛出PDOException,如果连接失败,无论当前设置了哪个PDO :: ATTR_ERRMODE – rodrunner

+0

为了获取错误信息(如果存在)并避免转义序列或SQL,不需要设置PDO注意建议使用Prepared Statements,PDOStatement :: errorInfo返回您正在查找的信息,而不管ATT_ERRMODE。 – Ivanzinho

回答

33

您可以添加的setAttribute函数的构造器:

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

但我不能找到将其添加到php.ini文件或其他一些配置文件的方法。

21

在扩展rdlowrey的评论,最简单的方法是:

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

} 

调用后来干脆是

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