HTML-формы. PHP сценарии обработки HTML форм Form php добавление материала бизнес

В этом уроке PHP рассматриваются базовые понятия языка: обработка форм с отправкой запроса в веб-страницы, основные управляющие конструкции php при обработке форм, запись данных из формы PHP в файл, функция даты в PHP date().

1. Напомним, что все файлы php тестируются только при запущенном Денвере и только из адресной строки браузера. Запускать файлы php двойным щелчком нельзя!

2. Запустите Денвер.

Упражнение 1. Обработка простой формы

В данном уроке PHP рассмотрим обработку формы на HTML-странице, создание переменных PHP для полей формы.

1. Создайте форму, как на рис. 3.1. Подразумевается, что при нажатии на кнопку Отправить заказ данные из формы будут переданы администратору, а клиент на экране увидит ответ Заказ обработан . Если Вы затрудняетесь в написании формы, тогда реализуйте код, приведенный ниже рисунка, и сохраните его в папке php_2 под именем forma_bob.html Напоминаем, что адрес обработчика формы записывается в атрибуте action тега form .

Рисунок 3.1

2. Для того, чтобы пользователь получил ответ после отправки данных, необходимо создать обработчик формы на языке php. Создайте код, приведенный ниже, и сохраните его в папке php_2 под именем zakaz.php

3. Проверьте работоспособность обработчика. Для этого запустите файл forma_bob.html через браузер, набрав в адресной строке браузера адрес http://localhost/php_2/forma_bob.html

4. В поля формы введите любые цифры и нажмите кнопку Отправить заказ . Результат на рис. 3.2.

Рисунок 3.2

Переменные формы

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

Вы можете получить доступ к содержимому поля tireqty следующими способами:

$tireqty //короткий стиль

$_POST[‘tireqty’] //средний стиль

$HTTP_POST_VARS[‘tireqty’] //длинный стиль

Мы будем использовать длинный стиль для ссылок на переменные формы, но для простоты использования строить короткие версии применения. Это удобный и безопасный способ манипулирования данными, который эффективно работает во всех системах, независимо от выбранных версий и настроек.

Копируя содержимое одной переменной в другую, мы применяем операцию присваивания, для обозначения которой в языке PHP используется знак равенства (= ). Приводимая ниже строка кода создает новую переменную с именем $tireqty и переносит содержимое $_POST[‘tireqty’] в эту новую переменную:

$tireqty=$_POST[‘tireqty’]

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

5. В файле zakaz.php измените код следующим образом и проверьте работоспособность формы. Результат на рис. 3.3. Цифры могут отличаться в зависимости от того, какие данные Вы ввели.

Рисунок 3.3

Упражнение 2. Создание калькулятора для формы «Автозапчасти от Боба»

В этом уроке PHP рассмотрим основные арифметические функции PHP для расчетов.

1. Файл forma_bob.html сохраните под именем forma_bob_2.html

2. Файл zakaz.php сохраните под именем zakaz_2.php

3. В файле forma_bob_2.html форму «Автозапчасти от Боба» измените так, чтобы она имела вид, как на рис. 3.4. Не забудьте изменить имя обработчика на zakaz_2.php . Если затрудняетесь, то можете реализовать код, приведенный ниже.

Рисунок 3.4

4. Создайте новую обработку для формы в файле zakaz_2.php , используя знания, полученные из предыдущих уроков. Обработка должна содержать следующие выходные данные и условия:

1. Стоимость каждого товара определяется константой. Константа на PHP задается функцией define. Пример define("POKRPRICE",10); Первый параметр функции - это имя константы, которое пишется прописными буквами, второй параметр - значение константы.

2. Логическая операция ИЛИ обозначается ||

3. Логическая операция И обозначается && .

4. Операции сравнения: больше > , меньше < , больше или равно >= , меньше или равно <=

5. Функция, которая считывает время с компьютера date("H:i, j F")

6. Функция, которая форматирует количество знаков после запятой number_format . Пример number_format($sumnalog,2) . Первый параметр - переменная, у которой форматируем знаки, второй параметр - количество знаков после запятой.

7. Если Вы затрудняетесь с созданием обработки формы, может воспользоваться кодом, приведенным ниже (рис. 3.8):

Рисунок 3.8

Упражнение 3. Запись данных из формы в текстовый файл

В нашем уроке PHP также рассматриваем запись данных из формы в текстовый файл и функцию даты date() при обработке формы.

1. В файле-обработчике формы «Автозапчасти об Боба» после последней закрывающей фигурной скобки добавьте код.

Рисунок 3.9

2. Проверьте работу программы. Текстовый файл orders.txt создается автоматически, просмотрите его содержимое.

КОНТРОЛЬНОЕ ЗАДАНИЕ

После изучения данного урока PHP предлагается выполнить контрольное задание для закрепления полученных знаний.

Рисунок 3.10

1. Создать форму, как на рис. 3.10.

2. Создать обработку формы, которая будет выводить результаты заказа, как на рис. 3.11 (результаты будут отличаться в зависимости от введенных в форму данных.

3. Результаты заказа должны записываться в отдельный текстовый файл.

Список заказа должен отражать следующее:

  • Вид товара.
  • Стоимость 1 шт. товара.
  • Количество заказанных товаров.
  • Общую стоимость заказа без доставки, налога на продажи и скидок.
  • Стоимость доставки.
  • Величину налога с продажи.
  • Скидку в процентах и рублях.
  • Стоимость заказа с учетом доставки, налога с продаж и скидки.
  • Адрес доставки.

Условия задачи:

  1. Стоимость товаров:
    • ручки - 10 руб.
    • книги - 100 руб.
    • сувенира - 1000 руб.
    • компьютера - 10000 руб.
  2. Налог с продаж - 18%. Налог прибавляется к общей стоимости всех товаров с учетом скидки.
  3. Стоимость доставки - 500 руб. Стоимость доставки прибавляется к общей стоимости всех товаров в учетом скидки и налога с продаж.
  4. Скидки:
    • При заказе ручек или книг меньше 5 шт. скидка - 5%, от 5 до 10 шт. - 10%, выше 10 шт. - 20%;
    • При заказе сувениров или компьютеров от 10 до 20 шт. скидка - 10%, от 20 до 30 шт. - 20%, выше 30 шт. - 40%.

HTML формы — сложные элементы интерфейса. Они включают в себя разные функциональные элементы: поля ввода и

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

  • 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 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 является мощным инструментом обработки форм, позволяя производить самые разнообразные манипуляции над пользовательскими данными, такие, как сохранение данных о пользователе в базе данных для последующей авторизации, отправке сообщения на почту пользователя и многое другое.

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

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали о том, что такое сериализация в 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 существует множество других.

Поделиться