【问题标题】:Set PDO to throw exceptions by default [duplicate]将 PDO 设置为默认抛出异常 [重复]
【发布时间】:2012-02-18 01:14:22
【问题描述】:

如果发生错误,我总是希望 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 以引发异常)。

【问题讨论】:

  • 我不认为你的建议是可能的。所以,嗯,如果这是你经常做的事情,为什么不围绕功能创建一个对象,或者至少将功能分离到一个程序包含的文件中?
  • 其实如果只需要在连接建立时捕获PDO异常,就不需要设置ATTR_ERRMODE属性。如果连接失败,无论当前设置了哪个 PDO::ATTR_ERRMODE,PDO::__construct() 都会抛出 PDOException
  • 不需要设置PDO,为了获取错误信息(如果存在)并避免转义序列或SQL注入建议使用Prepared Statements,PDOStatement::errorInfo返回您正在查看的信息不管 ATT_ERRMODE。

标签: php mysql pdo php-ini


【解决方案1】:

可以在构造函数中添加setAttribute函数:

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

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

【讨论】:

    【解决方案2】:

    扩展 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);
    

    【讨论】:

    • @zerkms 我不知道我在写这篇评论时在想什么。谢谢,删除。
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多