Формы в PHP. Простейшая форма отправки данных на почту при помощи HTML и PHP Как в php читать данные из формы

«PHP Form — работа с формами в PHP» – восьмой урок учебника PHP. В этом уроке мы поговорим про обработку форм средствами PHP.

Работа с формами

PHP позволяет обрабатывать данные, которые пользователь ввел в поля формы. После активации кнопки submit данные отправляются на страницу – обработчик, указанную в поле action элемента

. На странице – обработчике располагается PHP скрипт, который выполняет определенные операции над полученными данными, например формирует и отсылает письмо по указанным пользователем реквизитам.

Передача данных обработчику.

Данные из формы передаются на сервер как последовательность пар имя/значение . Это значит, что имя каждого элемента формы (появляющееся в атрибуте NAME тега) связывается со значением этого элемента (введенным или выбранным пользователем). Формат имя/значение , используемый для передачи, имеет вид имя=значение .

Все данные, передаваемые из формы в программу–обработчик располагаются в следующих суперглобальных массивах:$_GET , $_POST , и $_REQUEST .

$_GET - содержит все значения, передаваемые методом GET .

$_POST –содержит все значения, передаваемые методом POST .

$_REQUEST –содержит все значения, передаваемые методами POST и GET .

Фамилия:

Город:

Сообщение:

После нажатия на кнопку submit данной формы все данные передаются обработчику process.php . Так как в этой форме используется метод POST , то все переменные будут расположены внутри массива $_POST .

Теперь создадим обработчик:

echo «Имя: » . $_POST[«FName»] . «
»;
echo «Фамилия: » . $_POST[«LName»] . «
»;
echo «Город: » . $_POST[«City»] . «
»;
echo «
»;
echo «Ваше сообщение: » . $_POST[«Message»];
?>

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

Массив $_Request

Использование суперглобального массива $_Request очень удобно, особенно когда не известно, каким методом были переданы данные.

Благодаря циклу foreach можно перебрать значения массива $_Request .

В данном примере мы выводим на экран все значения массива $_Request . Сделано это может быть для проверки правильности ввода данных пользователем. То есть пользователь вводит данные в форму, нажимает отправить, но вместо обработки данных у него на экране высвечивается сообщение с введенными им данными и надписью подтвердить или отказаться. Данная идея применена на многих сайтах, да и вообще во многих программах.

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

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

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

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

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

  • Метод get передает все данные формы в конце URL. Из-за различных ограничений, связанных со спецификой языков и длиной данных, этот метод применяется редко.
  • Метод post передает все данные формы в теле запроса. Этот метод используется чаще, чем get.

В этой главе приведена лишь очень краткая вводная информация по основному син-таксису форм HTML. Более полную информацию можно найти в книге А. Хоумера и К. Улмена «Dynamic HTML. Справочник» (СПб.: Питер, 1999).

Элементы форм, ориентированные на ввод с клавиатуры

Наше знакомство с построением форм начнется с элементов, ориентированных на ввод с клавиатуры. Таких элементов всего два -- текстовое поле (text box) и текстовая область (text area).

Текстовое поле

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

Определение текстового поля включает пять атрибутов:

  • type -- тип элемента (для текстовых полей -- text);
  • size -- общий размер текстового поля в браузере;
  • maxlength -- максимальное количество символов, вводимых в текстовом поле;
  • value -- значение, отображаемое в текстовом поле по умолчанию.

Текстовое поле изображено на рис. 10.1.

Рис. 10.1. Текстовое поле

Особой разновидностью текстовых полей является поле для ввода паролей. Оно работает точно так же, как обычное текстовое поле, однако вводимые символы заменяются звездочками. Чтобы создать в форме поле для ввода паролей, достаточно указать type="password" вместо type="text".

Текстовая область

Текстовая область (text area) используется для ввода несколько больших объемов текста, не ограничивающихся простым именем или адресом электронной почты. Синтаксис определения текстовой области:

Определение текстового поля включает три атрибута:

  • name -- имя переменной, в которой сохраняются введенные данные;
  • rows -- количество строк в текстовой области;
  • cols -- количество столбцов в текстовой области.

Текстовая область изображена на рис. 10.2.

Рис. 10.2. Текстовая область

Элементы форм, ориентированные на ввод с мыши

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

Флажки (checkboxes) используются в ситуациях, когда пользователь выбирает один или несколько вариантов из готового набора -- по аналогии с тем, как ставятся «галочки» в анкетах. Синтаксис определения флажка:

Определение флажка включает три атрибута:

  • type -- тип элемента (для флажков -- checkbox);
  • value -- значение, присваиваемое переменной по умолчанию. Если флажок установлен, именно это значение будет присвоено переменной с указанным именем. Если флажок не установлен, значение атрибута value не используется.

Флажок изображен на рис. 10.3.

Рис. 10.3. Флажок

Переключатель

