А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/utils2/
Rambler's Top100
Пишем на PHP: utils.class (продолжение)

Ну вот. Хоть я и гриппую, но это не избавит вас от очередного занятия по программированию на PHP. Только следите за мной. Чего только не напишешь в высокомтемпературном режиме.

В прошлый раз я оставил вам на растерзание функцию отправки письма. Предположим, что вы ничего в ней не поняли. Как обычно, разжевываю.

В качестве аргумента мы передаем функции mail_to_noc сообщение об ошибке, которое необходимо отправить в службу поддержки сайта.

Адреса службы поддержки мы описали среди наших переменных, помните?

// техническая служба сайта
var $EMAIL_NOC=array("roma@21.ru","noc@21.ru");

В качестве вспомогательной информации мы возьмем некоторые данные, которые сопровождают прочти любую ошибку. Эти данные помогут нам (службе поддержки сайта) сориентироваться в ситуации и принять правильное решение.

Какая же информация нам не помешает?

Я думаю, что нам пригодится знать URL, по которому произошла ошибка. Вдруг какой-то кретин нагородил в строке вызова страницы всякого бреда, что и привело к ошибке (обратите внимание, если пришла ошибка, значит сработала защита от этого самого бреда).

В PHP есть масса зарезервированных переменных, к которым можно обратиться из любого места наших скриптов.

Просмотреть полный список, так называемых, переменных окружения PHP можно очень просто. Достаточно написать в файле (назовем его phpinfo.php):

<?
 echo phpinfo();
?>

И обратиться вызвать в браузере эту страницу.

Зарезервированная функция phpinfo() покажет нам в красивой табличке все переменные окружения и особенности настройки конкретной версии PHP, другую полезную информацию.

Посмотрите сами: http://kurepin.ru/phpinfo.php

Среди них есть и та, о которой мы только что говорили — REQUEST_URI. Это переменная, в которой храниться URL запрашиваемой страницы. В нашем примере вы видите ее значение — "/phpinfo.php" — что мы и запрашивали.

Так вот, возвращаясь к нашей функции, в первой строке ее вы видите как можно заполучить эту самую информацию.

global $REQUEST_URI (обратите внимание, последняя буква "I", а не "L").

    Тут надо заметить, что в обычном скрипте в мы могли бы обраться к данной переменной напрямую, но в PHP принято, что глобальная переменная (распространяемая на весь скрипт) не известна в отдельной функции, пока ее к этому не принудят. Принуждение (объявление/вызов) производится при помощи конструкции global имя глобальной переменной. После этого к ней можно обращаться точно так же, как и к другим переменным, определенным в данной функции.

    Запомните, что в разных функциях и в глобальном скрипте вы можете пользоваться одинаковыми именами для переменных: и каждый раз это будут разные переменные.



Теперь, каждое сообщение об ошибке мы будем сопровождать строкой URL. Это полезная информация, уверяю вас. Особенно в больших проектах (надеюсь, вы еще не забыли, что мы пишем БОЛЬШОЙ проект), когда один вид ошибки может возникнуть на любой из тысяч страниц.

Мне почему-то кажется, что кроме места, нам понадобится еще и время происхождения ошибки.

Вообще-то, в письме всегда указывается время отправления письма. Но мы не будем полагаться на совесть почтового сервера и сами проставим время с точностью до секунды.

Вообще, дата и время — полезная штука. Давайте сразу напишем в коллекцию наших утилит две коротенькие функции — приведения даты и времени к приличному виду.

function today_date()
{
 $ret=date("d.m.Yг.",time());
 return($ret);
}
и

function today_time()
{
 $ret=date("G:i:s",time());
 return($ret);
}

Очень просто. Мы запрашиваем у PHP дату и время в том виде, что предоставляет нам сервер (число секунд, прошедших с 1970-го года) и преобразуем их в удобоваримый формат: "дд.мм.гггг" и "чч:мм:сс".

Теперь мы можем в любом месте наших скриптов вставить текущую дату и текущее время.

