我使用以下类来创建和访问 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/