Обработка информации из форм
ЛАБОРАТОРНАЯ РАБОТА
Тема: Проектирование и реализация веб-приложения "Работа с формами"
Цель работы: На основе задачи обработки форм ознакомиться с возможными подходами к проектированию небольших, но нетривиальных веб-приложений, учитывающих специфику языка PHP
Подключение внешних файлов
Часто запрашиваемая страница на сервере собирается из разных частей, сценарий каждой из которых хранится отдельно. Это позволяет разбить проект на группу относительно небольших файлов, которыми проще управлять.
РНР имеет четыре команды, которые позволяют вставлять в один файл текст из другого: include и require, а также их варианты, запрещающие случайную повторную подгрузку одних и тех же файлов: include_once и require_once.
Инструкции include() и require() близки по смыслу. Они считывают и исполняют код, находящийся в указанном файле. Синтаксис:
include $filename;
require $filename; // можно со скобками, а можно — без.
Здесь $filename — путь к подключаемому файлу, причем это может быть удаленный файл, заданный с помощью URL.
Замечание.
Следует обратить внимание, что фактически подключается html-файл со вставками на php. В частном случае, это может быть просто обычный html-текст, чем пользуются, когда для формирования страниц применяют технику шаблонов.
Если при обработке php-скрипта интерпретатор встречает вызов include/require, то порядок его действий следующий.
1. Проверятся путь к файлу.
2. Если файл существует, то интерпретатор считывает и интерпретирует текст файла, если он содержит программный код.
3. После того, как достигнут конец файла, РНР-интерпретатор переключается в режим выполнения скриптов и продолжает выполнять основной скрипт, начиная со следующей за include (require) строкой.
По умолчанию РНР ищет подключаемые файлы в текущем каталоге или специальном каталоге, определенном директивой include_path в файле рhp.ini.
При большой внешней схожести между двумя конструкциями есть некоторые различия. Главное из них связано с действиями при ошибке "файл не найден":
include — ошибка игнорируется, выполнение скрипта продолжает, а
require — выполнение скрипта прекращается (require по смыслу "обязательно").
Элементы fieldset и legend
Эти теги позволяют группировать html-элементы (чаще всего элементы форм), обводя их рамкой (fieldset), в контур которой встраивается текст (legend), указывающий пользователю назначение группы элементов формы.
Оба элемента позволяют задавать стили отображения, а legend допускает форматирование текста с помощью обычных тегов, например, <b> и <i>.
Пример.
В следующем примере показана техника применения элементов fieldset и legend. Для одной формы можно создать несколько таких блоков.
<fieldset style="border:solid red 2px;width:200px;"> <legend style="font-family:arial;font-size:14px;"> <b>Пример fieldset</b> </legend> <div style="padding:20px;font-family:verdana;"> Сюда обычно помещают группу элементов формы </div> </fieldset> |
Элемент button
Этот элемент может использоваться в формах или сам по себе. Его атрибут type допускает значения submit, reset и button (по умолчанию).
Когда кнопка нужна только для запуска некоторого скрипта, то можно обойтись без формы, используя элемент button с type="button". На эту кнопку можно поместить одновременный форматированный текст, картинки. Кроме того, можно также управлять стилями отображения, например, цветом фона кнопки.
Созданная таким образом кнопка при щелчке "утапливается", как должно быть при нажатии. Функциональность кнопки определяется заданием обработчика события onclick.
<button width="60" onclick="openMyPage()" style="background-color:wheat"> <img src="new.gif" border="0" hspace="10" vspace=5> <h3>Кнопка</h3> </button> |
Значение атрибута value из отмеченной позиции переключателя передается через элемент соответствующего суперглобального массива с индексом, совпадающим с атрибутом name элементов переключателя (радиокнопок из группы).
Однако если ни одна кнопка не выбрана (нет элемента с заданным атрибутом checked и пользователь еще ничего не выбрал), то соответствующий элемент суперглобального массива не создается. Эту ситуацию можно определить, применяя функцию isset к соответствующему элементу массива данных из формы.
3. Флажки.
Если флажок установлен, то в суперглобальный массив передается значение соответствующего атрибута value.
Если флажок не установлен, то элемент суперглобального массива не создается.
Если несколько флажков имеют одно и тоже имя, то из их значений можно сформировать массив (аналогично случаю текстовых полей, нужно добавить пустые квадратные скобки).
4. Информация из списков.
Если из списка можно выбрать только одно значение, то это значение записывается в элемент с индексом, совпадающим атрибутом name элемента формы. Если значение из списка пользователем не выбрано, то соответствующий элемент суперглобального массива не создается.
Если используется список, в котором можно выбрать несколько значений (используя клавишу Ctrl), то, чтобы переслать их как массив, значение атрибута name нужно дополнить пустыми квадратными скобками:
<select name="selector[]" multiple>
<option>Выбор 1
<option>Выбор 2
<option>Выбор 3
</select>
ЗАДАНИЕ
Создать анкету — форму. В форму включены следующие элементы:
а) группа текстовых полей "Фамилия", "Имя", "Отчество" (передается на обработку массивом);
б) переключатель "Пол";
в) группа флажков "Программирую:" со значениями "Си", "Паскаль", "PHP" (передается на обработку массивом);
г) список с множественным выбором "Могу работать:" со значениями "Программистом", "Системным администратором", "Руководителем группы", "Постановщиком задач".
Скрипт, обрабатывающий форму, в ответе пользователю выводит полученную от него информацию и ждет оценки, все ли верно или нужно ли вносить исправления. При утвердительно ответе выводится страница с благодарностью за заполнение анкеты. При отрицательном ответе — анкета предлагается повторно, но уже со всеми ранее заполненными пользователем полями.
Реализовать всю программу в одном php-файле (с подгрузкой файла php-кода).
Анализ работы программы
Программа должна отображать четыре типа страниц, содержащих:
а) исходную форму с пустыми полями, в которую пользователь заносит информацию (рис. 1);
б) информацию, взятую из формы и представленную для проверки в текстовом виде (рис. 3);
в) восстановленную форму с введенной ранее информацией для внесения исправлений, если пользователь при проверке нашел неточности (рис. 2);
г) благодарность за заполнение формы (рис. 4).
Первый и третий типы страниц имеют кнопку "Отослать", которая используется для передачи занесенной в форму информации на проверку.
|
|
Второй тип страницы имеет две кнопки: "Верно" для подтверждения правильности введенной информации и "Исправить", когда нужно вернуть форму для исправлений.
|
Четвертая страница не содержит ничего, кроме текста благодарности.
|
Чтобы реализовать эти варианты в одном файле, этот документ должен включать четыре элемента div, отображение которых управляется свойством display — в любой момент времени виден только один тип содержания.
Схема переходов между различными представлениями страницы:
Функция Отослать требует перезагрузки страницы, так как необходимо извлечь информацию из формы и отобразить ее другим способом. Поэтому выполнение этой функции требует участия сервера (что означает использование РHP-кода).
Переходы, связанные с выполнением функций Исправить и Верно, можно выполнять без перезагрузки страницы, поэтому их экономнее реализовать на стороне клиента (Javascript).
ПОРЯДОК ВЫПОЛНЕНИЯ ЗАДАНИЯ
Выполнение задания разбито на два этапа. На первом пишется код, который управляет действием кнопок Отправить, Исправить и Верно, т.е. реализует основу функциональности программы (с простейшей частью формы и пока без отслеживания вводимых в нее данных).
На втором этапе форма дополняется необходимыми элементами и организуется необходимое управление информацией, которая введена в нее пользователем.
Метод extract
РНР обладает большой библиотекой функций, предназначенных для работы с массивами. Атрибуты name полей формы становятся индексами элементов массивов $_POST или $_GET. Ранее на сервере при получении формы эти имена автоматически преобразовывались в имена переменных. С целью более жесткого контроля за поступающей информацией одновременно с введением суперглобальных массивов произошел отказ от таких неявных преобразований. Однако для любого ассоциативного массива, включая суперглобальные, с помощью метода extract можно преобразовать массив в совокупность переменных (если в индексах соблюдены правила именования переменных!).
Таким образом, после выполнения оператора extract($_POST); можно пользоваться соответствующими переменными без обращения к массиву $_POST.
Вопросы для самоконтроля
1. В чем отличия инструкций include() и require()?
2. Можно ли с помощью этих инструкций подключить к сценарию обычный html-файл?
3. Для чего предназначены элементы fieldset и legend? Как они связаны между собой?
4. Что можно поместить в элемент типа button? Как можно управлять отображением элементов, помещенных на кнопку?
5. Содержание каких типов элементов формы можно передавать на сервер массивом?
6. Всегда ли на сервер отсылается информация из переключателей, флажков и списков?
7. Как можно в серверном скрипте проверить, были ли отмечены флажок или одно из положений переключателя?
8. Как обеспечить выбор передачу нескольких значений из списка <select>?
ЛАБОРАТОРНАЯ РАБОТА
Тема: Проектирование и реализация веб-приложения "Работа с формами"
Цель работы: На основе задачи обработки форм ознакомиться с возможными подходами к проектированию небольших, но нетривиальных веб-приложений, учитывающих специфику языка PHP
Подключение внешних файлов
Часто запрашиваемая страница на сервере собирается из разных частей, сценарий каждой из которых хранится отдельно. Это позволяет разбить проект на группу относительно небольших файлов, которыми проще управлять.
РНР имеет четыре команды, которые позволяют вставлять в один файл текст из другого: include и require, а также их варианты, запрещающие случайную повторную подгрузку одних и тех же файлов: include_once и require_once.
Инструкции include() и require() близки по смыслу. Они считывают и исполняют код, находящийся в указанном файле. Синтаксис:
include $filename;
require $filename; // можно со скобками, а можно — без.
Здесь $filename — путь к подключаемому файлу, причем это может быть удаленный файл, заданный с помощью URL.
Замечание.
Следует обратить внимание, что фактически подключается html-файл со вставками на php. В частном случае, это может быть просто обычный html-текст, чем пользуются, когда для формирования страниц применяют технику шаблонов.
Если при обработке php-скрипта интерпретатор встречает вызов include/require, то порядок его действий следующий.
1. Проверятся путь к файлу.
2. Если файл существует, то интерпретатор считывает и интерпретирует текст файла, если он содержит программный код.
3. После того, как достигнут конец файла, РНР-интерпретатор переключается в режим выполнения скриптов и продолжает выполнять основной скрипт, начиная со следующей за include (require) строкой.
По умолчанию РНР ищет подключаемые файлы в текущем каталоге или специальном каталоге, определенном директивой include_path в файле рhp.ini.
При большой внешней схожести между двумя конструкциями есть некоторые различия. Главное из них связано с действиями при ошибке "файл не найден":
include — ошибка игнорируется, выполнение скрипта продолжает, а
require — выполнение скрипта прекращается (require по смыслу "обязательно").
Элементы fieldset и legend
Эти теги позволяют группировать html-элементы (чаще всего элементы форм), обводя их рамкой (fieldset), в контур которой встраивается текст (legend), указывающий пользователю назначение группы элементов формы.
Оба элемента позволяют задавать стили отображения, а legend допускает форматирование текста с помощью обычных тегов, например, <b> и <i>.
Пример.
В следующем примере показана техника применения элементов fieldset и legend. Для одной формы можно создать несколько таких блоков.
<fieldset style="border:solid red 2px;width:200px;"> <legend style="font-family:arial;font-size:14px;"> <b>Пример fieldset</b> </legend> <div style="padding:20px;font-family:verdana;"> Сюда обычно помещают группу элементов формы </div> </fieldset> |
Элемент button
Этот элемент может использоваться в формах или сам по себе. Его атрибут type допускает значения submit, reset и button (по умолчанию).
Когда кнопка нужна только для запуска некоторого скрипта, то можно обойтись без формы, используя элемент button с type="button". На эту кнопку можно поместить одновременный форматированный текст, картинки. Кроме того, можно также управлять стилями отображения, например, цветом фона кнопки.
Созданная таким образом кнопка при щелчке "утапливается", как должно быть при нажатии. Функциональность кнопки определяется заданием обработчика события onclick.
<button width="60" onclick="openMyPage()" style="background-color:wheat"> <img src="new.gif" border="0" hspace="10" vspace=5> <h3>Кнопка</h3> </button> |
Обработка информации из форм
Информация из формы может быть получена скриптом одним из методов: GET или POST. В зависимости от этого, значения из полей формы помещаются на сервере в суперглобальные ассоциативные массивы $_GET или $_POST.
Примечание.
Формируется еще один, сводный массив $_REQUEST, куда помещается информация, присланная двумя методами и, возможно, через куки.
1. Информация из текстовых полей.
Информация из текстового поля формы помещается в элемент массива $_GET или $_POST с индексом, совпадающим со значением атрибута name соответствующего тега <input>. Если текстовое поле отослано незаполненным, то значение элемента массива — пустая строка.
Можно создать несколько текстовых полей с одним именем, чтобы при пересылке из их значений был сформирован массив. Чтобы сделать это возможным, к имени поля нужно добавить пустые квадратные скобки:
<form action="action.php" method="POST">
<input type=text name="tfield[]" value="…" >
<input type=text name="tfield[]" value="…" >
. . .
<input type=text name="tfield[]" value="…" >
</form>
Для доступа к значениям полей в скрипте нужно использовать два индекса. Например, для чтения значения второго поля нужно использовать конструкцию:
$_POST["tfield"][1]
2. Переключатели (радиокнопки)
Значение атрибута value из отмеченной позиции переключателя передается через элемент соответствующего суперглобального массива с индексом, совпадающим с атрибутом name элементов переключателя (радиокнопок из группы).
Однако если ни одна кнопка не выбрана (нет элемента с заданным атрибутом checked и пользователь еще ничего не выбрал), то соответствующий элемент суперглобального массива не создается. Эту ситуацию можно определить, применяя функцию isset к соответствующему элементу массива данных из формы.
3. Флажки.
Если флажок установлен, то в суперглобальный массив передается значение соответствующего атрибута value.
Если флажок не установлен, то элемент суперглобального массива не создается.
Если несколько флажков имеют одно и тоже имя, то из их значений можно сформировать массив (аналогично случаю текстовых полей, нужно добавить пустые квадратные скобки).
4. Информация из списков.
Если из списка можно выбрать только одно значение, то это значение записывается в элемент с индексом, совпадающим атрибутом name элемента формы. Если значение из списка пользователем не выбрано, то соответствующий элемент суперглобального массива не создается.
Если используется список, в котором можно выбрать несколько значений (используя клавишу Ctrl), то, чтобы переслать их как массив, значение атрибута name нужно дополнить пустыми квадратными скобками:
<select name="selector[]" multiple>
<option>Выбор 1
<option>Выбор 2
<option>Выбор 3
</select>
ЗАДАНИЕ
Создать анкету — форму. В форму включены следующие элементы:
а) группа текстовых полей "Фамилия", "Имя", "Отчество" (передается на обработку массивом);
б) переключатель "Пол";
в) группа флажков "Программирую:" со значениями "Си", "Паскаль", "PHP" (передается на обработку массивом);
г) список с множественным выбором "Могу работать:" со значениями "Программистом", "Системным администратором", "Руководителем группы", "Постановщиком задач".
Скрипт, обрабатывающий форму, в ответе пользователю выводит полученную от него информацию и ждет оценки, все ли верно или нужно ли вносить исправления. При утвердительно ответе выводится страница с благодарностью за заполнение анкеты. При отрицательном ответе — анкета предлагается повторно, но уже со всеми ранее заполненными пользователем полями.
Реализовать всю программу в одном php-файле (с подгрузкой файла php-кода).
Анализ работы программы
Программа должна отображать четыре типа страниц, содержащих:
а) исходную форму с пустыми полями, в которую пользователь заносит информацию (рис. 1);
б) информацию, взятую из формы и представленную для проверки в текстовом виде (рис. 3);
в) восстановленную форму с введенной ранее информацией для внесения исправлений, если пользователь при проверке нашел неточности (рис. 2);
г) благодарность за заполнение формы (рис. 4).
Первый и третий типы страниц имеют кнопку "Отослать", которая используется для передачи занесенной в форму информации на проверку.
|
|
Второй тип страницы имеет две кнопки: "Верно" для подтверждения правильности введенной информации и "Исправить", когда нужно вернуть форму для исправлений.
|
Четвертая страница не содержит ничего, кроме текста благодарности.
|
Чтобы реализовать эти варианты в одном файле, этот документ должен включать четыре элемента div, отображение которых управляется свойством display — в любой момент времени виден только один тип содержания.
Схема переходов между различными представлениями страницы:
Функция Отослать требует перезагрузки страницы, так как необходимо извлечь информацию из формы и отобразить ее другим способом. Поэтому выполнение этой функции требует участия сервера (что означает использование РHP-кода).
Переходы, связанные с выполнением функций Исправить и Верно, можно выполнять без перезагрузки страницы, поэтому их экономнее реализовать на стороне клиента (Javascript).
ПОРЯДОК ВЫПОЛНЕНИЯ ЗАДАНИЯ
Выполнение задания разбито на два этапа. На первом пишется код, который управляет действием кнопок Отправить, Исправить и Верно, т.е. реализует основу функциональности программы (с простейшей частью формы и пока без отслеживания вводимых в нее данных).
На втором этапе форма дополняется необходимыми элементами и организуется необходимое управление информацией, которая введена в нее пользователем.