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

时间:2013-03-21 16:53:54

标签: php mysqli

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

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)

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

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

5 个答案:

答案 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值。

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

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