47 (+1)

Formmail@PHP

Принципы обработки форм на PHP
Разница между методами GET и POST
Подробное описание скрипта отсылки формы по почте

Поиск по сайтуДля желающих написать письмоПослать ссылку другуВерсия для распечатки


Начнем изучение возможностей PHP с самого простого примера - напишем небольшой скрипт, который позволит отправлять данные из HTML-формы прямо на наш электронный адрес. Но перед тем как перейти непосредственно к написанию кода, нам необходимо разобраться с несколькими базовыми понятиями http-протокола, а именно с тем, каким же образом происходит передача параметров из HTML-формы на сервер.



Часть I

Часть теоретическая - разбираемся с формами

Итак, вначале рассмотрим, каким образом задаются параметры на стороне клиента, т.е. на web-страничке. Эта часть программы не зависит от того, какой язык программирования будет использоваться на сервере, и определяется только стандартом HTML. Вы уже наверняка догадались, что это делается при помощи форм. Типичная форма выглядит следующим образом:

<form action="formmail.php" method="post">
...
<input type="text" name="name">
<input type="text" name="email">
...
<input type="submit" value="Отправить">
</form>

Интерес для нас пока представляет первая строчка, где определяется имя скрипта, которому эти данные будут переданы на обработку (задается параметром action), и метод, при помощи которого будут переданы данные (задается параметром method). Вот на последнем и остановимся поподробнее. Из всех возможных значений данного параметра для нас представляют интерес только два, а именно методы GET и POST.

GET и POST


Начнем по порядку. При использовании метода GET все данные упаковываются в адресную строку. Причем происходит это следующим образом: вначале имена переменных и их значения преобразуются в вид, безопасный для передачи в строке URL (особенно хорошо это заметно, когда передаются русские символы), после чего все данные преобразуются в форму name=value и собираются в одну строку, отделяясь друг от друга знаком & (амперсанд). В таком виде данные и попадают скрипту, который уже самостоятельно должен проделать обратную операцию и извлечь из строки названия переменных и их значения. Строка запроса не бесконечна и может содержать не более 254 символов. Это одно из ограничений метода GET, которое не позволяет передавать объемные данные. По определению, все данные, передаваемые этим способом, доступны всем и могут быть прочитаны кем угодно. Поэтому им не рекомендуется пользоваться для передачи секретной информации - например паролей.

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

Какой же из этих методов лучше? Это зависит от конкретной ситуации. Для передачи информации, вводимой в форме, в подавляющем большинстве случаев лучше подходит метод POST. А вот в случае динамических сайтов, когда показываемая страничка определяется не только адресом странички, но и переменными (типичный представитель - интернет-магазин), лучше использовать метод GET.

В отличие от других серверных языков программирования, PHP делает всю нудную работу по расшифровке строки запроса, переданной методом GET, на себя и предоставляет нам уже готовые для использования в скрипте переменные. Причем имя переменной образуется из имени, указанного в соответствующем элементе формы. К примеру, если пользователь ввел в строке запроса имени "Вася Петров", то в скрипте автоматически появится переменная $name, которая будет иметь значение "Вася Петров".

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

<form action="formmail.php" method="post">
Ваше имя:
<input type="text" name="user[name]"><br>
Электронный адрес:
<input type="text" name="user[email]"> <br>
Сообщение:
<textarea name="user[message]"></textarea><br>
<input type="submit" value="Отправить">
</form>

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



Часть II

Часть практическая - пишем скрипт

Переходим к рассмотрению вопросов, связанных с отсылкой сообщения на e-mail. Благодаря PHP эта задача сводится к вызову функции, имеющей прозрачное название mail() и следующий синтаксис:

mail(string to, string subject, string message [, string additional_headers]),

где

  • to - электронный адрес получателя
  • subject - тема, указываемая в заголовке письма
  • message - непосредственно тело письма
  • additional_headers - необязательные заголовки письма, в число которых, как ни странно, входит и адрес отправителя

