16

我正在这样做(是的,我使用了错误的连接数据,这是为了强制连接错误)

try {
    $connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;
} catch (Exception $e ) {
    echo "Service unavailable";
    exit (3);
}

但是 PHP 正在做这个 php_warning:

mysqli::mysqli(): (28000/1045): 用户'my_user'@'localhost'的访问被拒绝(使用密码:是)

在示例中,我使用错误的连接数据来强制连接错误,但在现实世界中,数据库可能已关闭,或者网络可能已关闭......等等。

问题:有没有办法在不抑制警告的情况下拦截数据库连接问题?

4

4 回答 4

41

你需要告诉 mysqli 抛出异常:

mysqli_report(MYSQLI_REPORT_STRICT);

try {
     $connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;
} catch (Exception $e ) {
     echo "Service unavailable";
     echo "message: " . $e->message;   // not in live code obviously...
     exit;
}

现在您将捕获异常,您可以从那里获取它。

于 2013-03-21T17:04:11.023 回答
10

对于 PHP 5.2.9+

if ($mysqli->connect_error) {
    die('Connect Error, '. $mysqli->connect_errno . ': ' . $mysqli->connect_error);
}

正如 jeroen 建议的那样,您还需要将报告模式设置为严格级别,但上面的代码对于专门检测连接错误仍然很有用。这两种方法的组合是PHP 手册中推荐的方法。

于 2013-03-21T16:58:44.333 回答
2

检查$connection->connect_error值。

请参阅此处的示例:http ://www.php.net/manual/en/mysqli.construct.php

于 2013-03-21T16:59:03.487 回答
-3

mysqli_report(MYSQLI_REPORT_STRICT);,如其他地方所述,给我一个错误并立即停止脚本。但是下面这似乎为我提供了所需的输出......

error_reporting(E_ERROR);

$connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;

error_reporting(E_ERROR | E_WARNING | E_PARSE);

if($connection->connect_errno)
{
  // Database does not exist, you lack permissions, or some other possible error.
    if(preg_match($connection->connect_error, "Access denied for user"))
    {
        print("Access denied, or database does not exist.");
    }
    else
    {
        print("Error: " . $connection->connect_error);
    }
}

尝试使用 try..catch() 捕获此错误将失败。

于 2016-05-30T00:30:14.027 回答