АКЦИЯ: бесплатные месячные курсы по созданию сайтов
на выбор: верстка, JavaScript, PHP или фреймворки. Сегодня последний день для записи! Жми!
60 of 95 menu
НОВИНКА: Практика на Реальных Проектах и Работы в Портфолио. Бесплатный курс! Жми для записи!

Выключение ошибок базы данных SQL в PHP

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

<?php error_reporting(0); ini_set('display_errors', 'off'); ?>

Этот код, однако, выключает ошибки самого PHP, но никак не ошибки SQL! Дело в том, что классическая схема вывода ошибок SQL, описанная во всех учебниках осуществляется через функцию die:

<?php $query = 'SELECT * FROM users'; $res = mysqli_query($link, $query) or die(mysqli_error($link)); ?>

Понятно, что в этом случае отключение ошибок PHP не повлияет на вывод ошибок SQL. Однако, отключить ошибки SQL тоже очень важно. И дело даже не в том, что пользователь их увидит.

Проблема в том, что эти ошибки будет видеть злоумышленник. А вывод ошибок SQL устроен таким образом, что в ошибке показывается часть запроса. Это значит, что намеренно создавая ошибки, злоумышленник может выяснить имена таблиц и имена полей в них! А эта информация поможет ему в дальнейшем взломе сайта.

Однако, при разработке на локальном компьютере ошибки SQL нам все-таки хотелось бы видеть, для удобства. Давайте сделаем так, чтобы в режиме разработки ошибки были видны, а на продакшене (то есть в интернете) - нет.

Определим для этого следующую константу, содержающую нужный режим:

<?php define('MODE', 'prod'); // dev или prod ?>

Будем показывать ошибку только в режиме разработки:

<?php $query = 'SELECT * FROM users'; $res = mysqli_query($link, $query); if (!$res and MODE === 'dev') { die(mysqli_error($link)) } ?>

Для удобства, чтобы постоянно не дублировать код, можно оформить запросы в виде функции:

<?php function query($link, $query) { $res = mysqli_query($link, $query); if (!$res and MODE === 'dev') { die(mysqli_error($link)) } } ?>

И тогда с помощью нашей функции мы будем выполнять запросы вот так:

<?php query($link, 'SELECT * FROM users'); ?>

Намеренно создайте ошибку SQL. Убедитесь в том, что вы увидите часть запроса с некоторыми именами полей и/или таблиц.

Реализуйте описанное переключение режима. Потестируйте его.