Я делаю это (да, я использую неправильные данные соединения, это вынуждает ошибку подключения)
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)
В примере я использую неправильные данные соединения, чтобы вызвать ошибку соединения, но в реальном мире база данных может быть недоступна, или сеть может быть отключена … и т. Д.
Вопрос: Есть ли способ, не подавляя предупреждения, перехватывать проблему с соединением с базой данных?
Вы должны сказать 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 () не удастся.