Ошибки подключения к базе в Битриксе. Свой текст ошибки

Если в настройках установлен вывод ошибок, то при возникновении ошибок базы данных Битрикс выводит на страницу сайта SQL запрос, который закончился ошибкой. . Это небезопасно, потому что в таком случае посетители сайта могут понять, как устроена база данных и выяснить слабые места сайта. Поэтому рекомендуем сделать страницу-заглушка, которая будет показываться вместо ошибки.

Попробуем принудительно вызвать SQL ошибку на сайте, чтобы посмотреть как она выглядит. Для этого на любой странице сайта напишем код, который обращается к базе данных:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
global $DB;
$sql = 'SELECT * FROM';
$DB->Query($sql);
?>
Если загрузить страницу с таким кодом, то битрикс сообщит об ошибке и будет выведена только половина страницы до возникшей ошибки. Сообщение об ошибке будет выглядеть так: Можно такой вывод ошибки на собственную страницу, на которой можно написать, к примеру, обращение к пользователям сайта. Для создания такой страницы необходимо в папке сайта /bitrix/php_interface/ создать файл PHP файл с названием dbquery_error.php.
Рекомендуем ознакомиться со статьёй "Загрузка файлов на сайт с помощью FileZilla", в которой описан процесс работы с программой, которая может загрузить файл с вашего компьютера на сервер с сайтом. А так же с одной из статей. описывающих редактор файлов на сервере: "Средство разработки: Notepad++" или "Средство разработки: Atom"
После создания dbquery_error.php, вставьте в этот файл следующий код для обработки ошибки. В начале кода должны содержаться функции, которые очистят буфер вывода, иначе сообщение об ошибке все равно будет выведено:
<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$str = ob_get_contents(); // здесь находится сообщение об ошибке
ob_clean(); // очищаем буфер вывода
?>
Ой! В нашей базе данных случилась ошибка. Пожалуйста, напишите нам на "мэйл@адрес.ru", если видите это сообщение. Спасибо!
Первая строчка в примере if(!defined("B_PROLOG_INCLUDED") ... die(); не позволит скрипту выполниться, если пользователь перейдёт по адресу ваш_сайт.ru/bitrix/php_interface/dbquery_error.php. Код будет выполняться, только если он вызван из другого скрипта.
Чтобы иметь оперативную связь можно запрограммировать автоматическую отсылку мэйла на адрес техподдержки сайта внутри файла dbquery_error.php. Потому что если этот файл будет исполнен, то это значит, что ошибка уже есть на сайте. Поэтому предлагаем дописать предыдущий пример, добавив код отправки мэйла:
<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$str = ob_get_contents(); // здесь находится сообщение об ошибке
ob_clean(); // очищаем буфер вывода

// посылаем отчет об ошибке нам
   global $APPLICATION;
   $curPage = $APPLICATION->GetCurPage(); // адрес страницы сайта, на которой возникла ошибка

   $eol = "\n";
   $to = 'мэйла@адрес_техподдержки.ru'; // кому отправлять мэйл

   $subject = 'Ошибка MySql ' . date("Y-m-d H:i:s"); // дата возникновения ошибки
   $message = 'Ошибка MySql:' . $str . $eol;
   $message = 'Возникла на странице: ' . $curPage . $eol;
   $message = wordwrap($message, 900, $eol); // ограничение ширины строки в письме

   $head   = array();
   $head[] = "MIME-Version: 1.0";
   $head[] = "Content-type: text/plain; charset=UTF-8";
   $head[] = "From: мэйл@адрес_сайта.ru <мэйл@адрес_сайта.ru>"; // от кого отправлять мэйл
   $head[] = "Subject: " . $subject;

   $a = mail($to, $subject, $message, implode("\r\n", $head));
?>
Ой! В нашей базе данных случилась ошибка. Пожалуйста, напишите нам на "мэйл@адрес.ru", если видите это сообщение. Спасибо!
В этом примере замените адрес "Кому" и "От кого" для правильной отправки мэйла.
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, покупка SSL сертификатов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Была ли эта статья полезна? Есть вопрос?
Cмотрите другие статьи: