New mysqli(): как перехватить ошибку "невозможно подключиться"?

Я делаю это (да, я использую неправильные данные соединения, чтобы вызвать ошибку соединения)

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): Access denied for user 'my_user'@'localhost' (using password: YES)

В этом примере я использую неправильные данные соединения, чтобы вызвать ошибку соединения, но в реальном мире база данных может быть недоступна, или сеть может быть недоступна... и т.д.

Вопрос: Есть ли способ, не подавляя предупреждения, перехватить проблему с подключением к базе данных?

Ответы

Ответ 1

Вам нужно сказать 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;
}

Теперь вы поймаете исключение, и вы можете взять его оттуда.

Ответ 2

Для PHP 5.2.9 +

if ($mysqli->connect_error) {
    die('Connect Error, '. $mysqli->connect_errno . ': ' . $mysqli->connect_error);
}

Вы также должны установить режим отчета на ровном уровне, как и предлагает jeroen, но приведенный выше код по-прежнему полезен для конкретного обнаружения ошибки соединения. Комбинация этих двух подходов - это то, что рекомендуется в руководстве PHP.

Ответ 4

В чем разница, если мы просто делаем простой, если? почему я буду беспокоиться о попытке и поймать, если простой IF делает все?

if ($mysqli->connect_errno)
{
   echo "connection error, exiting...";
   exit;
}

// everything was fine...

echo "hello, connection was established!"

Ответ 5

mysqli_report (MYSQLI_REPORT_STRICT);, как описано в другом месте, дает мне ошибку и немедленно останавливает script. Но это ниже, кажется, дает желаемый результат для меня...

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() завершится с ошибкой.