Задать вопрос
@RoffDaniel

Как скрыть в ошибке PDO вывод данных от базы данных?

Добрый день, дамы и господа. Столкнулся с такой проблемой. Если, на пример, данные от базы не верны, PDO мне выдает ошибку. Вопрос не в "почему ошибка?", а в том, что в ошибке PDO выводит данные от базы. Их можно как-то скрыть? Для безопастности?

PDO->__construct('mysql:host=loca...', '***********...', '***********...') #1

Вместо звезд, выводит данные.
Заранее, спасибо!
  • Вопрос задан
  • 169 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Если вы показываете стектрейс пользователю - то это ваша ошибка независимо от того какие данные там видны. Ошибки кода вы должны логировать себе, а пользователю показывать красивую страницу 500.

PDO при подключении даёт не ошибку, а генерирует исключение. Именно для того чтобы его было легко перехватить, как и любое исключение, и обработать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Ответ выше правильный, но все всегда его понимают неверно.
Под перехватить имеется в виду не "тут же сразу на месте", а "там, где это удобно".

Удобно перехватывать ошибки либо в глобальном try-catch, либо в специализированном Exception handler-e.

Полностью готовое решение:
set_exception_handler(function ($e)
{
    error_log($e);
    http_response_code(500);
    if (ini_get('display_errors')) {
        echo $e;
    } else {
        echo "<h1>500 Internal Server Error</h1>
              An internal server error has been occurred.<br>
              Please try again later.";
    }
});

Взято из PHP error reporting
Плюсы:
  • работает для любых исключений, а не только для соединения PDO
  • корректно работает в любых окружениях - как боевом, так и тестовом
  • если надо поменять обработчик (например вывести другой текст/оформление) - это делается в одном месте.


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

Войдите, чтобы написать ответ

Похожие вопросы