Переключатель (radio button) представляет собой разновидность флажка; он работает практически так же за одним исключением -- в любой момент времени в группе может быть установлен лишь один переключатель. Синтаксис определения переключателя:

Как видите, синтаксис почти не отличается от определения флажка. Определение переключателя поля включает три атрибута:

  • type -- тип элемента (для переключателей -- radio);
  • name -- имя переменной, в которой сохраняются введенные данные (в данном случае -- состояние элемента);
  • value -- значение, присваиваемое переменной по умолчанию. Если переключатель установлен, именно это значение будет присвоено переменной с указанным именем. Если флажок не установлен, значение атрибута value не используется.

Переключатель изображен на рис. 10.4.

Рис. 10.4. Переключатель

Раскрывающийся список

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

Определение скрытого поля включает три атрибута:

  • type -- тип элемента (для скрытых полей -- hidden);
  • name -- имя переменной, в которой сохраняются скрытые данные;
  • value -- значение, по умолчанию сохраняемое в скрытом поле.

Вообще говоря, название этого элемента -- скрытое поле -- несколько неточно. Хотя скрытые поля не отображаются в браузерах, пользователь может просто выполнить команду View Source и увидеть, какие скрытые значения хранятся в форме.

Кнопка отправки данных

Кнопка отправки данных инициирует действие, заданное атрибутом action тега . Синтаксис определения:

  • type -- тип элемента (для кнопки отправки данных -- submit);

Рис. 10.6. Кнопка отправки данных

Кнопка сброса

Кнопка сброса отменяет все изменения, внесенные в элементы формы. Обычно никто ею не пользуется, однако кнопки сброса так часто встречаются на формах в Web, что я решил привести ее описание. Синтаксис определения:

=" текст _на_кнопке">

Определение кнопки включает два атрибута:

  • type -- тип элемента (для кнопки сброса -- reset);
  • value -- текст, по умолчанию отображаемый на кнопке.

Кнопка сброса выглядит точно так же, как и кнопка отправки данных, если не считать того, что на ней обычно выводится слово «Reset» (рис. 10.6).

Все вместе: пример формы

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

Листинг 10.1. Пример формы для сбора данных

Please take a moment to tell us what you think about our site:

Name:


Email:


How frequently do you visit our site?:


I frequently purchase the following products from our site:

Software

Cookware

Chef"s Hats

0ur site"s greatest asset is:

Product selection

Cool design

Customer Service

Comments:


Внешний вид формы в браузере изображен на рис. 10.7.

Рис. 10.7. Пример формы для ввода данных

Вроде бы все понятно. Возникает вопрос -- как получить данные, введенные пользователем, и сделать с ними что-нибудь полезное? Этой теме посвящен следующий раздел, «Формы и PHP».

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

От предварительного знакомства с формами HTML мы переходим к самому интересному -- применению PHP для обработки данных, введенных пользователем в форме.

Формы и PHP

Обработка данных в формах имеет много общего с обработкой переменных, передаваемых в URL, -- эта тема подробно рассматривалась в предыдущей главе.

Вводные примеры

Следующие практические примеры помогут вам быстрее освоить различные аспекты обработки форм в PHP. В этих примерах продемонстрированы разные подходы к реализации интерактивных возможностей на сайте.

Пример 1: передача данных формы из одного сценария в другой

В первом примере представлена характерная ситуация -- когда пользовательские данные вводятся на одной странице и отображаются на другой. В листинге 10.2 приведен код формы для ввода имени пользователя и адреса электронной почты. Когда пользователь щелкает на кнопке отправки данных (кнопка Go!), форма обращается к странице, приведенной в листинге 10.3. В свою очередь, листинг 10.3 выводит переменные $name и $mail, переданные с запросом.

Листинг 10.2. Простая форма

Listing 10-2

Give us some information!

Your Name:


Your Email:


Листинг 10.3. Отображение данных, введенных в листинге 10.1

Listing 10-3

// Вывести имя и адрес электронной почты.

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

Существует и другой способ обработки данных форм, при котором используется всего один сценарий. К недостаткам этого способа относятся увеличение сценария и как следствие -- затруднения с редактированием и сопровождением. Впрочем, есть и достоинства -- уменьшение количества файлов, с которыми вам приходится работать. Более того, в этом варианте сокращается избыточный код при проверке ошибок (эта тема рассматривается ниже в данной главе). Конечно, в некоторых ситуациях работать с одним сценарием неудобно, но, по крайней мере, вы должны знать об этой возможности. В примере 2 воспроизводится пример 1, но с использованием лишь одного сценария.

Пример 2: альтернативная обработка формы (с одним сценарием)

