Файл: www/ycheb/php_teach/10.php
Строк: 574
<?php
include '../../config.php';
$title='Учебник PHP';
aut();
head();
?>
<html><head>
<title>Учебник PHP, Глава 10</title>
<meta http-equiv="Content-type" content="text/html; charset=Windows-1251">
</head>
<DIV class=infotxt>
<LI><A href="#a">Глава 10. Формы</A>
<UL>
<LI><A href="#b">Общие сведения о
формах</A>
<UL>
<LI><A href="#c">Элементы форм,
ориентированные на ввод с клавиатуры</A>
<LI><A href="#d">Элементы форм,
ориентированные на ввод с мыши</A>
<LI><A href="#e">Все вместе: пример
формы</A> </LI></UL>
<LI><A href="#f">Формы и PHP</A>
<UL>
<LI><A href="#g">Вводные примеры</A>
</LI></UL>
<LI><A href="#h">Проверка ошибок</A>
<LI><A href="#i">Динамическое
конструирование форм</A>
<LI><A href="#j">Проект: гостевая
книга</A>
<LI><A href="#k">Итоги</A> </LI></UL>
<UL></UL><A name=a></A>
<P> </P>
<P>ГЛАВА 10</P>
<P>Формы</P>
<P>Получение и обработка данных, введенных пользователем, стали
неотъемлемой частью большинства успешных web-сайтов. Бесспорно,
возможности накопления статистики, проведения опросов, хранения
персональных настроек и поиска выводят Web на принципиально новый уровень
— без них эта среда обладала бы минимальной интерактивностью.</P>
<P>Ввод информации в основном реализуется с применением форм HTML.
Несомненно, вы хорошо знакомы с принципами работы форм HTML. Как правило,
пользователь заполняет в форме одно или несколько полей (например, имя и
адрес электронной почты), нажимает кнопку отправки данных, после чего
получает ответное сообщение.</P>
<P>Возможно, вы полагаете, что сбор пользовательских данных в формах HTML
— процесс сложный и утомительный. В действительности эта задача решается
на удивление просто.</P>
<P><A href="http.html://doks.gorodok.net/0" name=b></A>Общие сведения о
формах</P>
<P>При вводе данных в форму используются различные управляющие элементы. В
одних элементах пользователь вводит информацию с клавиатуры, в других он
выбирает нужный вариант, щелкая кнопкой мыши. В формах могут
присутствовать скрытые поля, которые поддерживаются самой формой;
содержимое скрытых полей не должно изменяться пользователем.</P>
<P>Одна страница может содержать несколько форм, поэтому необходимы
средства, которые позволяли бы отличить одну форму от другой. Более того,
вы должны как-то сообщить форме, куда следует перейти, когда пользователь
выполняет действие с формой (как правило, нажимает кнопку отправки
данных). Обе задачи решаются заключением форм в следующие теги HTML:</P>
<P><form action = действие method = "метод" - элементы формы
-</form></P>
<P>Как видно из приведенного фрагмента, в тегах форм указываются два
важных элемента: действие и метод. Действие указывает, какой сценарий
должен обрабатывать форму, а метод определяет способ передачи данных этому
сценарию. Существует два метода:</P>
<UL>
<LI>Метод get передает все данные формы в конце URL. Из-за различных
ограничений, связанных со спецификой языков и длиной данных, этот метод
применяется редко.
<LI>Метод post передает все данные формы в теле запроса. Этот метод
используется чаще, чем get. </LI></UL>
<P>В этой главе приведена лишь очень краткая вводная информация по
основному син-таксису форм HTML. Более полную информацию можно найти в
книге А. Хоумера и К. Улмена «Dynamic HTML. Справочник» (СПб.: Питер,
1999).</P>
<P><A name=c></A>Элементы форм, ориентированные на ввод с клавиатуры</P>
<P>Наше знакомство с построением форм начнется с элементов,
ориентированных на ввод с клавиатуры. Таких элементов всего два —
текстовое поле (text box) и текстовая область (text area).</P>
<P>Текстовое поле</P>
<P>В текстовых полях обычно вводится короткая текстовая информация —
скажем, адрес электронной почты, почтовый адрес или имя. Синтаксис
определения текстового поля:</P>
<P><input type="text" nате="имя_переменной" size="N" maxlength="N"
value=""></P>
<P>Определение текстового поля включает пять атрибутов:</P>
<UL>
<LI>type — тип элемента (для текстовых полей — text);
<LI>name — имя переменной, в которой сохраняются введенные данные;
<LI>size — общий размер текстового поля в браузере;
<LI>maxlength — максимальное количество символов, вводимых в текстовом
поле;
<LI>value — значение, отображаемое в текстовом поле по умолчанию.
</LI></UL>
<P>Текстовое поле изображено на рис. 10.1.</P>
<P><IMG src="2_1_10.1Rus.jpg"></P>
<P>Рис. 10.1. Текстовое поле</P>
<P>Особой разновидностью текстовых полей является поле для ввода паролей.
Оно работает точно так же, как обычное текстовое поле, однако вводимые
символы заменяются звездочками. Чтобы создать в форме поле для ввода
паролей, достаточно указать type="password" вместо type="text".</P>
<P>Текстовая область</P>
<P>Текстовая область (text area) используется для ввода несколько больших
объемов текста, не ограничивающихся простым именем или адресом электронной
почты. Синтаксис определения текстовой области:</P>
<P><textarea name="имя_переменной" rows="N" cols="N"
value=""></textarea></P>
<P>Определение текстового поля включает три атрибута:</P>
<UL>
<LI>name — имя переменной, в которой сохраняются введенные данные;
<LI>rows — количество строк в текстовой области;
<LI>cols — количество столбцов в текстовой области. </LI></UL>
<P>Текстовая область изображена на рис. 10.2.</P>
<P> <IMG src="2_1_10.2Rus.jpg"></P>
<P>Рис. 10.2. Текстовая область</P>
<P><A name=d></A>Элементы форм, ориентированные на ввод с мыши</P>
<P>В других элементах форм пользователь выбирает один из заранее
определенных вариантов при помощи мыши. Я ограничусь описанием флажков,
переключателей и раскрывающихся списков.</P>
<P>Флажок</P>
<P>Флажки (checkboxes) используются в ситуациях, когда пользователь
выбирает один или несколько вариантов из готового набора — по аналогии с
тем, как ставятся «галочки» в анкетах. Синтаксис определения флажка:</P>
<P><input type="checkbox" name="имя_переменной"
valuе="начальное_значение"></P>
<P>Определение флажка включает три атрибута:</P>
<UL>
<LI>type — тип элемента (для флажков — checkbox);
<LI>name — имя переменной, в которой сохраняются введенные данные (в
данном случае — состояние элемента);
<LI>value — значение, присваиваемое переменной по умолчанию. Если флажок
установлен, именно это значение будет присвоено переменной с указанным
именем. Если флажок не установлен, значение атрибута value не
используется. </LI></UL>
<P>Флажок изображен на рис. 10.3.</P>
<P><IMG src="2_1_10.3Rus.jpg"></P>
<P>Рис. 10.3. Флажок</P>
<P>Переключатель</P>
<P>Переключатель (radio button) представляет собой разновидность флажка;
он работает практически так же за одним исключением — в любой момент
времени в группе может быть установлен лишь один переключатель. Синтаксис
определения переключателя:</P>
<P><input type="radio" name="имя_переменной"
value="начальное_значение"></P>
<P>Как видите, синтаксис почти не отличается от определения флажка.
Определение переключателя поля включает три атрибута:</P>
<UL>
<LI>type — тип элемента (для переключателей — radio);
<LI>name — имя переменной, в которой сохраняются введенные данные (в
данном случае — состояние элемента);
<LI>value — значение, присваиваемое переменной по умолчанию. Если
переключатель установлен, именно это значение будет присвоено переменной
с указанным именем. Если флажок не установлен, значение атрибута value
не используется. </LI></UL>
<P>Переключатель изображен на рис. 10.4.</P>
<P><IMG src="2_1_10.4Rus.jpg"></P>
<P>Рис. 10.4. Переключатель</P>
<P>Раскрывающийся список</P>
<P>Раскрывающиеся списки особенно удобны в ситуации, когда у вас имеется
длинный перечень допустимых вариантов, из которого пользователь должен
выбрать один вариант. Как правило, раскрывающиеся списки применяются при
работе с относительно большими наборами данных — например, при
перечислении американских штатов или стран. Синтаксис определения
раскрывающегося списка:</P>
<P><select name="имя_переменной"></P>
<P><option valuе="имя_переменной1 "></P>
<P><option value="имя_переменной2"></P>
<P><option value="имя_переменнойЗ"></P>
<P><option value="имя_переменнойN"></P>
<P></select></P>
<P>Определение переключателя поля включает три атрибута:</P>
<UL>
<LI>name — имя переменной, в которой сохраняются введенные данные (в
данном случае — строка, выбранная в списке);
<LI>value — значение, отображаемое в списке по умолчанию. </LI></UL>
<P>Раскрывающийся список изображен на рис. 10.5.</P>
<P> <IMG src="2_1_10.5Rus.jpg"></P>
<P>Рис. 10.5. Раскрывающийся список</P>
<P>Скрытые поля</P>
<P>Скрытые поля не отображаются в браузере и обычно используются для
передачи данных между сценариями. Хотя передача в скрытых полях работает
вполне нормально, в РНР существует другое, более удобное средство —
сеансовые переменные (см. главу 13). Впрочем, скрытые поля также
используются в некоторых ситуациях и потому заслуживают упоминания.</P>
<P>Синтаксис определения скрытого поля практически идентичен синтаксису
текстовых полей, отличается только атрибут типа. Поскольку скрытые поля не
отображаются в браузере, привести пример на страницах книги невозможно.
Синтаксис определения скрытого поля:</P>
<P><input type="hidden" name="имя_переменной"
value="начальное_значение"></P>
<P>Определение скрытого поля включает три атрибута:</P>
<UL>
<LI>type — тип элемента (для скрытых полей — hidden);
<LI>name — имя переменной, в которой сохраняются скрытые данные;
<LI>value — значение, по умолчанию сохраняемое в скрытом поле. </LI></UL>
<P>Вообще говоря, название этого элемента — скрытое поле — несколько
неточно. Хотя скрытые поля не отображаются в браузерах, пользователь может
просто выполнить команду View Source и увидеть, какие скрытые значения
хранятся в форме.</P>
<P>Кнопка отправки данных</P>
<P>Кнопка отправки данных инициирует действие, заданное атрибутом action
тега <form>. Синтаксис определения:</P>
<P><input type="submit" value="текст_на_кнопке"></P>
<P>Определение кнопки включает два атрибута:</P>
<UL>
<LI>type — тип элемента (для кнопки отправки данных — submit);
<LI>value — текст, по умолчанию отображаемый на кнопке. </LI></UL>
<P><IMG src="2_1_10.6Rus.jpg"></P>
<P>Рис. 10.6. Кнопка отправки данных</P>
<P>Кнопка сброса</P>
<P>Кнопка сброса отменяет все изменения, внесенные в элементы формы.
Обычно никто ею не пользуется, однако кнопки сброса так часто встречаются
на формах в Web, что я решил привести ее описание. Синтаксис
определения:</P>
<P><input type="reset" value=" текст _на_кнопке"></P>
<P>Определение кнопки включает два атрибута:</P>
<UL>
<LI>type — тип элемента (для кнопки сброса — reset);
<LI>value — текст, по умолчанию отображаемый на кнопке. </LI></UL>
<P>Кнопка сброса выглядит точно так же, как и кнопка отправки данных, если
не считать того, что на ней обычно выводится слово «Reset» (рис.
10.6).</P>
<P>Джейкоб Нильсен (Jakob Nielsen), известный авторитет в области Web,
недавно напи-сал интересную статью о проблемах, связанных с использованием
кнопки сброса. Статья опубликована по адресу <A
href="http.html://www.useit.com/alertbox/20000416.html">http://www.useit.com/alertbox/20000416.html</A>.</P>
<P><A name=e></A>Все вместе: пример формы</P>
<P>От описания базовых компонентов форм мы переходим к практическому
примеру — построению формы для обработки данных, введенных пользователем.
Допустим, вы хотите создать форму, в которой пользователь может высказать
мнение о вашем Сайте. Пример такой формы приведен в листинге 10.1.</P>
<P>Листинг 10.1. Пример формы для сбора данных</P>
<P><form action = "process.php" method = "post"></P>
<P><b>Please take a moment to tell us what you think about our
site:</b><p></P>
<P><b>Name:</b><br></P>
<P><input type="text" name="name" size="15" maxlength="25"
value=""><br></P>
<P><b>Email:</b><br></P>
<P><input type="text" name="email" size="15" maxlength="45"
value=""><br></P>
<P><b>How frequently do you visit our site?:</b><br></P>
<P><select name="frequency"></P>
<P><option value="">Site frequency:</P>
<P><option value="0">This is my first time</P>
<P><option value="l">&lt; 1 time a month</P>
<P><option value="2">Roughly once a month</P>
<P><option value="3">Several times a week</P>
<P><option value="4">Every day</P>
<P><option va1ue-"5">I'm addicted</P>
<P></select><br></P>
<P><b>I frequently purchase the following products from our
site:</b><br></P>
<P><input type="checkbox" name="software"
value="software">Software<br></P>
<P><input type="checkbox" name="cookware"
value="cookware">Cookware<br></P>
<P><input type="checkbox" name="hats" value="hats">Chef's
Hats<br></P>
<P><b>0ur site's greatest asset is:</b><br></P>
<P><input type="radio" name="asset" value="products">Product
selection<br></P>
<P><input type="radio" name="asset" value="design">Cool
design<br></P>
<P><input type="radio" name="asset" value="service">Customer
Service<br></P>
<P><b>Comments:</b><br></P>
<P><textarea name="comments" rows="3"
cols="40"></textarea><br></P>
<P><input type="submit" value="Submit!"></P>
<P></form></P>
<P>Внешний вид формы в браузере изображен на рис. 10.7.</P>
<P> <IMG src="2_1_10.7Rus.jpg"></P>
<P>Рис. 10.7. Пример формы для ввода данных</P>
<P>Вроде бы все понятно. Возникает вопрос — как получить данные, введенные
пользователем, и сделать с ними что-нибудь полезное? Этой теме посвящен
следующий раздел, «Формы и РНР».</P>
<P>Не забывайте: все сказанное ранее — не более чем вводный курс.
Приведенная информация ни в коем случае не исчерпывает всех возможностей,
предоставляемых различными компонентами форм. За дополнительной
информацией обращайтесь к многочисленным учебникам по работе с формами,
опубликованным в Web, а также книгам по HTML.</P>
<P>От предварительного знакомства с формами HTML мы переходим к самому
интересному — применению РНР для обработки данных, введенных пользователем
в форме.</P>
<P><A name=f></A>Формы и РНР</P>
<P>Обработка данных в формах имеет много общего с обработкой переменных,
передаваемых в URL, — эта тема подробно рассматривалась в предыдущей
главе.</P>
<P><A name=g></A>Вводные примеры</P>
<P>Следующие практические примеры помогут вам быстрее освоить различные
аспекты обработки форм в РНР. В этих примерах продемонстрированы разные
подходы к реализации интерактивных возможностей на сайте.</P>
<P>Пример 1: передача данных формы из одного сценария в другой</P>
<P>В первом примере представлена характерная ситуация — когда
пользовательские данные вводятся на одной странице и отображаются на
другой. В листинге 10.2 приведен код формы для ввода имени пользователя и
адреса электронной почты. Когда пользователь щелкает на кнопке отправки
данных (кнопка Go!), форма обращается к странице, приведенной в листинге
10.3. В свою очередь, листинг 10.3 выводит переменные $name и $mail,
переданные с запросом.</P>
<P>Листинг 10.2. Простая форма</P>
<P><html></P>
<P><head></P>
<P><title>Listing 10-2</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="#808040"></P>
<P><form action="listingl0-3.php" method="post"></P>
<P><b>Give us some information!</b><br></P>
<P>Your Name:<br></P>
<P><input type="text" name="name" size="20" maxlength="20"
value=""><br></P>
<P>Your Email:<br></P>
<P><input type="text" name="email" size="20" maxlength="40"
value=""><br></P>
<P><input type="submit" value="go!"></P>
<P></form></P>
<P></body> </html></P>
<P>Листинг 10.3. Отображение данных, введенных в листинге 10.1</P>
<P><html> <head></P>
<P><title>Listing 10-3</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="#808040"></P>
<P><?</P>
<P>// Вывести имя и адрес электронной почты.</P>
<P>print "Hi. $name!. Your email address is $email";</P>
<P>?></P>
<P></body> </html></P>
<P>В общих чертах происходит следующее: пользователь заполняет поля формы
и нажимает кнопку отправки данных. Управление передается странице,
приведенной в листинге 10.3, где происходит форматирование и последующее
отображение данных. Как видите, все просто.</P>
<P>Существует и другой способ обработки данных форм, при котором
используется всего один сценарий. К недостаткам этого способа относятся
увеличение сценария и как следствие — затруднения с редактированием и
сопровождением. Впрочем, есть и достоинства — уменьшение количества
файлов, с которыми вам приходится работать. Более того, в этом варианте
сокращается избыточный код при проверке ошибок (эта тема рассматривается
ниже в данной главе). Конечно, в некоторых ситуациях работать с одним
сценарием неудобно, но, по крайней мере, вы должны знать об этой
возможности. В примере 2 воспроизводится пример 1, но с использованием
лишь одного сценария.</P>
<P>Пример 2: альтернативная обработка формы (с одним сценарием)</P>
<P>Обработка данных формы в одном сценарии реализуется относительно
просто. Вы проверяете, были ли присвоены значения переменным формы. Если
значения присвоены, сценарий обрабатывает их (в нашем примере — просто
выводит), а если нет — отображает форму. Решение о том, было ли задано
значение переменной или нет, принимается при помощи функции strcmp( ),
описанной в главе 8. Пример реализации формы с одним сценарием приведен в
листинге 10.4. Обратите внимание: атрибут action формы ссылается на ту же
страницу, в которой определяется сама форма. Условная команда i f
проверяет состояние переменной скрытого поля с именем $seenform. Если
значение $seenform не задано, форма отображается в браузере, а если задано
— значит, форма была заполнена пользователем и введенные данные
обрабатываются сценарием (в данном примере — просто выводятся в
браузере).</P>
<P>Листинг 10.4. Ввод данных на форме в одном сценарии</P>
<P><html></P>
<P><head></P>
<P><title>Listing 10-4</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="f808040"></P>
<P><?</P>
<P>// Все кавычки внутри $form должны экранироваться,</P>
<P>// в противном случае произойдет ошибка.</P>
<P>$form = "</P>
<P><form action="listing10-4.php" method="post"></P>
<P><input type="hidden" name="seenform" value="y"></P>
<P><b>Give us some information!</b><br></P>
<P>Your Name:<br></P>
<P><input type="text" name="name" size="20" maxlength="20"
value=""><br></P>
<P>Your Email:<br></P>
<P><input type="text" name="email" size="20" maxlength="40"
value=""><br></P>
<P><input type="submit" value="subscribe!"></P>
<P></form>";</P>
<P>// Если форма ранее не отображалась, отобразить ее.</P>
<P>// Для проверки используется значение скрытой переменной $seenform.</P>
<P>if ($seenform != "у"):</P>
<P>print "$form";</P>
<P>else :</P>
<P>print "Hi. $name!. Your email address is $email";</P>
<P>endif;</P>
<P>?></P>
<P></body></P>
<P></html></P>
<P>Учтите, что этот вариант создает определенные неудобства, поскольку при
повторной загрузке страницы пользователь ничего не узнает о том, правильно
ли были заполнены поля формы. Процедура проверки ошибок рассматривается
далее в этой главе, а пока достаточно запомнить, что ввод данных можно
осуществить при помощи одного сценария.</P>
<P>Теперь, когда вы представляете, как просто выполняются операции с
формами, мы переходим к интересному примеру — автоматической отправке
данных пользователя по заданному адресу электронной почты. Эта возможность
реализована в примере 3.</P>
<P>Пример 3: автоматическая отправка данных по электронной почте</P>
<P>Вывести пользовательские данные в браузере несложно, но вряд ли это
можно назвать содержательной обработкой пользовательского ввода. Один из
способов обработки информации заключается в ее отправке по электронной
почте — например, администратору сайта. Хотя при помощи гиперссылки
mailto: можно отправить сообщение прямо из браузера, следует учитывать,
что внешние приложения электронной почты настроены не на каждом
компьютере. Следовательно, отправка сообщений с web-формы более надежно
гарантирует, что сообщение будет доставлено адресату.</P>
<P>В следующем разделе, mail( ), создается небольшая форма, в которой
пользователь вводит информацию и комментарии по поводу сайта. Затем данные
форматируются соответствующим образом и передаются стандартной функции РНР
mail( ). Но прежде чем переходить к построению формы, необходимо
предварительно рассмотреть синтаксис функции mail( ).</P>
<P>mail ( )</P>
<P>Функция mail( ) отправляет сообщение заданному адресату по электронной
почте. Синтаксис функции mail( ):</P>
<P>boolean mail (string получатель, string тема, string сообщение [,
string доп_заголовки])</P>
<P>В параметре тема, как нетрудно предположить, передается тема сообщения.
Параметр сообщение содержит текст сообщения, а необязательный параметр
доп_за головки предназначен для включения дополнительной информации
(например, атрибутов форматирования HTML), пересылаемой с сообщением.</P>
<P>В системе UNIX функция mail( ) использует утилиту sendmail. В Windows
эта функция работает лишь при наличии установленного почтового сервера или
если функция mail( ) связана с работающим сервером SMTP. Эта задача
решается модификацией переменной SMTP в файле php.ini.</P>
<P>Если вы сделали все необходимое и функция mail( ) работает в вашей
системе, попробуйте выполнить следующий фрагмент (конечно, адрес
youraddress@yourserver.com заменяется вашим настоящим адресом электронной
почты):</P>
<P>$email = "youraddress@yourserver.com";</P>
<P>$subject = "This is the subject";</P>
<P>$message = "This is the message";</P>
<P>$headers = "From: somebody@somesite.com";</P>
<P>mail ($email, $subject, $message, $headers);</P>
<P>Хотя при обширной переписке, конечно, следует использовать
специализированные почтовые программы вроде majordomo (<A
href="http.html://www.greatcircle.com/majordomo">http://www.greatcircle.com/majordomo</A>),
в простых случаях функции РНР mail( ) оказывается вполне достаточно.</P>
<P>Итак, после знакомства с функцией mail( ) можно применить ее на
практике. В листинге 10.5 показано, как получить информацию от
пользователя и отправить ее по адресу, заданному администратором
сценария.</P>
<P>Листинг 10.5. Пересылка пользовательских данных функцией mail( )</P>
<P><html></P>
<P><head></P>
<P><title>Listing 10-5</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="#808040"></P>
<P>// Все кавычки внутри $form должны экранироваться.</P>
<P>// в противном случае произойдет ошибка.</P>
<P>$form = "</P>
<P><form action="listing10-5.php" method="post"></P>
<P><input type="hidden" name="seenform" value="y"></P>
<P><b>Send us your comments!</b><br></P>
<P>Your Name:<br></P>
<P><input type="text" name="name" size="20" maxlength="20"
value=""><br></P>
<P>Your Email:<br></P>
<P><input type="text" name-"email" size="20" maxlength="40"
value=""><br></P>
<P>Your Comments:<br></P>
<P><textarea name="comments" rows="3"
cols="30"></textarea><br></P>
<P><input type="submit" value="submit!"></P>
<P></form></P>
<P>// Если форма ранее не отображалась, отобразить ее.</P>
<P>// Для проверки используется значение скрытой переменной $seenform.</P>
<P>if ($seenform != "у") :</P>
<P>print "$form"; else :</P>
<P>// Переменная $recipient определяет получателя данных формы</P>
<P>$recipient = "yourname@youremail.com";</P>
<P>// Тема сообщения</P>
<P>$subject = "User Comments ($name)";</P>
<P>// Дополнительные заголовки $headers = "From: $email";</P>
<P>// Отправить сообщение или выдать сообщение об ошибке</P>
<P>mail($recipient, $subject, $comments, $headers) or die("Could not send
email!");</P>
<P>// Вывести сообщение для пользователя</P>
<P>print "Thank you $name for taking a moment to send us your
comments!";</P>
<P>endif;</P>
<P>?></P>
<P></body></P>
<P></html></P>
<P>Неплохо, правда? Листинг 10.5 работает так же, как листинг 10.4;
сначала мы проверяем, отображалась ли форма ранее. Если это происходило,
программа вызывает функцию mail( ) и пользовательские данные отправляются
по адресу, определяемому переменной $recipient. Затем в браузере выводится
благодарственное сообщение для пользователя.</P>
<P>Простейшим расширением этого примера будет отправка благодарственного
сообщения по электронной почте (вторым вызовом mail( )). Следующий пример
развивает эту идею — пользователю предлагается на выбор несколько
бюллетеней. Выбранные бюллетени отправляются по электронной почте.</P>
<P>Пример 4: отправка запрашиваемой информации по электронной почте</P>
<P>В этом примере в форме создается несколько флажков, каждый из которых
соответствует отдельному документу с информацией о сайте. Пользователь
устанавливает один, два или три флажка, вводит свой адрес, и запрашиваемые
брошюры отправляются ему по электронной почте. Обратите внимание на
применение массива при работе с флажками — это упрощает проверку выбранных
флажков, а также улучшает структуру программы.</P>
<P>Информационные сообщения хранятся в отдельных файлах. В нашем примере
используются три текстовых файла:</P>
<UL>
<LI>site.txt — информация о сайте;
<LI>team.txt — информация о талантливых разработчиках сайта;
<LI>events.txt — приглашение на очередное мероприятие. </LI></UL>
<P>Исходный текст примера приведен в листинге 10.6.</P>
<P>Листинг 10.6.Отправка информации, запрашиваемой пользователем</P>
<P><html></P>
<P><head></P>
<P><title>Listing10-5</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="#808040"></P>
<P><?</P>
<P>$form = "</P>
<P><form action="Listing10-6.php" method="post"></P>
<P><input type="hidden" name="seenform" value="y"></P>
<P><b>Receive information about our site!</b><br></P>
<P>Your Email:<br></P>
<P><input type="text" name="email" size="20" maxlength="40"
value=""><br></P>
<P><input type="checkbox" name="information[site]"
value="y">Site Architecture<br></P>
<P><input type="checkbox" name="information[team]"
value="y">Development Team<br></P>
<P><input type="checkbox" name="information[events]"
value="y">Upcoming Events<br></P>
<P><input type="submit" value="send it to me!"></P>
<P></form>":</P>
<P>if ($seenform != "y") :</P>
<P>print "$form"; else :</P>
<P>$headers = "From: devteam@yoursite.com";</P>
<P>// Перебрать все пары "ключ/значение"</P>
<P>while ( list($key, Sval) = each ($information) ) :</P>
<P>// Сравнить текущее значение с "у" if ($val == "у") :</P>
<P>// Построить имя файла, соответствующее текущему ключу</P>
<P>$filename = "$key.txt":</P>
<P>$subject = "Requested $key information";</P>
<P>// Открыть файл</P>
<P>$fd = fopen ($filename, "r");</P>
<P>// Прочитать содержимое всего файла в переменную $contents = fread
($fd. filesize ($filename));</P>
<P>// Отправить сообщение</P>
<P>mail($email, $subject, $contents, $headers) or die("Can't send
email!");; fclose($fd);</P>
<P>endif;</P>
<P>endwhile;</P>
<P>// Известить пользователя об успешной отправке</P>
<P>print sizeof($information)." informational newsletters</P>
<P>have been sent to $email!";</P>
<P>endif;</P>
<P>?></P>
<P></body></P>
<P></html></P>
<P>В листинге 10.6 мы перебираем пары «ключ/значение» в цикле while и
отправляем только те бюллетени, у которых значение равно у. Следует
помнить, что имена текстовых файлов должны соответствовать ключам
массива</P>
<P>(site.txt, team.txt и events.txt). Имя файла строится динамически по
ключу, после чего файл открывается по имени и его содержимое загружается в
переменную ($contents). Затем переменная $contents передается функции
mail( ) в качестве параметра.</P>
<P>В следующем примере пользовательские данные сохраняются в текстовом
файле.</P>
<P>Пример 5: сохранение пользовательских данных в текстовом файле</P>
<P>Пользовательские данные сохраняются в текстовом файле для последующего
статистического анализа, поиска и т. д. — короче, любой обработки по
вашему усмотрению. В листинге 10.7, как и в предыдущих примерах, данные
формы обрабатываются в одном сценарии. Пользователю предлагается ввести
четыре объекта данных: имя, адрес электронной почты, язык и профессию.
Введенная информация сохраняется в текстовом файле user_information.txt.
Элементы данных разделяются символами «вертикальная черта» (|).</P>
<P>Листинг 10.7. Сохранение пользовательской информации в текстовом
файле</P>
<P><html></P>
<P><head></P>
<P><titlexisting 10-7</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="#808040"></P>
<P><?</P>
<P>// Создать форму</P>
<P>$form = "</P>
<P><form action="Listing10-7.php" method="post"></P>
<P><input type="hidden" name="seenform" value="y"></P>
<P><b>Give us your personal info!</fb><br></P>
<P>Your Name:<br></P>
<P><input type="text" name="name" size="20" maxlength="20"
value=""><br></P>
<P>Your Email:<br></P>
<P><input type="text" name"="email" size="20" maxlength="20"
value=""><br></P>
<P>Your Preferred Language:<br></P>
<P><select name="language"></P>
<P><option value="">Choose a language:</P>
<P><option value="English">English</P>
<P><option value="Spanish">Spanish</P>
<P><option value="Italian">Italian</P>
<P><option value="French">French</P>
<P><option value="Japanese">Japanese</P>
<P><option value="newyork">NewYork-ese</P>
<P></select><br></P>
<P>Your Occupation:'"ibr></P>
<P><select name="job"></P>
<P><option value="">What do you do?:</P>
<P><option value="student">Student</P>
<P><option value= "programmed ">Programmer</P>
<P><option value="manager">Project Manager</P>
<P><option value="slacker">Slacker</P>
<P><option value="chef">Gourmet Chef</P>
<P></select><br></P>
<P><input type="submit" value="submit!"></P>
<P></form>";</P>
<P>// Заполнялась ли форма ранее? if ($seenform != "у") :</P>
<P>print "$form"; else :</P>
<P>$fd = fopen("useMnformation.txt", "a");</P>
<P>// Убедиться, что во введенных данных не встречается</P>
<P>// вертикальная черта.</P>
<P>$name = str_replace("|", "", $name);</P>
<P>$email = str_replace("|", "", $email);</P>
<P>// Построить строку с пользовательскими данными</P>
<P>$user_row = $name." ".$email."|".$language." ".$job."n";</P>
<P>fwrite($fd, $user_row) or die("Could not write to file!");</P>
<P>fclose($fd);</P>
<P>print "Thank you for taking a moment to fill out our brief
questionnaire!":</P>
<P>endif;</P>
<P>?></P>
<P></body></P>
<P></html></P>
<P>Обратите внимание на фрагмент, в котором мы проверяем, что пользователь
не включил в имя или адрес электронной почты символы «вертикальная черта»
(|). Функция str_replace( ) удаляет эти символы, заменяя их пустой
строкой. Если бы это не было сделано, пользовательские символы | нарушили
бы структуру файла данных и существенно затруднили (а то и сделали
невозможным) его правильную обработку.</P>
<P>При работе с относительно малыми объемами информации вполне можно
обойтись текстовыми файлами. Однако при большом количестве пользователей
или объеме сохраняемой информации для хранения и обработки данных,
введенных в форме, лучше воспользоваться базой данных. Эта тема подробно
рассматривается в главе 11.</P>
<P>До настоящего момента предполагалось, что пользователь всегда вводит
правильные данные и не действует злонамеренно. В высшей степени
оптимистичное предположение! В следующем разделе мы усовершенствуем
рассмотренные примеры и организуем проверку целостности данных форм.
Проверка ошибок не только обеспечивает удаление неполной и неправильной
информации, но и обеспечивает более эффективный и удобный интерфейс.</P>
<P><A name=h></A>Проверка ошибок</P>
<P>Обработка пользовательских данных дает осмысленный результат лишь в том
случае, если данные имеют правильную структуру. Проверить достоверность
введенных данных невозможно, однако вы можете проверить их целостность
(например, убедиться в том, что адрес электронной почты соответствует
стандартному шаблону). Хотя для проверки данных часто применяется
технология JavaScript, могут возникнуть проблемы с несовместимостью
браузеров. Поскольку код РНР выполняется на стороне сервера, вы всегда
можете быть уверены в том, что проверка данных формы даст нужный результат
(конечно, при условии правильности вашей программы).</P>
<P>При обнаружении ошибки в данных необходимо сообщить об этом
пользователю и предложить внести исправления. Существует несколько
возможных решений, в том числе простой вывод сообщения об ошибке и
предложение альтернативных вариантов (например, если пользователь выбирает
имя, которое уже было выбрано другим пользователем). В этом разделе
рассматривается процедура проверки и вывода сообщений,</P>
<P>Пример 6: вывод информации о пустых или ошибочно заполненных полях
формы</P>
<P>Ни один разработчик сайта не захочет раздражать пользователя
невразумительными сообщениями об ошибках в данных — особенно если
пользователь запрашивает дополнительную информацию о товаре или оформляет
покупку! Чтобы пользователь понял, какие поля формы остались пустыми или
были заполнены неверно, сообщения должны быть четкими и конкретными.</P>
<P>Мы последовательно проверяем все поля формы и убеждаемся в том, что они
не остались пустыми. Там, где это возможно, проверяется правильность
структуры введенных данных. Если проверка прошла успешно, мы переходим к
следующему полю; в противном случае программа выводит сообщение об ошибке,
устанавливает флаг, который позднее используется для повторного
отображения формы, и переходит к следующему полю. Процедура повторяется до
тех пор, пока не будут проверены все поля формы (листинг 10.8).</P>
<P>Листинг 10.8. Проверка данных формы и вывод сообщений об ошибках</P>
<P><html></P>
<P><head></P>
<P><title>Listing 10-8</title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040" alink="#808040"></P>
<P><?</P>
<P>// Создать форму</P>
<P>$form = "</P>
<P><form action="Listing10-8.php" method="post"></P>
<P><input type="hidden" name="seenform" value="y"></P>
<P><b>Give us some information!</b><br></P>
<P>Your Name:<br></P>
<P><input type="text" name="name" size="20" maxlength="20"
value="$name"><br></P>
<P>Your Email:<br></P>
<P><input type="text" name="email" s1ze="20" maxlength="40"
value="$email"><br></P>
<P><input type="submit" value="subscribe!"></P>
<P></form>":</P>
<P>// Заполнялась ли форма ранее?</P>
<P>if ($seenform != "у"):</P>
<P>print "$form";</P>
<P>// Пользователь заполнил форму. Проверить введенные данные, else :</P>
<P>$error_flag = "n";</P>
<P>// Убедиться в том. что поле имени содержит информацию</P>
<P>if ($name == "") :</P>
<P>print "<font color="red">* You forgot to enter your name!</P>
<P></font> <br>":</P>
<P>$error_flag = "y";</P>
<P>endif:</P>
<P>// Убедиться в том. что поле адреса содержит информацию</P>
<P>if ($email == "") :</P>
<P>else :</P>
<P>print "<font color="red">* You forgot to enter your email !</P>
<P></font> <br>"</P>
<P>$error_flag = "y";</P>
<P>// Преобразовать все алфавитные символы в адресе</P>
<P>// электронной почты к нижнему регистру</P>
<P>$email = strtolower(trim($email)):</P>
<P>// Убедиться в правильности синтаксиса</P>
<P>// адреса электронной почты</P>
<P>if (! @eregi('^[0-9a-z]+'.</P>
<P>'([0-9a-z-]+.)+'.</P>
<P>'([0-9a-z]){2.4}$'. $email)) :</P>
<P>print "<font color="red">* You entered an invalid email
address!</P>
<P></font> <br>" :</P>
<P>$error_flag = "y";</P>
<P>endif;</P>
<P>endif;</P>
<P>// Если флаг ошибки $error_flag установлен.</P>
<P>// заново отобразить форму</P>
<P>if ($error_flag == "у") : print "$form";</P>
<P>else :</P>
<P>// Обработать данные пользователя</P>
<P>print "You entered valid form information!";</P>
<P>endif;</P>
<P>endif;</P>
<P>?></P>
<P></body></P>
<P></html></P>
<P>Программа в листинге 10.8 убеждается в том, что поля имени и адреса
электронной почты не остались пустыми, а также проверяет правильность
синтаксиса вве-, денного адреса. Если в результате каких-либо проверок в
форме обнаруживаются ошибки, программа выводит соответствующие сообщения и
отображает форму заново — при этом вся введенная ранее информация остается
в форме, благодаря чему пользователю будет проще внести исправления. Если
вывести пустую форму и предложить пользователю заполнить ее заново, он
может отправиться</P>
<P>за необходимым товаром или услугой в другое место.</P>
<P><A name=i></A>Динамическое конструирование форм</P>
<P>До настоящего момента я программировал все формы вручную. Любому
программисту известно, что ручное кодирование — это плохо, поскольку оно
увеличивает вероятность ошибок, не говоря уже о лишних затратах
времени.</P>
<P>В следующем разделе я представлю сценарий, в котором раскрывающийся
список строится динамически по содержимому массива. Этот прием несложен,
однако</P>
<P>он экономит немало времени как при исходном программировании, так и при
последующем сопровождении программы.</P>
<P>Пример 7: построение раскрывающегося списка</P>
<P>Предположим, у вас имеется список сайтов, которые вы хотите
порекомендовать посетителю из-за классного дизайна. Вместо того чтобы
жестко кодировать каждую строку списка, можно создать массив и
воспользоваться его содержимым для заполнения списка.</P>
<P>В листинге 10.9, как и в предыдущих примерах, реализован вариант с
одним сценарием. Сначала мы проверяем, было ли присвоено значение
переменной $site. Если проверка дает положительный результат, вызывается
функция header( ) с параметром, в котором значение $site присоединяется к
строке «Location:http://». При передаче этой команды функция header О
перенаправляет браузер на указанный URL. Если значение переменной $site не
задано, форма выводится в браузере. Раскрывающийся список строится в
цикле, количество итераций зависит от размера массива Sfavsites. В
листинге 10.9 я включил в этот массив пять своих любимых сайтов. Конечно,
вы можете добавить в него сколько угодно своих сайтов.</P>
<P>Запомните одно
важное обстоятельство — функция header( ) должна вызываться до вывода
данных в браузере. Ее нельзя просто вызвать в любой точке сценария РНР.
Несвоевременные вызовы header( ) порождают столько проблем у неопытных
программистов РНР, что я рекомендую повторить это правило раз пять, чтобы
лучше запомнить его.</P>
<P>Листинг 10.9. Динамическое построение раскрывающегося списка</P>
<P><?</P>
<P>if ($site != "") :</P>
<P>header("Location: http://Ssite");</P>
<P>exit;</P>
<P>else :</P>
<P>?></P>
<P><html></P>
<P><head></P>
<P><title>Listing 10-9</Fit1e></P>
<P></head></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><?</P>
<P><form action = "Listing10-9.php" method="post"></P>
<P><select name="site"></P>
<P><option value = "">Choose a site:</P>
<P>$х = 0:</P>
<P>while ( $х < sizeof ($favsites) ) :</P>
<P>print "<option value='$favsites[$x]'>$favsites[$x]";</P>
<P>$x++;</P>
<P>endwhile;</P>
<P>?></P>
<P></select></P>
<P><input type="submit" value="go!"></P>
<P></form></P>
<P><?</P>
<P>endif;</P>
<P>?></P>
<P>Динамическое конструирование форм особенно удобно при обработке больших
объемов данных, которые в любой момент могут измениться, что приведет к
устареванию всей жестко закодированной информации форм. Впрочем, я
рекомендую жестко кодировать все статические данные (например, список
штатов США), поскольку это ускорит работу программы.</P>
<P><A name=j></A>Проект: гостевая книга</P>
<P>С первых дней World Wide Web разработчики сайтов стремились к тому,
чтобы посетители могли поделиться своими мыслями и комментариями по поводу
сайта. На сайтах эта возможность обычно называется «гостевой книгой»
(guestbook). Я покажу, как легко создать гостевую книгу при помощи форм
HTML, средств обработки форм РНР и текстового файла.</P>
<P>Прежде всего создается инициализационный файл, содержащий некоторые
глобальные переменные и функции приложения (листинг 10.10).</P>
<P>Листинг 10.10. Файл init.inc, используемый при создании гостевой
книги</P>
<P><?</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>while (! feof($fh)) :</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">&nbsp:</td></tr>";</P>
<P>endif;</P>
<P>endwhile;</P>
<P>print "</table>";</P>
<P>// Закрыть файл</P>
<P>fclose($fh);</P>
<P>else :</P>
<P>print "<h3>Currently there are no entries in the
guestbook!</h3>";</P>
<P>endif;</P>
<P>} // view_guest</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 |$commentsn";</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>} // add_guest</P>
<P>?></P>
<P>Затем создаются еще три файла: файл ссылок index.php, файл
add_guest.php для вывода информации гостевой книги и файл view_guest.php
для ввода новых данных. Файл index.php (листинг 10.11) просто отображает
две ссылки для выполнения основных функций гостевой книги — просмотра и
добавления новых данных. Эти ссылки легко включаются в сайт, имеющий более
сложную структуру.</P>
<P>Листинг 10.11. Файл index.php со ссылками для просмотра и добавления
новых данных в гостевую книгу</P>
<P><html></P>
<P><?</P>
<P>INCLUDE("init.inc");</P>
<P>?></P>
<P><head></P>
<P><title><?=$page_title;?></title></P>
<P></head></P>
<P><body bgcolor="<?=$bg_color;?>" text="#000000" link="#808040"
vlink="#808040" alink="#808040"></P>
<P><a href="view_guest.html.php">View the
guestbook!</a><br></P>
<P><a href="add_guest.html.php">Sign the
guestbook!</a><br></P>
<P></body></P>
<P></html></P>
<P>Файл view_guest.php (листинг 10.12) выводит всю информацию гостевой
книги, хранящуюся в файле данных.</P>
<P>Листинг 10.12. Файл view_guest.php</P>
<P><html></P>
<P><?</P>
<P>INCLUDE("init.inc");</P>
<P>?></P>
<P><head></P>
<P><t1tle><?=$page_title;?></t1tle></P>
<P></head></P>
<P><body bgcolor="<?=$bg_color:?>" text="#000000" link="
vlink="#808040" alink="#808040"></P>
<P>vi ew_guest ( $guest_file );</P>
<P>?></P>
<P>Файл add_guest.php (листинг 10.13) запрашивает у пользователя новые
данные для внесения в гостевую книгу. Введенная информация записывается в
файл данных.</P>
<P>Листинг 10.13. Файл add_guest.php</P>
<P><html></P>
<P><?</P>
<P>INCLUDE("init.inc");</P>
<P>?></P>
<P><head></P>
<P><title><?=$page_title:?></title></P>
<P></head></P>
<P><body bgcolor="#ffffff" text="#000000" link="#808040"
vlink="#808040" alink="#808040"></P>
<P>?<</P>
<P>// Если форма еще не отображалась - запросить данные у пользователя</P>
<P>if (! $seenform) :</P>
<P>?></P>
<P><form action="add_guest.php" method="post"></P>
<P><input type="hidden" name="seenform" value="y"></P>
<P>Name:<br></P>
<P><input type="text" name="name" size="15" maxlength="30"
value=""><br></P>
<P>Email:<br></P>
<P><input type="text" name="email" size="15" maxlength="35"
value=""><br></P>
<P>Comment: <br></P>
<P><textarea name="comment" rows="'3"
cols="40"></textarea><br></P>
<P><input type="submit" value="submit"></P>
<P></form></P>
<P>// Форма уже отображалась - добавить данные в текстовый файл.</P>
<P>else :</P>
<P>add_guest($name, $email, $comment);</P>
<P>print "<h3>Your comments have been added to the guestbook.</P>
<P><a href="index.php">Click here</a> to return to the
index. </h3>";</P>
<P>endif;</P>
<P>?></P>
<P>К числу основных преимуществ модульной разработки приложений относится
простота адаптации для других систем. Допустим, вы решили перейти от
хранения данных в текстовом файле к использованию базы данных. Стоит
изменить содержимое add_guest( ) и view_guest( ), и ваша гостевая книга
перейдет на работу с базой данных.</P>
<P>На рис. 10.8 показано, как выглядит гостевая книга после сохранения
пары записей.</P>
<P> <IMG src="2_1_10.8Rus.jpg"></P>
<P>Рис. 10.8. Просмотр гостевой книги (view_guest.php)</P>
<P>Информация, показанная на рис. 10.8, хранится в файле данных в
следующем виде:</P>
<P>Oct 29 00|Michele|michelle@latorre.com|I love cheese!</P>
<P>Oct 29 00|Nino|nino@latorre.com|Great site!</P>
<P><A name=k></A>Итоги</P>
<P>Обработка данных форм принадлежит к числу сильнейших сторон РНР,
поскольку простота и надежность сочетаются в ней с одним из важнейших
аспектов любого сайта — интерактивностью. В этой главе рассматривался
широкий круг вопросов, относящихся к формам и роли РНР в обработке данных
форм, в том числе:</P>
<UL>
<LI>общие сведения о синтаксисе форм;
<LI>передача данных форм между сценариями РНР;
<LI>обработка форм в одном сценарии;
<LI>функция mail( );
<LI>отправка данных формы по электронной почте;
<LI>автоматическая обработка пользовательских запросов на получение
информации;
<LI>сохранение данных пользователя в текстовом файле;
<LI>проверка ошибок;
<LI>динамическое конструирование форм. </LI></UL>
<P>Если вы собираетесь работать со сколько-нибудь заметными объемами
информации, одним из первых шагов на этом пути должна стать интеграция
базы данных в структуру сайта. Эта тема рассматривается в следующей
главе.</P></LI></DIV>
<center>
[ <a href="09.php">Назад</a> | <a href="index.php">Содержание</a> | <a href="11.php">Вперед</a> ]
</center><br>
<?php
echo gb.'<a href="../../ycheb">Учебники</a>'.div;
echo gb.'<a href="'.H.'enter">Прихожая</a>'.div;
foot(); ?>