我正在这样做(是的,我使用了错误的连接数据,这是为了强制连接错误)
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)
在示例中,我使用错误的连接数据来强制连接错误,但在现实世界中,数据库可能会关闭,或者网络可能会关闭......等等......
问题:有没有办法,不抑制警告,拦截数据库连接问题?
你需要告诉 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);
}
现在您将捕获异常,并且可以从那里获取它。
适用于 PHP 5.2.9+
if ($mysqli->connect_error) {
die('Connect Error, '. $mysqli->connect_errno . ': ' . $mysqli->connect_error);
}
您还需要将报告模式设置为严格级别,正如 jeroen 所建议的那样,但上面的代码对于专门检测连接错误仍然有用。 PHP 手册中建议结合使用这两种方法。
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() 捕获此错误将会失败。