Зачастую на Web – сайтах можно встретить страницы с размещенными на них HTML - формами. Веб-формы – удобный способ получения информации от посетителей вашего сайта. Пример тому – , – которая обеспечивает обратную связь с посетителями и разработчиками сайта. Формы так же удобны и для разработчиков сайта при разработке CMS, которая позволяет поддерживать главное свойство сайта - актуальность. Данная статья посвящена основам создания HTML-форм, их обработке и способам передачи данных из экранных форм в PHP-сценарии.
1) Создание простой формы
Теги и задают начало и конец формы. Начинающий форму тег содержит два атрибута: action
и method
. Атрибут action содержит адрес URL сценария, который должен быть вызван для обработки сценария. Атрибут method
указывает браузеру, какой вид HTTP запроса необходимо использовать для отправки формы; возможны значения POST
и GET
.
Замечание
Главное отличие методов POST и GET заключается в способе передачи информации. В методе GET параметры передаются через адресную строку, т.е. по сути в HTTP-заголовке запроса, в то время как в методе POST параметры передаются через тело HTTP-запроса и никак не отражаются на виде адресной строки.
В данной html-форме присутствует элемент browse
, который открывает диалоговое окно для выбора файла для загрузки на сервер. При нажатии на кнопку "Передать файл"
, файл передается сценарию-обработчику.
Затем необходимо написать сценарий обработчик action.php
. Перед написание обработчика необходимо определиться в какой каталог мы будет копировать файл:
if(isset($_FILES
[
"myfile"
]))
// Если файл существует
{
$catalog
=
"../image/"
;
// Наш каталог
if (is_dir
($catalog
))
// Если такой каталог есть
{
$myfile
=
$_FILES
[
"myfile"
][
"tmp_name"
];
// Времменый файл
$myfile_name
=
$_FILES
[
"myfile"
][
"name"
];
// Имя файла
if(!
copy
($myfile
,
$catalog
)) echo
"Ошибка при копировании файла "
.
$myfile_name
// Если неудалось скопировать файл
}
else
mkdir
("../image/"
);
// Если такого каталога нет, то мы его создадим
}
?>
Замечание
Если вы доверяете пользователям закачивать на ваш сервер любые файлы, нужно быть предельно осторожным. Злоумышленники могут внедрить «нехороший» код в картинку или файл и отправить на сервер. В таких случаях нужно жестоко контролировать загрузку файлов.
Данный пример демонстрирует создание каталога и копирование файла в этот каталог на сервер.
Также хотел бы продемонстрировать пример с элементом checkbox
. Этот элемент немного отличается от других элементов тем, что если не один из элементов checkbox
’a не выбран, то суперглобальная переменная $_POST
вернет пустое значение:
if (!empty($_POST
[
"mycolor"
])) echo
$_POST
[
"mycolor"
];
// Если выбран хоть 1 элемент
else echo
"Выберите значение"
;
?>
Назначение форм
HTML-формы предназначены для пересылки данных от удаленного пользователя к Web-серверу. С их помощью можно организовать простейший диалог между пользователем и сервером, например, регистрацию пользователя на сервере или выбор нужного документа из представленного списка. Формы поддерживаются всеми популярными браузерами.
Синтаксис формы
В HTML-документе для задания формы используются тэги
, Документ может содержать несколько форм, но они не могут быть вложены одна в другую.
Тэг
Параметр action
является единственным обязательным. Его значением является URL-адрес CGI
-программы, которая будет обрабатывать информацию, извлеченную из данной формы.
Взаимодействие между браузером и web-сервером
Взаимодействие между клиентом-браузером и Web-сервером осуществляется по правилам, заданным протоколом HTTP, и состоит из запросов клиента и ответов сервера. Запрос разбивается на три части. В первой строке запроса содержится HTTP-команда, называемая методом, URL-адрес запрашиваемого файла и номер версии протокола HTTP. Вторая часть - заголовок запроса. Третья часть - тело запроса, собственно данные, посылаемые серверу.
MIME-типы
Одним из первых применений Интернета была электронная почта, ориентированная на пересылку текстовых сообщений. Часто возникает необходимость вместе с текстом переслать данные в нетекстовом формате, например, упакованный zip-файл, рисунок в формате GIF
, JPEG
и т. д. Для того, чтобы переслать средствами электронной почты такие файлы без искажения, они кодируются в соответствии с некоторым стандартом. Стандарт MIME
( Multipurpose
Internet Mail
Extensions, многоцелевые расширения электронной почты для Интернета) определяет набор MIME
-типов, соответствующих различным типам данных, и правила их пересылки по электронной почте. Для обозначения MIME
-типа используется запись вида тип/ подтип
, где тип определяет общий тип данных, например, text
, image
, application
(тип application
обозначает специфический внутренний формат данных, используемый некоторой программой), а подтип
- конкретный формат внутри типа данных, например, application/zip
, image/gif
, text/html
.
MIME
-типы нашли применение в Web, где они называются также медиа
-типами, для идентификации формата документов, передаваемых по протоколу HTTP. В HTML-форме
параметр enctype
определяет медиа
-тип, который используется для кодирования и пересылки специального типа данных
- содержимого формы.
Значением параметра enctype
является медиа
-тип, определяющий формат кодирования данных при передаче их от браузера к серверу. Браузер кодирует данные, чтобы исключить их искажение в процессе передачи. Возможны два значения этого параметра: (по умолчанию) и multipart/form-data
.
Второй метод нужен только в том случае, если к содержимому формы присоединяется локальный файл, выбранный при помощи элемента формы
. В остальных случаях следует использовать метод кодирования по умолчанию.
URL-кодирование
Схема кодирования application/x-www-form-urlencoded
одинакова для обоих методов пересылки (GET
и POST
) и заключается в следующем. Для каждого элемента формы, имеющего имя, заданное параметром name
, формируется пара "name=value"
, где value
- значение элемента, введенное пользователем или назначенное по умолчанию. Если значение отсутствует, соответствующая пара имеет вид "name="
. Для радиокнопок и переключателей используются значения только выбранных элементов. Если элемент выбран, а значение параметра value
не определено, по умолчанию используется значение "on"
.
Все пары объединяются в строку, в качестве разделителя служит символ "&"
. Так как имена и значения представляют собой обычный текст, то они могут содержать символы, недопустимые в составе URL (метод GET
пересылает данные как часть URL). Такие символы заменяются последовательностью, состоящей из символа %
и их шестнадцатеричного ASCII- кода. Символ
пробела может заменяться не только кодом %20
, но и знаком +
(плюс). Признак конца строки, встречающийся в поле textarea
, заменяется кодом %0D%0A
. Такое кодирование называется URL-кодированием
.
Методы передачи данных
Закодированная информация пересылается серверу одним из методов GET
или POST
. Основное отличие заключается в том, как метод передает информацию CGI
-программе.
При использовании метода GET
данные формы пересылаются в составе URL-запроса, к которому присоединяются после символа "?"
в виде совокупности пар
переменная = значение,
разделенных символом "&"
. В этом случае первая строка запроса может иметь следующий вид:
GET /cgi-bin/cgi-program.pl?name=Ivan&surname=Ivanov HTTP/1.1
Часть URL после символа "?"
называется строкой запроса
. Web-сервер, получив запрос, присвоит переменной среды
QUERY_STRING
значение строки запроса
и вызовет CGI
-программу, обозначенную в первой части URL до символа "?"
.
При использовании метода POST
данные формы пересылаются серверу в теле запроса, после чего передаются сервером в CGI
-программу через стандартный ввод
.
Методы GET
и POST
имеют свои достоинства и недостатки. Метод GET
обеспечивает лучшую производительность при пересылке форм, состоящих из небольшого набора коротких полей. При пересылке большого объема данных следует использовать метод POST
, так как браузер или сервер могут накладывать ограничения на размер данных, передаваемых в составе URL, и отбрасывать часть данных, выходящую за границу. Метод POST
, к тому же, является более надежным при пересылке конфиденциальной информации
.
Поля ввода формы
Форма отображается в окне браузера в виде набора стандартных элементов управления, используемых для заполнения полей формы значениями, которые затем передаются Web-серверу. Значение вводится в поле ввода пользователем или назначается по умолчанию. Для создания полей средствами языка HTML существуют специальные тэги:
,
Тэг
Это наиболее употребительный тэг, с помощью которого можно генерировать внутри формы поля для ввода строки текста, пароля, имени файла, различные кнопки. Он имеет два обязательных параметра: type
и name
. Параметр type
определяет тип поля: селекторная кнопка, кнопка передачи и др. Параметр name
определяет имя, присваиваемое полю. Оно не отображается браузером, а используется в качестве идентификатора значения, передаваемого Web-серверу. Остальные параметры меняются в зависимости от типа поля. Ниже приведено описание типов полей, создаваемых при помощи тэга
, и порождаемых ими элементов ввода.
type="text"
Создает элемент для ввода строки текста.
Дополнительные параметры:
maxlength="n"
- задает максимальное количество символов, разрешенных в текстовом поле. По умолчанию - не ограничено.
size="n"
- максимальное количество отображаемых символов.
value = "начальное_значение"
. Первоначальное значение текстового поля.
type="password"
Создает элемент ввода строки текста, отличающийся от предыдущего только тем, что все вводимые символы представляются в виде символа *
. Поле password
не обеспечивает безопасности введенного текста, так как на сервер он передается в незашифрованном виде.
type="files"
Создает поле для ввода имени локального файла, сопровождаемое кнопкой Browse
. Выбранный файл присоединяется к содержимому формы при пересылке на сервер. Имя файла можно ввести непосредственно или выбрать его из диалогового окна. Для корректной передачи присоединенного файла следует установить значения параметров формы равными enctype="multipart/form-data"
и method="post"
. В противном случае будет передана введенная строка, то есть маршрутное имя
файла, а не его содержимое. Дополнительные параметры maxlength
и size
имеют тот же смысл, что и для элементов типа text
и password
.
type="checkbox"
Создает поле для установки флажка. Элементы checkbox
можно объединить в группу, установив одинаковое значение параметра name
.
Дополнительные параметры:
value="строка"
. Значение, которое будет передано серверу, если данная кнопка выбрана. Если кнопка не выбрана, значение не передается. Обязательный параметр. Если флажки образуют группу, то передаваемым значением является строка разделенных запятыми значений параметра value
всех установленных флажков.
checked
. Если указан параметр checked
, элемент является выбранным по умолчанию.
type="radio"
Создает элемент-переключатель, существующий только в составе группы подобных элементов, из которых может быть выбран только один. Все элементы группы должны иметь одинаковое значение параметра name
.
Отображается в виде круглой кнопки. Дополнительные параметры:
value="строка"
. Обязательный параметр, значение которого передается серверу при выборе данной кнопки. Должен иметь уникальное значение для каждого члена группы
.
checked
. Устанавливает элемент выбранным по умолчанию. Один и только один элемент в группе должен иметь этот параметр.
type="submit"
Создает кнопку передачи, нажатие которой вызывает пересылку на сервер всего содержимого формы. По умолчанию отображается в виде прямоугольной кнопки с надписью Submit
.
Дополнительный параметр позволяет изменить надпись на кнопке. Параметр name
для данного элемента может быть опущен. В этом случае значение кнопки не включается в список параметров формы и не передается на сервер.
Если параметры name
и value
присутствуют, например,
,
то в список параметров формы, передаваемых на сервер, включается параметр submit_button="ok"
. Внутри формы могут существовать несколько кнопок передачи.
type="reset"
Создает кнопку сброса, нажатие которой отменяет все сделанные изменения, восстанавливая значения полей формы на тот момент, когда она была загружена. По умолчанию отображается в виде прямоугольной кнопки с надписью Reset
. Надпись можно изменить при помощи дополнительного параметра
value="название_кнопки"
Значение кнопки Reset
никогда не пересылается на сервер, поэтому у нее отсутствует параметр name
.
type="image"
Создает элемент в виде графического изображения, действующий аналогично кнопке Submit
. Дополнительные параметры:
src="url_изображения"
. Задает URL-адрес файла с графическим изображением элемента.
align="тип_выравнивания"
. Задает тип выравнивания изображения относительно текущей строки текста.
Если на изображении элемента щелкнуть мышью, то координаты указателя мыши в виде name.x=n&name.y=m
включаются браузером в список параметров формы, посылаемых на сервер.
HTML. Формы и их атрибуты
Элементы форм знакомы всем пользователям современной глобальной сети. Это поля ввода текста и пароля, стандартные кнопки, радиокнопки-переключатели, «флажки», выпадающие списки и т.д. Наиболее очевидные варианты применения: ввод ключевых слов в поисковых системах, работа с электронной почтой через веб-интерфейс, регистрация на сайте, веб-анкеты, online-тесты. Сразу заметим, что использование форм предполагает интерактивность и, следовательно, обеспечение функциональности неизбежно связано с программированием (клиентским или серверным). Пожалуй, в большинстве случаев формы используются для передачи данных на сервер, однако и на стороне клиента есть задачи, в которых удобно применение форм (например, календарь или калькулятор).
Роль HTML состоит в описании необходимых элементов и компоновке их на странице. Все атрибуты форм и их элементов, описанных с помощью HTML, транслируются в соответствующие свойства объектов DOM и используются при создании сценариев JavaScript.
Описания управляющих элементов форм, призванных обеспечивать необходимую функциональность, должны быть расположены в контейнере form, атрибуты которого существенны на этапе разработки сценариев. Основные атрибуты элемента form
:
атрибут
описание
возможные значения
name
имя
action
адрес файла серверного сценария, который будет обрабатывать заполненную и переданную форму
method
метод передачи данных серверу
get
post
enctype
тип содержимого, используемый для отправки формы на сервер
multipart/form-data
accept-charset
список кодировок символов ввода данных, которые будут обрабатываться сервером
target
onSubmit
сценарий JavaScript, выполняемый перед отправкой данных формы на сервер
onReset
сценарий JavaScript, выполняемый при сбросе значений элементов формы в значения по умолчанию
Внимательно прочитав описания атрибутов, заметим, что большинство из них актуальны при обработке данных формы серверным сценарием. Три атрибута имеют значения по умолчанию (что, вообще говоря, нехарактерно для HTML).
Все вышеперечисленные атрибуты формально необязательны, однако
при работе на стороне клиента необходимо задавать имя формы name
, чтобы иметь возможность обращаться к элементам формы из сценария JavaScript;
отправка данных формы на сервер требует, как минимум, указания атрибута action
, определяющего серверный сценарий обработки.
Смысл, по крайней мере, двух атрибутов необходимо пояснить более подробно.
Атрибут method
Атрибут method имеет два основных возможных значения: get (по умолчанию) и post.
Смысл этих значений следующий. При передаче данных методом get данные формы отправляются на сервер в заголовке запроса, а при использовании метода post – в теле запроса. Передача текстовых данных может осуществляться любым из этих методов. А вот бинарные данные могут быть отправлены только методом post. Это происходит в случае загрузки файла не сервер (всем понятный пример – приложение к электронному письму). Кстати, в этом случае необходимо указать enctype=”multipart/form-data” (см. далее примечения к атрибуту enctype).
Итак, за исключением случая передачи бинарных данных, равным образом можно применять оба возможных метода. На сложность разработки серверного сценария, принимающего данные из формы, это никоим образом не влияет. Какой же метод предпочтителен? Имеет смысл внимательно рассмотреть имеющиеся в сети ресурсы и убедиться, что в подавляющем большинстве случаев применяется метод get
(например, в поисковых системах). Можно ли считать это негласным эмпирическим правилом? Для ответа на этот вопрос следует сравнить методы get
и post
по крайней мере в трех аспектах: объем передаваемых данных, безопасность и удобство пользователя.
Необходимо учитывать, что максимальный объем данных, передаваемых методом get
, ограничен, в зависимости от настроек протокола, и в любом случае не может превышать 8192 Кб.
Передача конфиденциальной информации методом get, несомненно, представляет определенную угрозу безопасности, так как get-строка остается в журналах всех промежуточных серверов и прокси-сервера.
С другой стороны, можно задуматься, какой вариант удобнее пользователю информационного ресурса.
При передаче методом get пользователь имеет удовольствие видеть данные формы в адресной строке. Символы, отличные от стандартной латиницы кодируются. Например, пробелу соответствует код %20 . Каждый из нас постоянно наблюдает такую ситуацию, работая с поисковыми системами. Зададим, например в Яndex ключевое словосочетание «язык HTML
» и увидим в адресной строке:
Слово «язык
» закодировано последовательностью %FF%E7%FB%EA, а «HTML» передается как есть. Получив такой запрос, соответствующая серверная программа обратится к базе данных и, в конечном счете, сгенерирует и отправит браузеру список результатов поиска. Приятно ли смотреть на такую адресную строку? Нет. Зато пользователь может сохранить уникальную закладку на сгенерированную страницу.
При передаче методом post данные формы также отправляются на сервер. При этом пользователь не видит в адресной строке ничего «лишнего». Зато появляются другие проблемы: попытка обновить страницу вызывает маловразумительное для большинства пользователей сообщение: «… обновление страницы невозможно без повторной отправки данных…». И закладку не сохранить.
Резюме. По-видимому, в большинстве типичных задач следует выбирать заданный по умолчанию метод get
во всех случаях, кроме
передачи на сервер:
бинарных данных,
конфиденциальной информации,
данных большого объема.
Атрибут enctype
Этот атрибут имеет два возможных значения:
application/x-www-form-urlencoded
(по умолчанию)
multipart/form-data
Первое значение используется в абсолютном большинстве случаев. Нет смысла указывать его явно – оно и так предполагается по умолчанию. Второй же тип кодировки (multipart/form-data
) указывается в единственном случае: при загрузке на сервер бинарного файла. При этом обязательно задание атрибута method=”post”
.
HTML-формы
являются элементами управления, которые применяются для сбора информации от посетителей веб-сайта.
Веб-формы состоят из набора текстовых полей, кнопок, списков и других элементов управления, которые активизируются щелчком мыши. Технически формы передают данные от пользователя удаленному серверу.
Для получения и обработки данных форм используются языки веб-программирования, такие как PHP
, Perl
.
До появления HTML5 веб-формы представляли собой набор нескольких элементов , , завершающихся кнопкой . Для стилизации форм в разных браузерах приходилось прилагать немало усилий. Кроме того, формы требовали применения JavaScript для проверки введенных данных, а также были лишены специфических типов полей ввода для указания повседневной информации типа дат, адресов электронной почты и URL-адресов.
HTML5-формы
решили большинство этих распространенных проблем благодаря наличию новых атрибутов, предоставив возможность изменять внешний вид элементов форм за счет CSS3
.
Рис. 1. Улучшенные веб-формы с помощью HTML5
Создание HTML5-формы
1. Элемент
. Он не предусматривает ввод данных, так как является контейнером, удерживая вместе все элементы управления формы – поля
. Атрибуты этого элемента содержат информацию, общую для всех полей формы, поэтому в одну форму нужно включать поля, объединенные логически.
Таблица 1. Атрибуты тега
2. Группировка элементов формы
Элемент
предназначен для группировки элементов, связанных друг с другом, разделяя таким образом форму на логические фрагменты.
Каждой группе элементов можно присвоить название с помощью элемента