Как известно на отечественном хостинге (да и не только) частенько падает БД (База даных ака MYSQL сервер), бывают и другие разные ошибки подключения к БД, но скрипт ДЛЕ равно как и многие другие почему-то не имееют встроенного функционала по отправки администратору на e-mail сообщения об ошибке, в результате админ может узнать об этом уже от посетителей, что не гуд.
Как это поправить читайте ниже.
Вывод ошибки mysql в DLE
Файл отвечающий за вывод ошибки mysql, называется mysql.class.php, лежит этот файл в папке engine/classes, вот с него и начнем.
Посмотрим
где же там прячится вывод ошибки, как оказалось это вывод выполнен ввиде функции, имя ей display_error
вот её то и будем править.
Вот её код:
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();
}
Вот её мы чуть чуть поправим, чтобы он не только выводила инфу об ошибки на страницу но и отправляла e-mail админу.
ниже строки:
function display_error($error, $error_num, $query = '')
{
вставляем такое:
// Письмо об ошибке (c) imhoblog.org
$Name = "admin"; //senders name
$email = $config['admin_mail']; //e-mail адрес отправителя
$recipient = $config['admin_mail']; //e-mail адрес получателя
// Само сообщение
$mail_body = 'Ошибка подключения к базе данных:
MySQL Error!: '.$error.'
Error Number: '.$error_num.'
Query: '.$query_str.'
Time: '.date(c); //mail body
$subject = "Ошибка подключения к базе данных"; //subject
$header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields
mail($recipient, $subject, $mail_body, $header); //mail command
// Письмо об ошибке (c) imhoblog.org
В целом этого достаточно, и если вам не нужны всякие рюшечки типа настройка этого письма и возможности вкл/выкл этой отправки то дальше можете не читать, лично я бы огранисчелся изменениями приведеными выше ;) .
Ну если вы всетаки хотите зделать рюшички то вперед, читаем дальше.
Прежде всего, если вам нужны "рюшечки" то вышеприведенный хак
не применяем, делаем по другому, а именно:
Идем в phpmyadmin и выполняем там sql запрос:
INSERT INTO `dle_email` (`id` , `name` , `template`) VALUES (NULL , 'mysql_error', 'Уважаемый Администратор,\r\n\r\nуведомляем вас о том, что на сайте {%site%} произошла ошибка mysql.\r\n\r\n------------------------------------------------\r\nИнформация об ошибке: \r\n------------------------------------------------\r\n\r\nДата ошибки: {%date%}\r\nЗапрос вызвавший ошибку: {%sql%}\r\nНомер ошики: {%num-error%}\r\n\r\n------------------------------------------------\r\n\r\nС уважением,\r\n\r\nСкрипт mysql.class.php с сайта {%site%}');
После чего возвращаемся к файлу (который не содержит изменений приведеных в этом посте выше) mysql.class.php
ниже строки:
function display_error($error, $error_num, $query = '')
{
вставляем:
if($config['send_error']){ // проверка на вкл/выкл
include_once ENGINE_DIR.'/classes/mail.class.php';
$mail = new dle_mail ($config);
$mail_template = $db->super_query("SELECT template FROM " . PREFIX . "_email WHERE name='mysql_error' LIMIT 0,1");
$mail_template['template'] = stripslashes($mail_template['template']);
$mail_template['template'] = str_replace("{%site%}", $config['http_home_url'], $mail_template['template']);
$mail_template['template'] = str_replace("{%date%}", langdate("j F Y H:i", $_TIME), $mail_template['template']);
$mail_template['template'] = str_replace("{%sql%}", $error, $mail_template['template']);
$mail_template['template'] = str_replace("{%num-error%}", $error_num, $mail_template['template']);
$body = stripslashes(stripslashes($body));
$body = str_replace ("<br />", "\n", $body);
$body = strip_tags ($body);
$mail->send ($config['admin_mail'], $config['admin_mail'], $mail_template['template']);
} // проверка на вкл/выкл
Теперь идем в админку
а именно в файл engine/inc/email.php
там находимтакие строки:
<table width="100%">
<tr>
<td bgcolor="#EFEFEF" height="29" style="padding-left:10px;"><div class="navigation">{$lang['mail_info_6']}</div></td>
</tr>
</table>
<div class="unterline"></div>
<table width="100%">
<tr>
<td style="padding:2px;">{$lang['mail_pm_info']}</td>
</tr>
<tr>
<td style="padding:2px;"><textarea rows="15" style="width:650px;" name="new_pm_text">{$pm}</textarea>
<br /><br /> <input type="submit" value="{$lang['user_save']}" class="buttons"></td>
</tr>
</table>
над ними вставляем:
<table width="100%">
<tr>
<td bgcolor="#EFEFEF" height="29" style="padding-left:10px;"><div class="navigation">{$lang['mail_error']}</div></td>
</tr>
</table>
<div class="unterline"></div>
<table width="100%">
<tr>
<td style="padding:2px;">{$lang['mail_error_info']}</td>
</tr>
<tr>
<td style="padding:2px;"><textarea rows="15" style="width:650px;" name="err_text">{$mysql_error}</textarea>
</td>
</tr>
</table>
в том же файле:
найти:
$new_comments_text = preg_replace($find,$replace, $db->safesql($_POST['new_comments_text']));
ниже вставить:
$err_text = preg_replace($find,$replace, $db->safesql($_POST['err_text']));
в том же файле:
найти:
$db->query("UPDATE " . PREFIX . "_email set template='$new_pm_text' where name='pm'");
ниже вставить:
$db->query("UPDATE " . PREFIX . "_email set template='$err_text' where name='mysql_error'");
Все с этим файлом все, но нам же нужно еще сделать вкл/выкл (если не нужно то дальше не читаем и в изменениях файла mysql.class.php уберите проверку на вкл/выкл)
Открываем файл: engine/inc/options.php
находим там строку:
showRow($lang['opt_sys_addsec'], $lang['opt_sys_addsecd'], makeDropDown(array("1"=>$lang['opt_sys_yes'],"0"=>$lang['opt_sys_no']), "save_con[sec_addnews]", "{$config['sec_addnews']}"));
ниже вставляем:
showRow($lang['opt_sys_error'], $lang['opt_sys_senderror'], makeDropDown(array("1"=>$lang['opt_sys_yes'],"0"=>$lang['opt_sys_no']), "save_con[send_error]", "{$config['send_error']}"));
Теперь идем в языковой файл /language/Russian/adminpanel.lng
ниже строки:
'wysiwyg_language' => "ru",
вставить:
// Отправка сообщений об MYSQL ошибки
'opt_sys_error' => "Сообщения об MYSQL ошибках",
'opt_sys_senderror' => "Отправка на e-mail администратора (указаный в настройках скрипта) сообщений об MYSQL ошибках",
'mail_error' => "Настройка E-Mail сообщения, которое отсылается при MYSQL ошибки",
'mail_error_info' => "При написании шаблона для данного сообщения вы можете использовать следующие теги:<br /><b>{%site%}</b> - url этого сайта (указаный в настройкахскрипта)<br /><b>{%date%}</b> - дата ошибки<br /><b>{%sql%}</b> - Запрос вызвавший ошибку<br /><b>{%num-error%}</b> - MYSQL номер ошибки",
собсно все :)