new mysqli(): how to intercept an 'unable to c

2020-01-26 09:57发布

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:

mysqli::mysqli(): (28000/1045): Access denied for user 'my_user'@'localhost' (using password: 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 ?

标签: php mysqli
4条回答
来,给爷笑一个
2楼-- · 2020-01-26 10:02

For 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.

查看更多
爷、活的狠高调
3楼-- · 2020-01-26 10:18

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...

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.

查看更多
迷人小祖宗
4楼-- · 2020-01-26 10:21

You need to tell mysqli to throw exceptions:

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.

查看更多
放我归山
5楼-- · 2020-01-26 10:25

Check $connection->connect_error value.

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

查看更多
登录 后发表回答