Обработка данных формы в одном сценарии реализуется относительно просто. Вы проверяете, были ли присвоены значения переменным формы. Если значения присвоены, сценарий обрабатывает их (в нашем примере -- просто выводит), а если нет -- отображает форму. Решение о том, было ли задано значение переменной или нет, принимается при помощи функции strcmp(), описанной в главе 8. Пример реализации формы с одним сценарием приведен в листинге 10.4. Обратите внимание: атрибут action формы ссылается на ту же страницу, в которой определяется сама форма. Условная команда i f проверяет состояние переменной скрытого поля с именем $seenform. Если значение $seenform не задано, форма отображается в браузере, а если задано -- значит, форма была заполнена пользователем и введенные данные обрабатываются сценарием (в данном примере -- просто выводятся в браузере).

Листинг 10.4. Ввод данных на форме в одном сценарии

Listing 10-4

// Все кавычки внутри $form должны экранироваться,

Give us some information!

Your Name:


Your Email:


// Для проверки используется значение скрытой переменной $seenform.

if ($seenform != "у"):

print "Hi. $name!. Your email address is $email";

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

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

Пример 3: автоматическая отправка данных по электронной почте

Вывести пользовательские данные в браузере несложно, но вряд ли это можно назвать содержательной обработкой пользовательского ввода. Один из способов обработки информации заключается в ее отправке по электронной почте -- например, администратору сайта. Хотя при помощи гиперссылки mailto: можно отправить сообщение прямо из браузера, следует учитывать, что внешние приложения электронной почты настроены не на каждом компьютере. Следовательно, отправка сообщений с web-формы более надежно гарантирует, что сообщение будет доставлено адресату.

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

Функция mail() отправляет сообщение заданному адресату по электронной почте. Синтаксис функции mail():

boolean mail (string получатель, string тема, string сообщение [, string доп_заголовки])

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

В системе UNIX функция mail() использует утилиту sendmail. В Windows эта функция работает лишь при наличии установленного почтового сервера или если функция mail() связана с работающим сервером SMTP. Эта задача решается модификацией переменной SMTP в файле php.ini.

Если вы сделали все необходимое и функция mail() работает в вашей системе, попробуйте выполнить следующий фрагмент (конечно, адрес [email protected] заменяется вашим настоящим адресом электронной почты):

$email = "[email protected]";

$subject = "This is the subject";

$message = "This is the message";

$headers = "From: [email protected]";

mail ($email, $subject, $message, $headers);

