Делаем лог-файл для ошибок БД в DLE
У нашей, всеми боготворимой, системы, жрать один-одинехонек дефект. Этот дефект может и не проявлять себя, если оплошек с базой настоящих происходит капля, давай или оплошки неплотны.
В данной статья я научу вас, будто сделать лог-файл для оплошек базы настоящих в системе управления сайтом Data Life Engine. Кроме того, информация об оплошке будет двигать на ваш электронный адрес.
А вместо того, что бы отображать информацию об оплошке БД в системе, сделаем заглушку из статической страницы. Слепок какой вы должны сделать самостоятельно(сохранить основную страницу на жесткий диск в облике html файла).
Если учесть, что программа будет еще и отсылать послания, тогда это вообще будет чудом для программиста. К образцу, на моем телефоне настроен электронный ящик, и о любых извещениях почты я выведаю залпом(орет будто бешеный). Это величаво, т.к. сайты жрать неодинаковые, в них по неодинаковому инвестируют гроши, и за любые оплошки программисту могут отвлечь любые конечности. Извещения дармовые, в отличие от смсок.
1. Забегите на основную страницу своего проекта. Заведите в адресной строке адрес несуществующей страницы, сохраните страницу.
2. В сохраненной странице исправьте информацию о ненайденной статической странице на информацию об оплошке связанной с базой настоящих. Ввергните информацию об электронном ящике администратора, а настолько же разработчика. Резон в том, что бы информацию об оплошке БД вообще не отображать, вообще никакую. Надобная информация будет сохраняться в лог-файл и отсылаться на электронный адрес. Впрочем можно попросту сохранить основную страницу и ничего не менять.
Файл-заглушка будет настолько же здоров и сеошникам.
3. Наименуйте страницу “db.html”, и примостите её в папку “templates”. Адрес сохраненной страницы будет “templates/db.html”.
4. Создайте папку “engine/logs”, с правами 755. В папку примостите файл.htaccess, такового содержания:
Order Deny,Allow
Deny from all
Deny from all
Это прекроет доступ к лог-файлу.
5. Создайте файл “engine/logs/db.txt”, с правами 666.
6. Откройте файл engine/classes/mysqli.class.php для редактирования.
Найдите в нем следующие строки:
function display_error($error, $error_num, $query = '')
{
if($query) {
// Safify query
$query = preg_replace("/([0-9a-f]){32}/", "********************************", $query); // Hides all hashes
$query_str = "$query";
}
echo '
MySQL Fatal Error
MySQL Error!
------------------------
The Error returned was:
'.$error.'
Error Number:
'.$error_num.'
'.$query_str.'
';
exit();
}
{
if($query) {
// Safify query
$query = preg_replace("/([0-9a-f]){32}/", "********************************", $query); // Hides all hashes
$query_str = "$query";
}
echo '
MySQL Fatal Error
MySQL Error!
------------------------
The Error returned was:
'.$error.'
Error Number:
'.$error_num.'
'.$query_str.'
';
exit();
}
и замените эти строки на эти строки:
function display_error($error, $error_num, $query = '')
{
if( ( $f = @fopen("engine/logs/db.txt","a") ) ){
if( @fwrite( $f, date( 'Y-m-d H:i:s' ).";t#: {$error_num};tdescription: {$error};tquery: {$query} endquery;n" ) ){
@fclose($f);
}
}
$header="From: "CMS DLE" ";
$header.="Content-type: text/plain; charset="windows-1251"";
@mail("admin@mail.ru", "DB error on SiteInfo with ".DBNAME.", time ".date( 'Y-m-d H:i:s' ), "Error number: {$error_num}nDescription: {$error}nQuery: {$query}nnn-----------------"."nDB user: ".DBUSER."nDB pass:".DBPASS."nDB name: ".DBNAME."nDB host:".DBHOST."nnnDate and time: ".date( 'Y-m-d H:i:s' )."n-----------------nnnSERVER print_r: ". print_r($_SERVER, true), $header);
$file_ = "templates/db.html";
if(file_exists( $file_ )){
@readfile( $file_ );
}else{
echo "DB error. E-mail administrator admin@mail.ru. Please wait 10 minutes and try again.";
}
exit();
}
{
if( ( $f = @fopen("engine/logs/db.txt","a") ) ){
if( @fwrite( $f, date( 'Y-m-d H:i:s' ).";t#: {$error_num};tdescription: {$error};tquery: {$query} endquery;n" ) ){
@fclose($f);
}
}
$header="From: "CMS DLE" ";
$header.="Content-type: text/plain; charset="windows-1251"";
@mail("admin@mail.ru", "DB error on SiteInfo with ".DBNAME.", time ".date( 'Y-m-d H:i:s' ), "Error number: {$error_num}nDescription: {$error}nQuery: {$query}nnn-----------------"."nDB user: ".DBUSER."nDB pass:".DBPASS."nDB name: ".DBNAME."nDB host:".DBHOST."nnnDate and time: ".date( 'Y-m-d H:i:s' )."n-----------------nnnSERVER print_r: ". print_r($_SERVER, true), $header);
$file_ = "templates/db.html";
if(file_exists( $file_ )){
@readfile( $file_ );
}else{
echo "DB error. E-mail administrator admin@mail.ru. Please wait 10 minutes and try again.";
}
exit();
}
7. Сохраните файл и откройте подобный файл engineclassesmysql.class.php для редактирования. Замените те же самые строки, что указано выше.
* Данные файлы дублируют программный код, они сделаны для разных версий MySQL.
8. Замените адреса электронной почты в новом вставляемом коде.
Найти во вставляем коде и заменить в соответсвии:
email@site.ru – почта, якобы от которой отправлено письмо, 1 раз заменить на почту вашего сайта,
admin@mail.ru – ваша почта, заменить два раза на свою почту.
Теперь поясню код.
if( ( $f = @fopen("engine/logs/db.txt","a") ) ){
if( @fwrite( $f, date( 'Y-m-d H:i:s' ).";t#: {$error_num};tdescription: {$error};tquery: {$query} endquery;n" ) ){
@fclose($f);
}
}
- это запись информации в лог-файл (номер ошибки, описание, запрос).
$header="From: "CMS DLE" ";
$header.="Content-type: text/plain; charset="windows-1251"";
@mail("admin@mail.ru", "DB error on SiteInfo with ".DBNAME.", time ".date( 'Y-m-d H:i:s' ), "Error number: {$error_num}nDescription: {$error}nQuery: {$query}nnn-----------------"."nDB user: ".DBUSER."nDB pass:".DBPASS."nDB name: ".DBNAME."nDB host:".DBHOST."nnnDate and time: ".date( 'Y-m-d H:i:s' )."n-----------------nnnSERVER print_r: ". print_r($_SERVER, true), $header);
- отправка письма, в кодировке с поддержкой кириллицы (в теме вставляется название базы данных и время с датой, в самом сообщении номер ошибки, описание, запрос, данные для соединения с базой данных, время и дата, а так же подробная информация о запросе страницы).
$file_ = "templates/db.html";
if(file_exists( $file_ )){
@readfile( $file_ );
}else{
echo "DB error. E-mail administrator admin@mail.ru. Please wait 10 minutes and try again.";
}
- выводиться файл заглушка, который вы подготовили чуть ранее. Если файл не будет найден, выведется краткая информация о том, что произошла ошибка с БД.
Каждый из отдельных блоков можно удалять, например если вам вовсе не нужны сообщения на емайл, удалите код, который отправляет письма. Если вам не нужен лог-файл вовсе – удалите код который производит запись в лог файл. Можно удалить и то и это, тогда просто выведется страница заглушка и не будет отображена информация об ошибке БД.
Внимание! В сообщении на почту отправляются данные для соединения с БД, если вам такая роскошь не нужна (а это еще и к тому же опасно, если ваш ящик взломают) то удалите ниже приведенный код из вставляемого кода в классы БД (вы делали это выше).
"."nDB user: ".DBUSER."nDB pass:".DBPASS."nDB name: ".DBNAME."nDB host:".DBHOST."
Пожалуй это всё. Сообразительные могут продолжить идею, к примеру, вставлять шаблон главной страницы (заменив теги системы) вместо файла заглушки.