php - 使用类访问时未捕获 PDO 异常

标签 php oop pdo try-catch

我使用以下类来创建和访问 PDO 数据库连接:

class DBCxn {
    // What Data Source Name to connect to?
    public static $dsn='mysql:host=localhost;dbname=dbname';
    public static $user = 'root';
    public static $pass = 'root';
    public static $driverOpts = null;

    // Internal variable to hold the connection
    private static $db;
    // no cloning or instantiating allowed
    final private function __construct() {}
    final private function __clone() {}

    public static function get() {
        // Connect if not allready connected
        if (is_null(self::$db)) {
            self::$db = new PDO(self::$dsn, self::$user, self::$pass, self::$driverOpts);       
        }

    // Return the connection
    return self::$db;
    }

}

当我尝试通过以下方式访问它并且提供的查询失败(tes 而不是 test)时,它不会抛出异常:

$db = DBCxn::get();


try {

    foreach($db->query('SELECT * from tes') as $row) {
        print_r($row);
    }
    $db = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

代码返回警告:为 foreach() 提供的参数无效

为什么异常没有被捕获?

最佳答案

PHP 生成的警告和错误(例如您收到的无效参数警告)并不总是异常(exception)。即使它们是,您也会专门捕获 PDOException,并且无效参数不是 PDOException

PDO::query如果查询中有错误,通常会返回 false(因此 foreach 会提示参数无效)。要引发异常,您还应该调用

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

在进行查询之前。

关于php - 使用类访问时未捕获 PDO 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34714008/

相关文章:

php - 执行长 Action

c# - C# 和 VB 中的 Overridable 和 Override

php - 在 php 中系统化 web 应用程序的错误代码?

php - 如何使 php 与 postgresql 一起工作?

java - 在 Android 中组合来自服务器的 JSON 表

php - 如何在 jQuery 的同一窗口中加载 PHP 页面

php - MySQL如何从不同的表中查询一次得到两个结果

oop - 一些可靠的 OOP 批评?

php - 为什么 PDO 在这里只返回一行?

mysql - 是否可以将多行结果压缩为 SQL 查询中一行上的集合对象?