Хотя при обширной переписке, конечно, следует использовать специализированные почтовые программы вроде majordomo (http://www.greatcircle.com/majordomo), в простых случаях функции PHP mail() оказывается вполне достаточно.

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

Листинг 10.5. Пересылка пользовательских данных функцией mail()

Listing 10-5

// Все кавычки внутри $form должны экранироваться.

// в противном случае произойдет ошибка.

Send us your comments!

Your Name:


Your Email:


Your Comments:


// Если форма ранее не отображалась, отобразить ее.

// Для проверки используется значение скрытой переменной $seenform.

if ($seenform != "у") :

print "$form"; else:

// Переменная $recipient определяет получателя данных формы

$recipient = "[email protected]";

// Тема сообщения

$subject = "User Comments ($name)";

// Дополнительные заголовки $headers = "From: $email";

// Отправить сообщение или выдать сообщение об ошибке

mail($recipient, $subject, $comments, $headers) or die("Could not send email!");

// Вывести сообщение для пользователя

print "Thank you $name for taking a moment to send us your comments!";

Неплохо, правда? Листинг 10.5 работает так же, как листинг 10.4; сначала мы проверяем, отображалась ли форма ранее. Если это происходило, программа вызывает функцию mail() и пользовательские данные отправляются по адресу, определяемому переменной $recipient. Затем в браузере выводится благодарственное сообщение для пользователя.

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

Пример 4: отправка запрашиваемой информации по электронной почте

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

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

  • site.txt -- информация о сайте;
  • team.txt -- информация о талантливых разработчиках сайта;
  • events.txt -- приглашение на очередное мероприятие.

Исходный текст примера приведен в листинге 10.6.

Листинг 10.6. Отправка информации, запрашиваемой пользователем

Listing10-5

Receive information about our site!

Your Email:


Site Architecture

Development Team

Upcoming Events

if ($seenform != "y") :

print "$form"; else:

$headers = "From: [email protected]";

// Перебрать все пары "ключ/значение"

while (list($key, Sval) = each ($information)) :

// Сравнить текущее значение с "у" if ($val == "у") :

// Построить имя файла, соответствующее текущему ключу

$filename = "$key.txt":

$subject = "Requested $key information";

// Открыть файл

$fd = fopen ($filename, "r");

// Отправить сообщение

mail($email, $subject, $contents, $headers) or die("Can"t send email!");; fclose($fd);

// Известить пользователя об успешной отправке

print sizeof($information)." informational newsletters

have been sent to $email!";

В листинге 10.6 мы перебираем пары «ключ/значение» в цикле while и отправляем только те бюллетени, у которых значение равно у. Следует помнить, что имена текстовых файлов должны соответствовать ключам массива

(site.txt, team.txt и events.txt). Имя файла строится динамически по ключу, после чего файл открывается по имени и его содержимое загружается в переменную ($contents). Затем переменная $contents передается функции mail() в качестве параметра.

В следующем примере пользовательские данные сохраняются в текстовом файле.

Пример 5: сохранение пользовательских данных в текстовом файле

Пользовательские данные сохраняются в текстовом файле для последующего статистического анализа, поиска и т. д. -- короче, любой обработки по вашему усмотрению. В листинге 10.7, как и в предыдущих примерах, данные формы обрабатываются в одном сценарии. Пользователю предлагается ввести четыре объекта данных: имя, адрес электронной почты, язык и профессию. Введенная информация сохраняется в текстовом файле user_information.txt. Элементы данных разделяются символами «вертикальная черта» (|).

Листинг 10.7. Сохранение пользовательской информации в текстовом файле

// Создать форму

Give us your personal info!

Your Name:


Your Email:


Your Preferred Language:


Your Occupation:""ibr>


// Заполнялась ли форма ранее? if ($seenform != "у") :

print "$form"; else:

$fd = fopen("useMnformation.txt", "a");

// Убедиться, что во введенных данных не встречается

// вертикальная черта.

$name = str_replace("|", "", $name);

$email = str_replace("|", "", $email);

// Построить строку с пользовательскими данными

$user_row = $name." ".$email."|".$language." ".$job."\n";

fwrite($fd, $user_row) or die("Could not write to file!");

print "Thank you for taking a moment to fill out our brief questionnaire!":

Обратите внимание на фрагмент, в котором мы проверяем, что пользователь не включил в имя или адрес электронной почты символы «вертикальная черта» (|). Функция str_replace() удаляет эти символы, заменяяих пустой строкой. Если бы это не было сделано, пользовательские символы | нарушили бы структуру файла данных и существенно затруднили (а то и сделали невозможным) его правильную обработку.

При работе с относительно малыми объемами информации вполне можно обойтись текстовыми файлами. Однако при большом количестве пользователей или объеме сохраняемой информации для хранения и обработки данных, введенных в форме, лучше воспользоваться базой данных. Эта тема подробно рассматривается в главе 11.

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

Проверка ошибок

Обработка пользовательских данных дает осмысленный результат лишь в том случае, если данные имеют правильную структуру. Проверить достоверность введенных данных невозможно, однако вы можете проверить их целостность (например, убедиться в том, что адрес электронной почты соответствует стандартному шаблону). Хотя для проверки данных часто применяется технология JavaScript, могут возникнуть проблемы с несовместимостью браузеров. Поскольку код PHP выполняется на стороне сервера, вы всегда можете быть уверены в том, что проверка данных формы даст нужный результат (конечно, при условии правильности вашей программы).

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

Пример 6: вывод информации о пустых или ошибочно заполненных полях формы

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

Мы последовательно проверяем все поля формы и убеждаемся в том, что они не остались пустыми. Там, где это возможно, проверяется правильность структуры введенных данных. Если проверка прошла успешно, мы переходим к следующему полю; в противном случае программа выводит сообщение об ошибке, устанавливает флаг, который позднее используется для повторного отображения формы, и переходит к следующему полю. Процедура повторяется до тех пор, пока не будут проверены все поля формы (листинг 10.8).

Листинг 10.8. Проверка данных формы и вывод сообщений об ошибках

Listing 10-8

// Создать форму

Give us some information!

Your Name:


Your Email:


// Заполнялась ли форма ранее?

if ($seenform != "у"):

// Пользователь заполнил форму. Проверить введенные данные, else:

$error_flag = "n";

// Убедиться в том. что поле имени содержит информацию

if ($name == "") :

print "* You forgot to enter your name!


":

$error_flag = "y";

// Убедиться в том. что поле адреса содержит информацию

if ($email == "") :

print "* You forgot to enter your email !


"

$error_flag = "y";

// Преобразовать все алфавитные символы в адресе

// электронной почты к нижнему регистру

$email = strtolower(trim($email)):

// Убедиться в правильности синтаксиса

// адреса электронной почты

if (! @eregi("^+".

"(+\.)+".

"(){2.4}$". $email)) :

print "* You entered an invalid email address!


" :

$error_flag = "y";

// Если флаг ошибки $error_flag установлен.

// заново отобразить форму

if ($error_flag == "у") : print "$form";

// Обработать данные пользователя

print "You entered valid form information!";

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

за необходимым товаром или услугой в другое место.

Динамическое конструирование форм

До настоящего момента я программировал все формы вручную. Любому программисту известно, что ручное кодирование -- это плохо, поскольку оно увеличивает вероятность ошибок, не говоря уже о лишних затратах времени.

В следующем разделе я представлю сценарий, в котором раскрывающийся список строится динамически по содержимому массива. Этот прием несложен, однако

он экономит немало времени как при исходном программировании, так и при последующем сопровождении программы.

Пример 7: построение раскрывающегося списка

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

В листинге 10.9, как и в предыдущих примерах, реализован вариант с одним сценарием. Сначала мы проверяем, было ли присвоено значение переменной $site. Если проверка дает положительный результат, вызывается функция header() с параметром, в котором значение $site присоединяется к строке «Location:http://». При передаче этой команды функция header О перенаправляет браузер на указанный URL. Если значение переменной $site не задано, форма выводится в браузере. Раскрывающийся список строится в цикле, количество итераций зависит от размера массива Sfavsites. В листинге 10.9 я включил в этот массив пять своих любимых сайтов. Конечно, вы можете добавить в него сколько угодно своих сайтов.

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

Листинг 10.9. Динамическое построение раскрывающегося списка

if ($site != "") :

header("Location: http://Ssite");

Listing 10-9</Fit1e></p> <p><body bgcolor="#ffffff" text="#000000" Iink="#cbda74" vlink="#808040" alink="#808040"</p> <p>$favsites = array ("www.k10k.com". "www.yahoo.com",</p> <p>"www.drudgereport.com",</p> <p>"www.phprecipes.com",</p> <p>"www.frogdesign.com"):</p> <p>// Создать форму</p> <p><form action = "Listing10-9.php" method="post"></p> <p><select name="site"></p> <p><option value = "">Choose a site:</p> <p>while ($х < sizeof ($favsites)) :</p> <p>print "<option value="$favsites[$x]">$favsites[$x]";</p> <p><input type="submit" value="go!"></p> <p>Динамическое конструирование форм особенно удобно при обработке больших объемов данных, которые в любой момент могут измениться, что приведет к устареванию всей жестко закодированной информации форм. Впрочем, я рекомендую жестко кодировать все статические данные (например, список штатов США), поскольку это ускорит работу программы.</p> <h2>Проект: Пишем гостевую книгу на PHP</h2> <p>Прежде всего создается инициализационный файл, содержащий некоторые глобальные переменные и функции приложения (листинг 10.10).</p> <b> <i> </i> </b><p>Листинг 10.10. <i> Файл init.inc, используемый при создании гостевой книги </i></p> <p>// Файл: init.inc</p> <p>// Назначение: глобальные переменные и функции для проекта гостевой книги</p> <p>// Заголовок страницы по умолчанию</p> <p>$title = "My Guestbook";</p> <p>// Цвет фона</p> <p>$bg_color = "white": /</p> <p>// Гарнитура шрифта</p> <p>$font_face = "Arial, Verdana, Times New Roman";</p> <p>// Цвет шрифта</p> <p>$font_color = "black";</p> <p>// Дата отправки $post_date - date("M d y");</p> <p>// Файл данных гостевой книги</p> <p>$guest_file = "comments.txt";</p> <p>// Функция читает данные гостевой книги</p> <p>//и отображает их в браузере</p> <p>function view_guest($guest_file) {</p> <p>GLOBAL $font_face, $font_color;</p> <p>print "Return to <a href=\"index.php\">index</a>,<br><br>";</p> <p>// Если в файле гостевой книги имеются данные...</p> <p>if (filesize($guest_file) > 0) :</p> <p>// Открыть файл данных гостевой книги</p> <p>$fh = fopen($guest_file. "r") or die("Couldn"t open $guest_file");</p> <p>print "<table border=1 cellpadding=2 cellspacing=0 width=\"600\">";</p> <p>// Повторять до конца файла</p> <p>$line <= fgetsdfh, 4096);</p> <p>// Разбить строку на компоненты</p> <p>// и присвоить каждый компонент переменной</p> <p>list($date. $name, $email, $comments) = explode("|", $line):</p> <p>// Если указано имя посетителя, вывести его</p> <p>if ($name != "") :</p> <p>print "<tr>":</p> <p>print "<td><font color=\"$font_co!or\"</p> <p>face=\"$font_face\">Date:</font></td>";</p> <p>print "<td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$date</font></td>";</p> <p>print "</tr>";</p> <p>print "<tr>";</p> <p>print "<td><font color=\"$font_color\"</p> <p>face=\"$font_face\">Name:</font></td>";</p> <p>print "<td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$name</font></td>";</p> <p>print "</tr>";</p> <p>print "<tr>";</p> <p>print "<td><font color=\"$font_color\"</p> <p>face=\"$font_face\">Email:</font></td>";</p> <p>print "<td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$email</font></td>";</p> <p>print "</tr>";</p> <p>print "<tr>";</p> <p>print "<td valign=\"top\"><font color=\"$font_color\"</p> <p>face=\"$font_face\">Message:</font></td>";</p> <p>print "<td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$comments</font></td>";</p> <p>print "</tr>";</p> <p>print "<tr><td colspan=\"2\"> :</td></tr>";</p> <p>print "</table>";</p> <p>// Закрыть файл</p> <p>print "<h3>Currently there are no entries in the guestbook!</h3>";</p> <p>// Функция сохраняет новую информацию в файле данных</p> <p>function add_guest($name, $email, $comments) {</p> <p>GLOBAL $post_date, $guest_file;</p> <p>// Отформатировать данные для ввода,</p> <p>$contents = "$post_date|$name|$email |$comments\n";</p> <p>// Открыть файл данных</p> <p>$fh = fopen($guest_file. "a") or dieC"Could not open $guest_file!");</p> <p>// Записать данные в файл</p> <p>$wr = fwrite($fh, $contents) or die("Could not write to $guest_file!");</p> <p>// Закрыть файл fclose($fh);</p> <p>Затем создаются еще три файла: файл ссылок index.php, файл add_guest.php для вывода информации гостевой книги и файл view_guest.php для ввода новых данных. Файл index.php (листинг 10.11) просто отображает две ссылки для выполнения основных функций гостевой книги -- просмотра и добавления новых данных. Эти ссылки легко включаются в сайт, имеющий более сложную структуру.</p> <i> </i><p><b> Листинг 10.11. </b> Файл index.php со ссылками для просмотра и добавления новых данных в гостевую книгу</p> <p>INCLUDE("init.inc");</p> <p><title><?=$page_title;?>

View the guestbook!

Sign the guestbook!

Файл view_guest.php (листинг 10.12) выводит всю информацию гостевой книги, хранящуюся в файле данных.

Листинг 10.12. Файл view_guest.php

INCLUDE("init.inc");

vi ew_guest ($guest_file);

Файл add_guest.php (листинг 10.13) запрашивает у пользователя новые данные для внесения в гостевую книгу. Введенная информация записывается в файл данных.

Листинг 10.13. Файл add_guest.php

INCLUDE("init.inc");

<?=$page_title:?>

// Если форма еще не отображалась - запросить данные у пользователя

if (! $seenform) :



Comment:


// Форма уже отображалась - добавить данные в текстовый файл.

add_guest($name, $email, $comment);

print "

Your comments have been added to the guestbook.

Click here to return to the index.

";

К числу основных преимуществ модульной разработки приложений относится простота адаптации для других систем. Допустим, вы решили перейти от хранения данных в текстовом файле к использованию базы данных. Стоит изменить содержимое add_guest() и view_guest(), и ваша гостевая книга перейдет на работу с базой данных.

На рис. 10.8 показано, как выглядит гостевая книга после сохранения пары записей.

Рис. 10.8. Просмотр гостевой книги (view_guest.php)

Информация, показанная на рис. 10.8, хранится в файле данных в следующем виде:

Oct 29 00|Michele|[email protected]|I love cheese!

Oct 29 00|Nino|[email protected]|Great site!

Итоги

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

  • общие сведения о синтаксисе форм;
  • передача данных форм между сценариями PHP;
  • обработка форм в одном сценарии;
  • функция mail();
  • отправка данных формы по электронной почте;
  • автоматическая обработка пользовательских запросов на получение информации;
  • сохранение данных пользователя в текстовом файле;
  • проверка ошибок;
  • динамическое конструирование форм.

Если вы собираетесь работать со сколько-нибудь заметными объемами информации, одним из первых шагов на этом пути должна стать интеграция базы данных в структуру сайта. Эта тема рассматривается в следующей главе.

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали о том, что такое сериализация в php . В данной статье я бы хотел рассказать о том, как работать с формами в PHP . Язык PHP предназначен для программирования web-сценариев, и обработка форм занимает, пожалуй, самое главное место в этом процессе. Сейчас уже и не встретить сайтов, на которых не было бы, к примеру, регистрации или формы обратной связи, или опросника. Форумы, интернет-магазины, добавление комментария, отправка сообщения в социальной сети — всё это обработка данных, помещенных в поля формы. Давайте на примере разберемся, как обрабатывать формы на PHP .
Будем реализовывать простую задачу: необходимо создать 2 поля (имя и фамилия), передать эти данные скрипту action.php , в результате должно выйти приветствие "Добро пожаловать, фамилия имя" . Кто забыл, как создаются формы, и какие там есть поля, можно посмотреть . Создадим файл test.html :

Имя: Фамилия:

Обращаю ваше внимание, что файл action.php (в нашем случае) должен находиться в одной папке с файлом test.html . Тут можно указывать как относительные, так и абсолютные пути. Будьте внимательны, многие ошибки связаны с неправильным указанием пути до скрипта-обработчика формы.

Создадим файл action.php со следующим содержимым:

Если мы сейчас откроем файл test.html , заполним поля формы и нажмём на кнопку, то попадём в файл action.php , где будет выведено сообщение. В данном случае браузер обращается к скрипту action.php и передает ему, через знак "?" все значения атрибутов name , расположенных внутри тегов , разделенных символом & . Обратите внимание, что подставляется вместо $_SERVER .

Нашу задачу мы можем решить, разобрав строку QUERY_STRING с помощью стандартных функций по работе со строками в PHP, но лучше воспользоваться другим механизмом — это использование массива $_REQUEST . Все данные, которые получены из полей формы, PHP помещает в массив $_REQUEST, не зависимо от того, каким способом были переданы данные: POST или GET (узнать можно через $_SERVER["REQUEST_METHOD"] ). Напоминаю чем эти способы отличаются:

Метод GET является открытым, метод POST является закрытым, т.е. они отличаются способом передачи параметров. Пример:

1) Если мы используем метод post: mysite.ru/request.php.
2) Если мы используем метод get: mysite.ru/request.php?myname=»Alex»&surname=»Gulynin».

