我有这段代码
try {
$dbh = new PDO('mysql:host=localhost;dbname=db_informations', 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo $e->getMessage();
}
它给了我异常信息:
SQLSTATE [HY000] [1049]未知数据库' db_informations'
因为我的数据库的正确名称仅为db_information
。
我的问题是,即使我不包括该行:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
我仍然得到同样的例外,我认为没有必要使用它?是吗?
答案 0 :(得分:2)
这只是因为您可以在PDO::__construct()
中阅读manual的行为:
如果尝试连接到请求的数据库失败,PDO :: __ construct()会抛出 PDOException 。
但是如果你没有将错误模式设置为Exception,那么你可以:
try {
$dbh = new PDO('mysql:host=localhost;dbname=db_informations', 'root', '');
$dbh->query("SELECT * FROM aTableWhichDoesNotExists");
} catch(PDOException $e) {
echo $e->getMessage();
}
您不会收到任何删除消息或错误,因为您没有设置错误模式。所以你需要这样做:
try {
$dbh = new PDO('mysql:host=localhost;dbname=db_informations', 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->query("SELECT * FROM aTableWhichDoesNotExists");
} catch(PDOException $e) {
echo $e->getMessage();
}
接收异常,然后您可以捕获:
SQLSTATE [42S02]:未找到基表或视图:1146表'test.atablewhichdoesnotexists'不存在
另外,如果你只是逻辑思考:
setAttribute()
需要与->
一起使用,这意味着您需要该类的实例来调用该方法。那么,如果无法正确创建实例,您将如何调用该方法?
(所以这意味着setAttribute()
必须是静态的,这样你就可以在获取类的实例之前设置/调用它。)