new mysqli():如何拦截“无法连接”错误? [重复]

问题描述 投票:0回答:4

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

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”访问被拒绝(使用密码:YES)

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

问题:有没有办法,不抑制警告,拦截数据库连接问题?

php mysqli
4个回答
42
投票

你需要告诉 mysqli 抛出异常:

mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_STRICT);

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

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


9
投票

适用于 PHP 5.2.9+

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

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


2
投票

检查

$connection->connect_error
值。

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


-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() 捕获此错误将会失败。

© www.soinside.com 2019 - 2024. All rights reserved.