Также, помимо массива $_REQUEST, PHP создаёт массивы $_GET и $_POST . Давайте теперь реализуем нашу задачу, на основе полученных знаний:

Если мы сейчас заполним форму и нажмём на кнопку, то увидим, что скрипт action.php приветствует нас по фамилии и имени. Всё работает корректно.

Здесь всё хорошо, но если мы изменим название скрипта, то нужно будет вносить изменения в файл test.html . Давайте модифицируем файл action.php, так, чтобы, обращаясь к нему либо выводилась форма, когда мы ничего не отправили, либо приветствие, когда мы нажали кнопку:

"> Имя: Фамилия:

Теперь мы не зависим от имени скрипта, т.к. задаем его через переменную окружения $_SERVER["SCRIPT_NAME"] . Конструкция =$_SERVER["SCRIPT_NAME"]?> равнозначна конструкции .
Помимо переменной окружения SCRIPT_NAME существует множество других.

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

Пример #1 Простейшая форма HTML

Ваше имя:

Ваш возраст:

В этой форме нет ничего особенного. Это обычная форма HTML без каких-либо специальных тегов. Когда пользователь заполнит форму и нажмет кнопку отправки, будет вызвана страница action.php . В этом файле может быть что-то вроде:

Пример #2 Выводим данные формы

