друзья
реклама
|
Для вебмастера » DLE - DataLife Engine → Делаем лог-файл для ошибок БД в 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 Это прекроет доступ к лог-файлу.
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 '<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>MySQL Fatal Error</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <style type="text/css"> <!-- body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-style: normal; color: #000000; } --> </style> </head> <body> <font size="4">MySQL Error!</font> <br />------------------------<br /> <br /> <u>The Error returned was:</u> <br /> <strong>'.$error.'</strong> <br /><br /> </strong><u>Error Number:</u> <br /> <strong>'.$error_num.'</strong> <br /> <br /> <textarea name="" rows="10" cols="52" wrap="virtual">'.$query_str.'</textarea><br /> </body> </html>'; 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\" <[email protected]>"; $header.="Content-type: text/plain; charset=\"windows-1251\""; @mail("[email protected]", "DB error on SiteInfo with ".DBNAME.", time ".date( 'Y-m-d H:i:s' ), "Error number: {$error_num}\nDescription: {$error}\nQuery: {$query}\n\n\n-----------------"."\nDB user: ".DBUSER."\nDB pass:".DBPASS."\nDB name: ".DBNAME."\nDB host:".DBHOST."\n\n\nDate and time: ".date( 'Y-m-d H:i:s' )."\n-----------------\n\n\nSERVER print_r: ". print_r($_SERVER, true), $header); $file_ = "templates/db.html"; if(file_exists( $file_ )){ @readfile( $file_ ); }else{ echo "DB error. E-mail administrator [email protected]. Please wait 10 minutes and try again."; } exit(); } 7. Сохраните файл и откройте подобный файл engine\classes\mysql.class.php для редактирования. Замените те же самые строки, что указано выше. * Данные файлы дублируют программный код, они сделаны для разных версий MySQL. 8. Замените адреса электронной почты в новом вставляемом коде. Найти во вставляем коде и заменить в соответсвии: [email protected] – почта, якобы от которой отправлено письмо, 1 раз заменить на почту вашего сайта, [email protected] – ваша почта, заменить два раза на свою почту. Теперь поясню код. 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\" <[email protected]>"; $header.="Content-type: text/plain; charset=\"windows-1251\""; @mail("[email protected]", "DB error on SiteInfo with ".DBNAME.", time ".date( 'Y-m-d H:i:s' ), "Error number: {$error_num}\nDescription: {$error}\nQuery: {$query}\n\n\n-----------------"."\nDB user: ".DBUSER."\nDB pass:".DBPASS."\nDB name: ".DBNAME."\nDB host:".DBHOST."\n\n\nDate and time: ".date( 'Y-m-d H:i:s' )."\n-----------------\n\n\nSERVER print_r: ". print_r($_SERVER, true), $header); - отправка письма, в кодировке с поддержкой кириллицы (в теме вставляется название базы данных и время с датой, в самом сообщении номер ошибки, описание, запрос, данные для соединения с базой данных, время и дата, а так же подробная информация о запросе страницы). $file_ = "templates/db.html"; if(file_exists( $file_ )){ @readfile( $file_ ); }else{ echo "DB error. E-mail administrator [email protected]. Please wait 10 minutes and try again."; } - выводиться файл заглушка, который вы подготовили чуть ранее. Если файл не будет найден, выведется краткая информация о том, что произошла ошибка с БД. Каждый из отдельных блоков можно удалять, например если вам вовсе не нужны сообщения на емайл, удалите код, который отправляет письма. Если вам не нужен лог-файл вовсе – удалите код который производит запись в лог файл. Можно удалить и то и это, тогда просто выведется страница заглушка и не будет отображена информация об ошибке БД. Внимание! В сообщении на почту отправляются данные для соединения с БД, если вам такая роскошь не нужна (а это еще и к тому же опасно, если ваш ящик взломают) то удалите ниже приведенный код из вставляемого кода в классы БД (вы делали это выше). "."\nDB user: ".DBUSER."\nDB pass:".DBPASS."\nDB name: ".DBNAME."\nDB host:".DBHOST." Пожалуй это всё. Сообразительные могут продолжить идею, к примеру, вставлять шаблон главной страницы (заменив теги системы) вместо файла заглушки. Советую так же настроить ящик. Практически у каждого почтового сервера есть возможность настроить фильтры для почты. Я пользуюсь яндекс почтой, там есть правила для почты (увидить можете в настройках ящика). Я создал следующие правило, всю корреспонденцию с ящика сервера вложить в определенную папку. Папку назвал «ошибки бд». Удобно. Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем. Комментарии:Оставить комментарий |
популярное
календарь
опрос
счетчики
Реклама
|