Intereting Posts
PMA 4.5.2.0 file_exists (): ограничение open_basedir Почему изменения в некоторых php-файлах так долго отображаться на живом сайте Как отправить на мою собственную страницу с помощью API Facebook Можно ли передать параметр маршрута в конструктор контроллера в Laravel? В php я отправляю почту с помощью mail (), она не должна сохраняться в папке отправленных элементов Как получить доступ к динамическому свойству с помощью переменной? Изображение из базы данных MySQL не распечатывается Создание 300 экземпляров blockui Поля MySQL datetime и летнее время – как я могу ссылаться на «дополнительный» час? password_verify не возвращает true / false Могу ли я изменить цвет фона на основе значения внутри него? Получить название страницы / URL как я могу определить, работает ли mysql_real_escape_string не удалось открыть поток: не найдено подходящей обертки Справочный файл в более высоком каталоге?

new 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)

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

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

Solutions Collecting From Web of "new mysqli (): как перехватить ошибку «невозможно подключиться»?"

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

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

Для PHP 5.2.9+

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

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

Проверьте значение $connection->connect_error .

См. Пример здесь: http://www.php.net/manual/en/mysqli.construct.php

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

 if ($mysqli->connect_errno) { echo "connection error, exiting..."; exit; } // everything was fine... echo "hello, connection was established!" 

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 () не удастся.