Здравствуйте, .
Вам лет.

Пример вывода данной программы:

Здравствуйте, Сергей. Вам 30 лет.

Если не принимать во внимание куски кода с htmlspecialchars() и (int) , принцип работы данного кода должен быть прост и понятен. htmlspecialchars() обеспечивает правильную кодировку "особых" HTML-символов так, чтобы вредоносный HTML или Javascript не был вставлен на вашу страницу. Поле age, о котором нам известно, что оно должно быть число, мы можем просто преобразовать в integer , что автоматически избавит нас от нежелательных символов. PHP также может сделать это автоматически с помощью расширения filter . Переменные $_POST["name"] и $_POST["age"] автоматически установлены для вас средствами PHP. Ранее мы использовали суперглобальную переменную $_SERVER , здесь же мы точно так же используем суперглобальную переменную $_POST , которая содержит все POST-данные. Заметим, что метод отправки (method) нашей формы - POST. Если бы мы использовали метод GET , то информация нашей формы была бы в суперглобальной переменной $_GET . Кроме этого, можно использовать переменную $_REQUEST , если источник данных не имеет значения. Эта переменная содержит смесь данных GET, POST, COOKIE.

15 years ago

According to the HTTP specification, you should use the POST method when you"re using the form to change the state of something on the server end. For example, if a page has a form to allow users to add their own comments, like this page here, the form should use POST. If you click "Reload" or "Refresh" on a page that you reached through a POST, it"s almost always an error -- you shouldn"t be posting the same comment twice -- which is why these pages aren"t bookmarked or cached.

