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.
Ответ 3
Проверьте значение $connection->connect_error
.
См. пример здесь: http://www.php.net/manual/en/mysqli.construct.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() завершится с ошибкой.