php new mysqli():如何拦截“无法连接”错误?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15553496/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 09:27:40  来源:igfitidea点击:

new mysqli(): how to intercept an 'unable to connect' error?

phpmysqli

提问by realtebo

I'm doing this (yes, I'm using wrong connection data, it's to force a connection error )

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

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

But PHP is doing this php_warning:

但是 PHP 正在做这个 php_warning:

mysqli::mysqli(): (28000/1045): Access denied for user 'my_user'@'localhost' (using password: YES)

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

In the example I'm using wrong connection data to force a connection error, but in the real world the database could be down, or the network could be down... etc..

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

Question:Is there a way, without suppressing warnings,to intercept a problem with the database connection ?

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

回答by jeroen

You need to tell mysqli to throw exceptions:

你需要告诉 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;
}

Now you will catch the exception and you can take it from there.

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

回答by TonyArra

For PHP 5.2.9+

对于 PHP 5.2.9+

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

You'll want to set the Report Mode to a strict level as well, just as jeroen suggests, but the code above is still useful for specifically detecting a connection error. The combination of those two approaches is what's recommended in the PHP manual.

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

回答by ulentini

Check $connection->connect_errorvalue.

检查$connection->connect_error值。

See the example here: http://www.php.net/manual/en/mysqli.construct.php

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

回答by HoldOffHunger

mysqli_report(MYSQLI_REPORT_STRICT);, as described elsewhere, gives me an error and stops the script immediately. But this below seems to provide the desired output for me...

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

Attempting to catch this error with try..catch() will fail.

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