Выключение ошибок базы данных 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. Убедитесь в том, что вы увидите часть запроса с некоторыми именами полей и/или таблиц.
Реализуйте описанное переключение режима. Потестируйте его.