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
new mysqli(): how to intercept an 'unable to connect' error?
提问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
回答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() 捕获此错误将失败。

