Попробуем принудительно вызвать 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", если видите это сообщение. Спасибо!
В этом примере замените адрес "Кому" и "От кого" для правильной отправки мэйла.