我正在做这个(是的,我使用了错误的连接数据,这是为了强制连接错误)
26 try {
27 $connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;
28 } catch (Exception $e ) {
29 echo "Service unavailable";
30 exit (3);
31 }
但是PHP正在做这个php_warning:
mysqli :: mysqli():( 28000/1045):用户'my_user'@'localhost'拒绝访问(使用密码:YES)
在示例中,我使用错误的连接数据来强制连接错误,但在现实世界中,数据库可能已关闭,或者网络可能已关闭......等等。
问题:有没有办法,没有抑制警告,拦截数据库连接的问题?
答案 0 :(得分:40)
你需要告诉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;
}
现在你将捕获异常,你可以从那里拿走它。
答案 1 :(得分:10)
对于PHP 5.2.9 +
if ($mysqli->connect_error) {
die('Connect Error, '. $mysqli->connect_errno . ': ' . $mysqli->connect_error);
}
您也希望将报告模式设置为严格级别,就像jeroen建议的那样,但上面的代码对于专门检测连接错误仍然很有用。这两种方法的组合是PHP manual中推荐的。
答案 2 :(得分:2)
检查$connection->connect_error
值。
答案 3 :(得分:-3)
如果我们只做简单的if会有什么不同?如果简单的IF做了一切,为什么我会费心去尝试?
if ($mysqli->connect_errno)
{
echo "connection error, exiting...";
exit;
}
// everything was fine...
echo "hello, connection was established!"
答案 4 :(得分:-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()捕获此错误将失败。