Применение методов GET
и POST
в PHP трудно переоценить, поскольку эти методы встречаются практически на каждом сайте. Прежде чем изучать ниже описанный материал, советую ознакомится с html тегом
, как показано в примере 1.
Пример 1. Отправка данных формы
HTML5
IE
Cr
Op
Sa
Fx
Данные формы
В этом примере данные формы, обозначенные атрибутом name
(login
и password
), будут переданы в файл по адресу /example/handler.php. Если атрибут action
не указывать, то передача происходит на адрес текущей страницы.
Передача на сервер происходит двумя разными методами: GET и POST, для задания метода в теге
используется атрибут method
, а его значениями выступают ключевые слова get
и post
. Если атрибут method
не задан, то по умолчанию данные отправляются на сервер методом GET. В табл. 1 показаны различия между этими методами.
Какой метод используется легко определить по адресной строке браузера. Если в ней появился вопросительный знак и адрес стал похож на этот, то это точно GET.
Уникальное сочетание параметров в адресной строке однозначно идентифицирует страницу, так что страницы с адресами?q=node/add и?q=node считаются разными. Эту особенность используют системы управления контентом (CMS, Content management system) для создания множества страниц сайта. В реальности же используется один файл, который получает запрос GET и согласно ему формирует содержимое документа.
Ниже перечислены типовые области применения этих методов на сайтах.
GET
Передача небольших текстовых данных на сервер; поиск по сайту.
Поисковые системы, формы поиска по сайту всегда отправляются методом GET, это позволяет делиться результатами поиска с друзьями, слать ссылку по почте или выкладывать её на форуме.
POST
Пересылка файлов (фотографий, архивов, программ и др.); отправка комментариев; добавление и редактирование сообщений на форуме, блоге.
Работа с формой по умолчанию происходит в текущей вкладке браузера, при этом допустимо при отправке формы изменить этот параметр и открывать обработчик формы в новой вкладке или во фрейме. Такое поведение задаётся через «имя контекста», которое выступает значением атрибута target
тега
. Популярные значения это _blank
для открытия формы в новом окне или вкладке, и имя фрейма, которое задаётся атрибутом name тега
, собственно и задает форму. Его атрибуты - оба необязательные:
action
- указывает URL (полный или относительный), на который будет отправлена
форма. Отправка формы - это такой же запрос к серверу, как и все остальные (как я уже описал выше).
Если этот атрибут не указать, большинство браузеров (точнее говоря, все известные мне браузеры) отправляют форму на текущий документ, то есть "саму на себя". Это удобное сокращение, но по стандарту HTML атрибут action обязателен.
method
- способ
отправки формы. Их два.
GET
- отправка данных формы в адресной строке. Вы могли заметить на различных сайтах присутствие в конце URL символа "?" и следующих за ним данных в формате параметр=значение
. Здесь "параметр" соответствует значению
атрибута name
элементов формы (см. ниже про тэг ), а "значение" - содержимому атрибута value
(в нем, например, содержится ввод пользователя в текстовое поле того же тэга ). Для примера - попробуйте поискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера. Это и есть способ GET.
POST
- данные формы отправляются в теле запроса
. Если не совсем понятно (или совсем непонятно), что это такое - не беспокойтесь, скоро мы к этому вопросу вернемся.
Если атрибут method
не указан - подразумевается "GET".
Тэг - задает элемент формы
, определяемый атрибутом type
:
Значение "text"
задает однострочное текстовое поле ввода
Значение "submit"
задает кнопку, при нажатии которой происходит отправка
формы на сервер
Возможны и другие значения (да и - не единственный тэг, задающий элемент формы), но их мы рассмотрим в следующих главах.
Итак, что же происходит, когда мы нажимаем кнопку "OK"?
Браузер просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы
. Допустим, введено имя Vasya
. В этом случае данные формы - name=Vasya&okbutton=OK
Браузер устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в атрибуте action
тэга
, используя метод отправки данных, указанный в атрибуте method
(в данном случае - GET), передавая в запросе данные формы.
Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение
Браузер отображает полученный от сервера документ
Отправка того же запроса вручную (с помошью telnet) выглядит следующим образом (предположим, что доменное имя сайта - www.example.com):
telnet www.example.com 80
GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0
\r\n Host: www.example.com
\r\n \r\n
Как вы, скорее всего, уже догадались, нажатие submit-кнопки в форме с методом отправки "GET" аналогично вводу соответствующего URL (со знаком вопроса и данными формы в конце) в адресной строке браузера: http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK
На самом деле, метод GET используется всегда, когда вы запрашиваете с сервера какой-либо документ, просто введя его URL, или щелкнув по ссылке. При использовании
, к URL просто добавляются знак вопроса и данные формы.
Теперь заменим первую строку нашей формы на следующую:
Мы указали метод отправки "POST". В этом случае данные отправляются на сервер несколько другим способом:
При использовании метода POST данные формы отправляются уже после "двух Enter-ов" - в теле
запроса. Все, что выше - на самом деле заголовок
запроса (и когда мы использовали метод GET, данные формы отправлялись в заголовке). Для того, чтобы сервер знал, на каком байте закончить чтение тела запроса, в заголовке присутствует строка Content-Length
; о том же, что данные формы будут переданы виде параметр1=значение1&параметр2=значение2...
, причем значения передаются в виде urlencode - то есть, точно так же, как и с помощью метода GET, но в теле запроса, - серверу сообщает заголовок "Content-Type: application/x-www-form-urlencoded".
Преимущество метода POST - отсутствие ограничения на длину строки с данными формы.
При использовании метода POST невозможно отправить форму, просто "зайдя по ссылке", как было с GET.
При использовании POST-формы, в ее атрибуте action
можно указать после знака вопроса и параметры GET-формы. Таким образом, метод POST включает в себя и метод GET.