You should use the GET method when your form is, well, getting something off the server and not actually changing anything. For example, the form for a search engine should use GET, since searching a Web site should not be changing anything that the client might care about, and bookmarking or caching the results of a search-engine query is just as useful as bookmarking or caching a static HTML page.

2 years ago

Worth clarifying:

POST is not more secure than GET.

The reasons for choosing GET vs POST involve various factors such as intent of the request (are you "submitting" information?), the size of the request (there are limits to how long a URL can be, and GET parameters are sent in the URL), and how easily you want the Action to be shareable -- Example, Google Searches are GET because it makes it easy to copy and share the search query with someone else simply by sharing the URL.

Security is only a consideration here due to the fact that a GET is easier to share than a POST. Example: you don"t want a password to be sent by GET, because the user might share the resulting URL and inadvertently expose their password.

However, a GET and a POST are equally easy to intercept by a well-placed malicious person if you don"t deploy TLS/SSL to protect the network connection itself.

All Forms sent over HTTP (usually port 80) are insecure, and today (2017), there aren"t many good reasons for a public website to not be using HTTPS (which is basically HTTP + Transport Layer Security).

As a bonus, if you use TLS you minimise the risk of your users getting code (ADs) injected into your traffic that wasn"t put there by you.

Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.

Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.

Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.

Создаем форму отправки данных в html

Первая строка будет следующей

