【发布时间】:2017-09-07 18:48:57
【问题描述】:
这是我的代码:
<?php
try{
// connect to database and select database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "spy";
$dbh_conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$dbh_conn->exec("set names utf8");
$dbh_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
我的代码也可以。但是我看到了一个类似的代码,它像这样检查连接:
if ( !$dbh_conn ){
// Something Went Wrong
} else {
// All Fine
}
那么我需要这个 ^ 条件吗?或者使用try catch 就足以检查数据库连接?
【问题讨论】:
-
不确定在这种特定情况下 try/catch 是否能正常工作......设置 PDO::ERRMODE_EXCEPTION 实际上是最后发生的事情,所以如果 PDO 之前不倾向于抛出异常那行,那么我假设 catch 块只会被默默地通过,如果建立连接本身不起作用,你可能会在以下几行中得到一个虚假的
$dbh_conn。您尝试在非对象上调用 exec 和 setAttribute 等方法只会导致标准错误消息,但也不会出现异常。 -
@uom-pgregorio 是的,你是对的,它甚至在页面上明确表示,如果尝试连接到请求的数据库,"PDO::__construct() 会抛出 PDOException失败。” - 即使尚未设置错误模式,情况也会如此,因此建立连接本身的错误将被捕获在 catch 块中。不确定 exec 或 setAttribute 调用之后是否真的会出错,但无论如何检查它们的成功可能是一个好主意。你不想继续 f.e.使用未正确设置连接字符集的数据库连接。