Обработка формы PHP

Теперь нам предстоит разобраться, как увязать программирование на HTML со скриптами на PHP. На самом деле это ещё проще, чем что-либо другое в PHP. Всё сделано так, чтобы пользователь чувствовал себя достаточно комфортно и не испытывал проблем, в том числе и при программировании. Каким же образом можно достичь плотного взаимодействия программиста и пользователя?

Посещая сайты, каждый из вас не раз сталкивался с различными формами и полями для ввода. Некоторые даже пытались разобраться, как всё это работает, но непременно натыкались на тот факт, что данные формы нужно как-то и чем-то обработать. Но как!? И главное — чем? Ответ нам уже ясен — с помощью PHP. И именно это мы с вами сейчас и будем делать...

Для начала давайте сделаем ручками (ими, родимыми, ими) форму для отправки писем на любой адрес, который тоже требуется ввести в форме. На этом примере и разберемся, как всё работает:

<form method="POST" action="action.phtml">
    <p>
        <input type="text" name="email" size="20">
        <input type="text" name="name" size="20">
        <textarea rows="2" name="txt" cols="20"></textarea>
        <input type="submit" value="Submit" name="B1">
        <input type="reset" value="Reset" name="B2">
    </p>
</form>

Запустив этот HTML код в браузере, вы увидите перед собой небольшую форму с тремя полями для ввода. Особенности этой формы таковы: обработка, которая начнется после нажатия кнопки отправить, будет передана файлу action.phtm. Если надо указать другой путь — воспользуйтесь стандартными методами указания пути. Имя первого поля — email, и туда посетитель будет вводить адрес, куда надо отправить письмо. Второе поле имеет имя name, и оно предназначено для ввода имени того, кто хочет отправить письмо. Следующее поле — поле ввода текста сообщения, и оно имеет имя txt. Как видите, все имена можно давать так, чтобы в последствии не запутаться в них. Наша форма почти готова. Не хватает только эстетического оформления, но это уже дело десятое, можно сделать любые надписи или применить различные стили. Тут вы можете в полной мере проявить свои творческие способности. А мы теперь перейдем к нашей основной части — обработчику формы, который, как вы помните, находится у нас в файле action.phtm.

<?php
    mail($email, $name, $txt, $name);
?>

Все очень просто. Как вы, надеюсь, уже поняли, все имена, которые мы присвоили полям для ввода в нашей форме, переходят точно такими же в скрипт PHP, который указывается в форме как обработчик. Значением этих имен (переменных PHP) будет то, что посетитель вашей страницы введет в соответствующее поле. Адрес окажется в переменной $email, имя — в $name, а текст — в $txt. Вот и вся наука! Любое имя формы становится переменной в обработчике, написанном на PHP. Метод, которым передаются значения и имена переменных в обработчик, называется POST. Если помните, несколько выше мы познакомились с еще одним методом передачи данных скрипту — GET. Здесь вы можете видеть коренное отличие двух похожих методов. В первом случае (GET) — по ссылке, а во втором (POST) — через форму.

Запомните это как дважды два, и жизнь покажется вам намного прекраснее!

Отправка почты — второй пример

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

Как пример, могу предложить такие варианты — регистрация в рассылке, ввод сообщения в форум, гостевую книгу и так далее, ошибка открытия файла, организация обратной связи, опрос мнения читателей о размещенной статье и так далее. Способов применить эту возможность PHP — множество, осталось разобраться, как это работает. Как всегда, все просто! Синтаксис следующий:

Mail($email, "Введено сообщение", $str, "From: сообщение");

Конечно, перед этим соответствующие переменные должны быть введены либо вручную, либо с помощью формы (нужно следить за соответствием имен переменных в форме и в скрипте). При выполнении данной команды интерпретатор РНР пошлет письмо с текстом из переменной $str по адресу, указанному в переменной $email. Все остальное – служебная информация, которая может быть в некоторых случаях опущена за ненадобностью.

Для примера рассмотрим систему контроля за посетителями определенных страниц сайта. Такая возможность может понадобиться для анализа посещений определенных статей, страниц и т.д. Нам потребуется информация о посетителе, которая в РНР автоматически доступна через переменные окружения. Эту информацию мы будем отсылать самому себе на почтовый ящик. Только не переусердствуйте – каждое посещение такой страницы вызовет отправку письма, и ящик может оказаться переполненным. Особенно если поток посетителей будет большим.

<?php
if (isset($HTTP_X_FORWARDED_FOR)) {
    $host = gethostbyaddr($HTTP_X_FORWARDED_FOR);
} else {
    $host = gethostbyaddr($REMOTE_ADDR);
}
$ip = getenv('REMOTE_ADDR');
$date = date('d M Y, H:i:s');
$host1 = gethostbyaddr("$ip");
$str = ("Дата - $date  Хост - $host  IP-адрес - $ip  ---------------------");
mail($email, "статистика", $str, "From: информация");
?>

Если Вы разместите на одной из Ваших страниц этот код РНР, информация о посетителе (это дата входа, хост и IP-адрес) будет в Вашем почтовом ящике. Еще можно прислать себе сообщение при возникновении ошибки (например, открытия файла) на сайте:

$filename = "data.txt";
$fp = @fopen($filename, "r");
if (!$fp) {
    @mail($email, "Ошибка!", "Ошибка открытия файла $filename !");
}

Как обычно, можно поставить знак @, и если возникнет ошибка при отправке почты, сообщение об этом не будет выведено на экран. А можно просто проверить, ушло письмо или нет:

if (@mail($email, "Тест", $str)) {
    // что сделать, если письмо ушло
} else {
    // что делать, если произошла ошибка отправки (неправильные настройки сервера, недоступен ящик, сайт и т.д.)
}

Если в переменной $email указать несколько адресов, разделенных пробелами, информация будет разослана по всем указанным адресам. Это открывает простой путь к организации собственной, ни от кого не зависящей системы почтовых рассылок.