Это очень важный элемент формы. В нем мы указываем каким способом будут передаваться данные и какому файлу. В данном случае все передачется методом POST файлу send.php. Программа в этом файле соответственно должна принять данные, они будут содержаться в post массиве, и отправить их на указанный email адрес.

Вернемся к форме. Вторая строка будет содержать поле для ввода ФИО. Имеет следующий код:

Тип формы text, то есть пользователь сможет ввести или скопировать сюда текст с клавиатуры. Под параметром name содержится название формы. В данном случае это fio, именно под таким именем будет передаваться все, что пользователь введен в данноу поле. Параметр placeholder указывает на то, что будет записано в этом поле в виде пояснения.

Следующая строка:

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

Следующей строкой будет кнопка "отправить":

И последней строкой в форме будет тэг

Теперь соберем все вместе.





Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:





Создаем файл, принимающий данные из HTML формы

Это будет файл с именем send.php

В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:

$fio = $_POST["fio"];
$email = $_POST["email"];

Перед названиями переменных в php ставится знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method="post". Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров - функций php.

Первая функция преобразует все символы, которые пользователь попытается добавить в форму:

При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.

Вторая функция декодирует url, если пользователь попытается его добавить в форму.

$fio = urldecode($fio);
$email = urldecode($email);

Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:

$fio = trim($fio);
$email = trim($email);

Существуют и другие функции, позволяющие отфильтровать переменные php. Их использование зависит от того, насколько вы опасаетесь того, что злоумышленник попытается добавить программный код в данную форму отправки данных на почту html.

Проверка данных, передаваемых от HTML формы в файл PHP

Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:

echo $fio;
echo "
";
echo $email;

Вторая строка здесь нужна для того, чтобы разделить вывод переменных php на разные строки.

Отправляем полученные данные из формы HTML на почту при помощи PHP

Для отправки данных на почту нужно воспользоваться функцией mail в PHP.

mail("на какой адрес отправить", "тема письма", "Сообщение (тело письма)","From: с какого email отправляется письмо \r\n");

Например, нужно отправить данные на email владельца сайта или менеджера [email protected].

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

mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");

Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.

if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{
echo "сообщение успешно отправлено";
} else {
}

Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:

$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
//echo $fio;
//echo "
";
//echo $email;
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{ echo "сообщение успешно отправлено";
} else {
echo "при отправке сообщения возникли ошибки";
}?>

Три строки для проверки, передаются ли данные в файл закомментированы. При необходимости их можно удалить, так как они нужны были только для отладки.

Помещаем HTML и PHP код отправки формы в один файл

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

Для реализации такой работы нужно поместить HTML код формы в файл send.php и добавить условие, которое будет проверять наличие переменных в массиве POST (этот массив передается из формы). То есть, если переменные в массиве не существуют, то нужно показать пользователю форму. Иначе нужно принять данные из массива и отправить их адресату.

Давайте посмотрим как изменить PHP код в файле send.php:



Форма заявки с сайта


//проверяем, существуют ли переменные в массиве POST
if(!isset($_POST["fio"]) and !isset($_POST["email"])){
?>





} else {
//показываем форму
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")){
echo "Сообщение успешно отправлено";
} else {
echo "При отправке сообщения возникли ошибки";
}
}
?>

Существование переменной в POST массиве мы проверяем PHP функцией isset(). Восклицательный знак перед этой функцией в условии означает отрицание. То есть, если переменной не существует, то нужно показать нашу форму. Если бы я не поставил восклицательный знак, то условие дословно означало бы - "если существует, то показать форму". А это неправильно в нашем случае. Естественно, что вы можете переименовать его в index.php. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке

. Форма должна ссылаться на эту же страницу, например index.php. В код я добавил заголовок страницы.

Частые ошибки, возникающие при отправке PHP формы с сайта

Первая, наверное самая популярная ошибка, это когда вы видите пустую белую страницу без сообщений. Это означает, что вы допустили ошибку в коде страницы. Вам нужно включить отображение всех ошибок в PHP и тогда вы увидите, где допущена ошибка. Добавьте в код:

ini_set("display_errors","On");
error_reporting("E_ALL");

Файл send.php должен запускаться только на сервере, иначе код просто не будет работать. Желательно, чтобы это был не локальный сервер, так как он не всегда настроен на отправку данных на внешний почтовый сервер. Если вы запустите код не на сервере, то вам отобразиться код PHP прямо на странице.

Таким образом, для корректной работы я рекомендую поместить файл send.php на хостинг сайта. Там, как правило, все уже настроено.

Еще одна частая ошибка, когда появляется оповещение "Сообщение успешно отправлено", а письмо не приходит на почту. В этом случае нужно внимательно проверить строку:

if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))

Вместо [email protected] должен быть email адрес на который нужно отправить письмо, а вместо [email protected] должен быть существующий email данного сайта. Например для сайта сайт это будет . Только в этом случае письмо с данными из формы будет отправлено.