PDO :: setAttribute()似乎不会影响新的PDO()?

时间:2015-05-31 13:10:01

标签: php mysql pdo

我有这段代码

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

我仍然得到同样的例外,我认为没有必要使用它?是吗?

1 个答案:

答案 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()必须是静态的,这样你就可以在获取类的实例之前设置/调用它。)