【问题标题】:How can I check PDO connection?如何检查 PDO 连接?
【发布时间】: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.使用未正确设置连接字符集的数据库连接。

标签: php mysql pdo


【解决方案1】:

这取决于您为PDO::ATTR_ERRMODE 设置的内容。在你的情况下,它被设置为PDO::ERRMODE_EXCEPTION,所以一个错误会抛出一个异常。

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

但是,当您连接时(即在 PDO 中调用 __constructor() 时)不会应用此错误模式,因为始终会抛出 PDOException

无论当前设置了哪个 PDO::ATTR_ERRMODE,如果连接失败,PDO::__construct() 将始终抛出 PDOException。未捕获的异常是致命的。

您可以阅读不同的模式here

【讨论】:

  • 所以我的代码没问题,不需要那个条件,对吧?
  • 那个特定的位不需要它,因为如果出现错误,PDOException 将被抛出,并且你已经准备好抓住它。但是,您对$dbo_conn 处理程序的任何进一步使用 均受ATTR_ERRMODE 约束。不过,我会在创建连接后立即设置ATTR_ERRMODE,以尽量减少可能发生的任何未发现问题。
  • 您甚至可以在 PDO 构造函数的可选数组参数中设置属性,就在用户和密码之后。
  • 对,全都忘记了。 $dbh_conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password, [PDO::ATTR_EMULATE_PREPARES =&gt; false, PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION]);
  • 你知道,我仍然不知道我应该如何准确地编写我的代码?因为我不知道PDO::ATTR_EMULATE_PREPARESPDO::ATTR_ERRMODE是什么。
猜你喜欢
  • 1970-01-01
  • 2013-01-20
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多