Но перед тем как воспользоваться этой функцией, необходимо подготовить все данные для нее и попутно решить проблемы с русскими кодировками. Об этом давайте поподробнее. Как известно, стандартной кодировкой для электронной почты является KOI8-R, а большинство авторов страничек (в числе которых нахожусь я и, как мне кажется, большое число читателей данной статьи) предпочитают использовать при создании web-страничек кодировку Win-1251. Скрипт получает данные в той кодировке, в какой ее увидел пользователь, и в большинстве случаев это будет именно Win-1251.

Поэтому для отправки корректного письма необходимо перекодировать его текст, а также заголовок в кодировку KOI8-R. И снова PHP оказывается на высоте, предоставляя нам функцию convert_cyr_string(), которая занимается исключительно русскими кодировками. Наличие такой функции очень приятно и избавляет от написания собственных функций-конверторов. Синтаксис функции понятный и простой:

convert_cyr_string(string str, string from, string to),

где

  • str - строка, которая подвергается перекодировке
  • from - исходная кодировка
  • to - целевая кодировка

Параметры from и to могут принимать одно из следующих значений:

  • k - koi8-r
  • w - windows-1251
  • i - iso8859-5
  • a - x-cp866
  • d - x-cp866
  • m - x-mac-cyrillic

Для нашего случая вызов функции будет выглядеть следующим образом:

$message = "Это текст письма в кодировке Win-1251";
$message = convert_cyr_string($message, "w", "k");

Осталось разобраться еще с одним вопросом - перенаправлением странички на другой адрес. Как известно, для этого достаточно послать броузеру http-заголовок с параметром "Location", указывающим на адрес странички, куда мы хотим перебросить посетителя. PHP позволяет напрямую посылать заголовки броузеру при помощи функции header(), единственным параметром которой является строка заголовка. Для нашего случая этот код может выглядеть следующим образом:

$redirect_url = "thanks.htm";
header("Location: $redirect_url");

Теперь попробуем собрать все описанное выше в единый функциональный и законченный скрипт:

<?

$mail_to = "Ваше имя <"."your@address.com".">";
$mail_from = $user["name"]." <".$user["email"].">";

// Формируем тему письма
$subject = "Отзыв с сайта";

// Формируем текст письма, попутно удаляя экранирующие слеши из сообщения
$message = stripslashes($user["message"]);

// Перекодируем все сообщения из кодировки Win-1251 в кодировку KOI8-R
$mail_to = convert_cyr_string($mail_to, "w", "k");
$mail_from = convert_cyr_string($mail_from, "w", "k");
$subject  = convert_cyr_string($subject, "w", "k");
$message = convert_cyr_string($message, "w", "k");

// Отправляем сообщение по электронной почте
mail($mail_to, $subject, $message, "From:$mail_from\n");

// Перенаправляем пользователя на страничку с подтверждением отправки запроса
$redirect_url = "thanks.htm";
header("Location: $redirect_url");

?>

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


Архив с файлами к статье



cкачать архив с файлами к статьеcкачать архив с файлами к статье

Нажав на изображение дискеты, вы сможете скачать ZIP-архив с рабочими файлами, упомянутыми в статье. Ниже приведен полный список файлов, входящих в состав архива:

  • separated/ - вариант PHP-скрипта, описанный в статье и использующий несколько отдельных файлов:

    1. index.htm - страница с формой запроса;
    2. formmail.php - PHP-скрипт отсылки формы по почте, описанный в статье;
    3. thanks.htm - страничка с сообщением пользователю, что его запрос отправлен.

  • all-in-one/ - усложненный вариант PHP-скрипта, использующий один единственный файл как для вывода формы запроса, так и для ее обработки. Подробные комментарии находятся в самом коде скрипта.



Свои мнения, пожелания и вопросы по выпускам Вы можете присылать по адресу mike@cherry-design.ru.
Я оставляю за собой право цитировать письма, пришедшие по вышеуказанному адресу.
Copyright © 2001-2008 Михаил Мельников. Перепечатка без разрешения запрещена.