Что нам понадобится еще? У нас уже есть место "преступления", его дата и время, имеется текстовое его определение. Чего не хватает? Любой следователь вам без запинки ответит, что нам необходимо узнать самого нарушителя спокойствия. Правильно. Это единственное, что нам недостает.

Мы уже позаботились об этом, помните? Мы вставили в html-сообщение об ошибке просьбу описать ситуацию, при которой возникла эта самая ошибка. Хорошо. Но не каждый посетитель захочет нам отписать такое письмо, это во-первых. А во-вторых, уж точно не станет писать нам письмо, если он сознательно пытается нанести урон нашему сайту, или просто прощупывает сайт на предмет "дыр".

Поэтому мы, без специального на то разрешения, обнаружим IP-адрес посетителя, нарушившего спокойствие нервного админа, и приложим его к письму (адрес, конечно, а не админа).

Получить IP посетителя так же просто, как и URL: адрес содержится в переменной окружения $REMOTE_ADDR.

Уж простите мне мое занудство, но я предпочитаю определить это в отдельную функцию.

function remote_ip()
{
 global $REMOTE_ADDR;
 return($REMOTE_ADDR);
}

Почему я поступаю так "неразумно"? Дело в том, что запрашивать эту информацию можно из разных мест скрипта. А что, если потребуется присовокупить к адресу еще какую-то информацию? Или произвести его регистрацию в логах? А есть добавить проверку на наличие прокси-сервера и попытаться получить реальный IP-адрес? В общем, может произойти все, что угодно, и необходимо забронировать себе удобное расширение возможностей в любом направлении. Если вы не догадались, то дату и время я заключил в отдельные функции по той же причине: нам не составит труда заменить разделители разрядов даты и времени с точек и двоеточий на слеши или что-то иное. Хоть на слова.

Ну что, мне кажется, что мы собрали всю минимально необходимую сопроводительную информацию: мы знаем время, место, адрес возмутителя и описание ошибки. Пора все это уже отправить адресату.

Вот, мы и натыкаемся на первую конструкцию типа цикл. Не думаю, что следует останавливаться на подробном объяснении цикла for: этот вид цикла существует во всех языках, начиная с Бейсика, и называется везде так же.

Скажу только , что тело цикла выполняется до тех пор, пока выполняется условие, заключенное в скобки. В данном случае, это количество email-адресов, указанных нами в переменной EMAIL_NOC. У нас, насколько я вижу, их два.

А функция PHP подсчета количества ячеек массива count() поможет нам сделать количество наших адресов произвольным. Т.е. нам не надо будет ничего менять в скриптах, когда потребуется добавить или убрать какие-то адреса из списка службы поддержки.

Таким образом тело нашей конструкции for выполняется до тех пор, пока не кончатся адреса. При каждом проходе функции к переменной $i прибавляется единица, указывая не следующую ячейку массива.

Все тело функции состоит из двух строк.

Первая функция вызывает написанную до этого mailer(), передавая ей нужные параметры. А именно:

"Robot" — это from (от кого присьмо)

$this->EMAIL_NOC[$i] — это to (кому мы отправляем письмо. Обратите внимание: это как раз обращение к очередной ячейке массива email-адресов).

"Fatal error!" — это поле письма subj (тема сообщения)

"Error: $message\nDateTime:".$this->today_date()." ".$this->today_time()."\n"."Remote IP:".$this->remote_ip()."\n\nURI: $REQUEST_URI\n\n$SQL_QUERY:".$this->sql_query."\nSQL_ERROR:".$this->sql_err — само сообщение, составленное из подготовленных нами данных.

Теперь, я уверен, вам не составит труда самостоятельно разобрать на части тело сообщения и без ошибки определить, как оно будет выглядеть в виде письма.

Осталось только подсказать, что сочетание символов "\n" — не что иное, как символ перевода строки (enter).

Отдыхайте. А я пошел пить аспирин или водку — еще не решил.

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin