Метод get и post php
Работа с формами | Метод GET и POST в PHP
При разработке любого проекта, одной из самых основных вещей является общение с пользователем. Мы можем что-то у него спрашивать, и давать ему право на ответ (опрос), можем дать ему право написать свое мнение, о товаре или услуге, можем помогать ему посчитать стоимость наших услуг, если необходимо создать интернет магазин, и т.д.
Во всех случаях у пользователя должно быть право что-то написать и на что-то нажать. Для этого и существуют формы.
Работа с формами в PHP и HTML
Формы обозначаются тегом form:
Атрибут method указывает каким методом будет производиться отправка формы. Существуют 2 метода – GET и POST. Подробнее от этом читайте чуть ниже, пока в краце расскажем об основных элементах формы:
Текстовое поле, в которое можно вводить информацию. Атрибут name – имя текстового поля, value – значение. Выглядят вот так:
Кнопка, используется для отправки форм. Выглядит вот так:
Текстовой блок, обычно используется для написания сообщений большого размера. Атрибут rows, cols – длина и ширина.
Подробнее о формах читайте на нашем сайте, или в других источниках. Цель данного урока показать как обрабатывать формы средствами PHP.
Метод GET и POST при отправке форм
Методы GET и POST указываются в атрибуте method формы при ее инициализации:
Метод GET передает информацию в адресе страницы, метод POST – в заголовках. Чтобы лучше понять что такое метод GET и POST напишем скрипт, который будет отправлять наше имя и сообщение на сервер, а сервер выводить сообщение на экран.
В PHP данные полученные методом GET хранятся в переменной $_GET. Данные переданные методом POSTхранятся в переменной $_POST.
Напишем в начале код для работы с методом GET, потом методом POST.
Обработка форм в PHP
Что такое форма
и пр., которые заполняются пользователем, отправляются на сервер и обрабатываются с помощью PHP.
Простой пример формы:
В этой форме есть 2 поля для заполнения (input и textarea), а также кнопка отправки формы.
Итак, давайте разбираться, что тут вообще происходит.
Обработка формы с GET-параметрами
Формы можно передавать с помощью методов GET и POST. Указывается метод с помощью атрибута method тега form :
Если метод не указан, то по-умолчанию форма отправляется методом GET.
Формы, отправляемые методом GET, передают данные через URL-адрес.
В отличие от обычных переменных, этот массив виден в любой области видимости, в т.ч. внутри функций. Внутри этого массива хранятся GET-параметры текущего запроса в виде ассоциативного массива.
Получить доступ к этим параметрам можно так:
Поэтому важно указывать атрибут name каждому элементу формы, иначе этот элемент не отправится на сервер.
Итак, создадим простенькую форму и добавим ей PHP-обработчик:
Теперь при отправке заполненной формы PHP выведет на экран то, что мы в эту форму написали.
Метод POST
По этой причине для отправки форм, которые могут содержать конфиденциальную информацию, нужно всегда использовать метод POST. При использовании метода POST данные передаются в теле http-запроса, а не в URL.
Метод GET в формах чаще всего используется для поиска чего-либо (товаров, статей и т.д.).
Некоторые разработчики считают, что данные, передаваемые методом POST, имеют какую-то особую защиту, которая не позволяет злоумышленнику украсть или подменить их.
Это не так. Никакой дополнительной защиты у метода POST нет. Для защиты http-запросов нужно использовать https.
Изменение обработчика формы
При желании вы можете отправлять форму не на текущий URL, а на какой-нибудь другой. Для этого достаточно указать путь к скрипту в атрибуте action :
Методы GET и POST. Использование и отличия
HTTP методы GET и POST используются для отправки данных на сервер.
Чаще всего методы используются в HTML формах, гиперссылках и AJAX запросах.
POST и GET запросы можно отправить на сервер с помощью любого программного обеспечения, работающего с протоколом HTTP.
Обработка запросов может отличаться в зависимости от типа сервера.
Какой метод использовать GET или POST, чем отличаются методы
Основное отличие метода GET от POST в способе передачи данных.
Запрос GET передает данные в URL в виде пар «имя-значение» (другими словами, через ссылку), а запрос POST передает данные в теле запроса (подробно показано в примерах ниже). Это различие определяет свойства методов и ситуации, подходящие для использования того или иного HTTP метода.
Например, можно использовать метод GET в HTML форме фильтра товаров: когда нужно, исходя из данных введенных пользователем, переправить его на страницу с отфильтрованными товарами, соответствующими его выбору.
HTTP метод POST поддерживает тип кодирования данных multipart/form-data, что позволяет передавать файлы.
Также следует заметить, что методы можно комбинировать. То есть, при необходимости вы можете отправить POST запрос на URL, имеющий GET параметры.
В каких случаях использовать POST и когда нужно использовать GET
В таблице ниже показаны распространенные варианты использования HTTP запросов с объяснением в чем разница между GET и POST запросами в конкретной ситуации.
Ситуация | GET | POST |
---|---|---|
Фильтр товаров | ||
AJAX запросы | Используются оба метода. Выбор зависит от контекста. Принципы выбора метода такие же, как и для HTML форм. |
Сравнительная таблица HTTP методов GET и POST
В таблице ниже приведены основные свойства и отличия GET и POST методов.
Свойство | GET | POST |
---|---|---|
Способ передачи данных | Через URL | В теле HTTP запроса |
Защита данных | ||
Кэширование | Страница с параметрами может быть кэширована | Страница с параметрами не может быть кэширована |
Индексирование поисковыми системами | Страница с параметрами может быть индексирована | Страница с параметрами не может быть индексирована |
Возможность отправки файлов | Не поддерживается | Поддерживается |
Поддерживаемые типы кодирования | application/x-www-form-urlencoded | |
Использование в гиперссылках | Да | Нет |
Использование в HTML формах | Да | Да |
Использование в AJAX запросах | Да | Да |
Пример использования GET запроса
В примере показана простая HTML форма фильтра по нескольким параметрам.
HTML код формы, генерирующей GET запрос:
После отправки формы браузер переведет пользователя по ссылке:
Ссылка содержит URL документа, отвечающего за обработку и блок параметров. Знак «?» отмечает начало блока параметров GET запроса. Далее находятся пары «имя-значение», разделенные знаком «&». Имена параметров отделены от значений знаком «=».
Переход по ссылке, приведенной выше, будет равнозначен отправке формы с указанными параметрами.
Пример использования POST запроса
В примере показана простая HTML форма авторизации.
HTML код формы, генерирующей POST запрос:
После отправки формы браузер переведет пользователя по ссылке:
Для того, чтобы увидеть переданные параметры, воспользуемся инструментами разработчика.
Запрос состоит из области заголовков и тела запроса.
В заголовках указана служебная информация: URL обработчика, тип кодирования, параметры браузера и т.д.
В теле запроса содержатся передаваемые параметры. Формат тела запроса может отличаться в зависимости от выбранного типа кодирования.
Урок 16. PHP — POST & GET
В этом уроке мы рассмотри приемы передачи данных между формами и страницами. Такими методами являются POST и GET. О каждом мы поговорим отдельно и более подробно. Вообще говоря, это нужно для связи между формами. Например мы заполняем какие то поля на странице и нам нужно их передать в другую страницу для обработки.
Метод GET в PHP
Для начала разберем метод GET. Это когда все переменные и их значения передаются прямо через адрес. Сейчас на примере вы все увидите, и даже поймете как работает большинство сайтов и форумов.
К примеру, есть у нас html страничка такого вида:
Видите ссылку? Она сложная и состоит из нескольких частей. Давайте разберем все по полочкам:
https://myblaze.ru — адрес домена или, как его еще называют, хост.
index.php — страница на php, которая будет обрабатывать запрос.
? — символ разделения между адресом и блоком с переменными.
Далее идут переменные и их значения, которые разделены символом &.
name=Sergey — переменная name и ее значение Sergey.
age=22 — то же самое, переменная age, значение 22.
Все разобрали, теперь посмотрим как это обрабатывается в php, с помощью метода GET.
Страница index.php, как вы помните, мы передавали ей:
Для начала совет: ВСЕГДА проверяйте переменные на правильность: на пустоту, на соответствие допустимых значений и так далее. Так как все передается через адресную строку, то данные можно легко подменить и навредить сайту. Теперь по самому коду: мы, с помощью условного оператора, проверили переменные name и age на пустоту и, если они не пустые, то вывели их, а если пустые, то просто сообщили об этом.
Все просто, согласитесь? Например вы можете создать html страницу и в менюшке сделать ссылки через переменные, а в index.php обрабатывать переменную и отображать в зависимости от полученного значения ту или иную страницу. Ну об этом мы поговорим позже, в статье про создание сайта на php с нуля. Чтобы ничего не пропустить, советую подписаться на RSS.
Метод POST в PHP
Для демонстрации работы этого метода нам понадобится немного больше, чем простая строчка с адресом 🙂 Нужно будет создать html страницу с формой для заполнения, но ничего, я приведу готовый пример для вас:
Итак, мы создали html страничку с простой формой. Запомните, метод POST может использоваться только в форме.
Первый параметр формы — «method», он определяет метод, который мы будем использовать для передачи. Как вы могли догадаться, это либо GET, либо POST. При этом, если установлен GET, то все имена полей (в виде названий переменных), а также их значения, передаются по ссылке, как в разделе про метод GET. Если же установлен POST, то все названия переменных и значения будут передаваться как запрос браузера к веб-серверу. То есть в адресной строке их видно не будет. Во многих случаях это очень полезно. Также POST безопаснее, оно и понятно, ведь переменные с их значениями уже не так просто отредактировать, хотя тоже можно.
Второй параметр формы — «action». Это путь и имя файла скрипта, которому мы передаем данные. В нашем случае это index.php. Этот путь можно передавать и полностью, то есть так: action=«https://my_site.ru/index.php». Если не указать значение параметра «action», то вся информация будет передаваться главному скрипту, то есть индексной странице index.php вашего сайта, что вполне логично.
Теперь получим данные из нашей формы. Раз передавали мы в index.php, значит ниже будет код именно этой страницы:
Ну вот, урок получился большой, но зато один из самых полезных, ведь передача переменных между формами и страницами это именно та интерактивность, ради которой мы и используем PHP.
Комментарии:
Хотелось бы более детальный разбор блока с GET’ом. В частноти:
И последнее, в статьях нет информации о «или», обозначающемся как || (или or) и соответственно «и», из примера статьи выше &&.
Александр, хорошо, спасибо, я поработаю над этим вопросом в ближайшее время 🙂
Миша, да не особо то поработал, работа в оффлайне отнимает почти все время, а после нее приходишь домой и уже от компьютера воротит =\ Ну как нибудь на выходных или еще как постараюсь все таки написать.
Александр, наконец дошли руки до вопроса.
Итак, в данном случае нам нужна именно empty() потому, что именно она определяет существование переменной. Для нас важно, чтобы в запросе были переданы оба значения, то есть и name и age, поэтому такое условие. Восклицательный знак перед empty это отрицание, то есть условие составлено таким образом, чтобы убедиться, что существуют (были переданы в запросе) обе переменные.
Хотя, наверное, все это вам объяснять не нужно, вы и сами знаете, это видно. Но для новичков думаю пригодится 🙂
«Запомните — метод POST может использоваться только в форме» — было бы здорово уточнить «только в форме или через AJAX», ибо через AJAX можно отправить что угодно и как угодно. Или я не прав?
Да, верно, в аяксе тоже используется ПОСТ, просто это выходит за рамки данного учебника (все таки он для начинающих) 🙂
Вот я как раз и есть начинающий и поэтому искренне запуталась)) Я только начала понимать, что такое аякс, а здесь прочитала, что «ТОЛЬКО В ФОРМЕ», — и расстроилась: опять что-то в голове не сходится. Мне нужно было прочитать еще две статьи, чтобы убедиться в том, что все-таки не только в форме)) Путаете новичков! 🙂
А тут теги отрезаются! Вот незадача то…
только через form ))
Причем, основной код будет (относительно) короткий, а больше всего места и внимания будут занимать именно-таки описания классов, да? А в основном коде все будет делаться методами местных экземпляров этих классов. Так принято писать или как-то иначе?
Рита, ничего себе полотно )
Я вас понимаю. На самом деле я сейчас тоже вовсю изучаю веб-разработку. Тяжело даётся, при том что нужно использовать целый зоопарк технологий, да ещё и к тому же не совсем ясно какие конкретные задачи можно выполнять с его помощью. Например, для меня это самый трудный этап. Ещё одну очередную CMS писать не охота, ибо тысячи их. Блог или форум — то же самое. Вот взялся за интернет магазин на бесплатной основе. Пилю потихонечку. Пришлось попутно изучать HTML и CSS, так как у любой логики должно быть визуальное отражение, а я не шибко чтобы крут в вёрстке.
Вроде на всё ответил 🙂
P.S. никогда не видел девушек, столь рьяно изучающих программирование. Я почему-то думал, что я один (из немногих) такой е*анутый. У меня разрыв шаблона 🙂
> Причем, основной код будет (относительно) короткий, а больше всего места и внимания будут занимать именно-таки описания классов, да? А в основном коде все будет делаться методами местных экземпляров этих классов. Так принято писать или как-то иначе?
Всё верно. Обычно файл который запрашивает клиент, это месиво из ссылок на модули, которые могут использоваться при генерации html-странице, которую запросил клиент, причём с теми или иными условиями.. Вероятно, клиент даже не запрашивал html-страницу, а он запросил URL. А веб-сервер этот УРЛ переварил и что-то клиенту выплюнул, предварительно конечно посоветовавшись с PHP интерпретатором 🙂
Нет, echo не умеет работать с объектами. Вернее, объект должен что-то вернуть, для этого из него надо что-то вызвать. Так что это строковые переменные. Язык пользователя лучше хранить в куках. На чужом хосте обычно не дают настраивать php.ini, так как он делится между несколькими такими пользователями. VDS/VPS другое дело. Тут лучше вам смотреть википедию.
Как вы всё это будете писать — без понятия 🙂
Но чтобы писать что-то на продакшен, нужно много времени тренироваться на кошках. Рекомендую всё же отдать это на аутсорс.
Вот это дискуссия тут, умеете, могете, молодцы! 🙂
Я правда рад, что люди объединяются и помогают друг другу!
Александр, неправда))) Объект может преобразовываться в строку при обращении к нему по имени из echo))) Если у него прописан «магический» метод __toString ))))))) Собсно в этом методе описывается, как объект превращается в строку, если кто-то пытается его использовать как строку (например, вывести на экран). Возможность добавлена в php 5.3, расширена в php 5.4.
Рита, тоже верно, однако это не стандартное поведение. В боевых условиях, объект ничего похожего на строку при попытке сделать его echo возвращать не должен :). Единственное применение, которое я нахожу это либо вывод ошибки, так чтоб никто не догадался, либо вывод информации об этом объекте. Встроенный var_dump, к примеру.
А для вывода текста или любой другой инфы нужно вызывать конкретные методы, или максимум публичные поля. А так для этого существуют геттеры/сеттеры.
Но я никогда не использовал данную «магию» ибо не было нужды. Да и вообще php сильно избыточен, так что во многих мануалах пишут «не используйте __GET()», «не используйте __SET()». И чаще всего пишут «НИКОГДА НЕ ИСПОЛЬЗУЙТЕ!».
Александр, и Вы правы))) Этот метод __toString скорее нужен для отладки, чем для работы. Аналогично яваскрипту)) Там тоже есть волшебный метод toString)) Но есть в php «волшебные» методы, которые очень даже нужно использовать в программах: например, тот же __construct() или ___sleep и __wakeUp() и другие. Они прекрасны. Или метод, который вызывается при клонировании объекта. Полезная штука.. На тему «избыточен» не знаю, не знаю. Я бы сказала изобилен)))) Есть опытные себе вполне разработчики, которые не знают, как пользоваться namespace, а я вот только начинаю, и уже понимаю, что это ключевое слово будет у меня звучать и звучать))) Ну т.е.реально есть выбор. Можно писать go to, а можно писать do while и break; В том же яваскрипте нет такого изобилия.
Мануалы, в которых часто пишут НИКОГДА НЕ ИСПОЛЬЗУЙТЕ не уважаю. Уважаю те, в которых очень подробно описывают все подводные камни и оставляют на усмотрение программисту. Ибо мой код — мои правила… Хоть и стараюсь всеми ушами прислушиваться и просто как художественную литературу читать чужой код, чтобы учиться организации кода и разным хитрым разворотам.. и оптимизации кода.. и стилю кода.. и очень стараюсь соблюдать все проблелы-табуляции-максимальную длину строки-комментарии, осмысленные имена всех переменных только на английском (честно смотрю в словаре, если не знаю, как это по-английски, чтобы грамотно назвать переменную) и пр., призванное увеличить читабельность, все равно «мой код — мои правила» — это то, что я люблю в программировании..
Я, скорее всего, быстро выброшу мануал, в котором много «НИКОГДА НЕ ИСПОЛЬЗУЙТЕ» или «Есть такая возможность, но лучше использовать другие»
Есть объяснение «никогда не используйте», связанное с тем что сильно жрёт память, или необоснованно долго выполняется скрипт.
Я не говорю что все магические методы плохи, и конструкторы/деструкторы это нормально, как бы это основы ООП.
Я до сих пор не знаю как пользоваться неймспейсом, я даже не знаю зачем он нужен, т.е. не вижу его применения, ну пока для себя.
go to тоже использовать не надо… хотя есть крайне редкие ситуации, когда он нужен.
У меня до сих пор куча вопросов про наследование. Так что да, php для меня пока тёмный лес, и мне проще ориентироваться по советам опытных программистов, которые пишут «не используйте» не из-за вредности, а из-за багажа опыта 🙂
Мне больше нравится такой подход: «Если перебирать числовой массив циклом for — это будет работать быстрее, чем цикл foreach в аналогичной ситуации». Статья про атрибуты и св-ва DOM-объектов в яваскриптах, там комментарии. Один комментирует: никогда не используйте setAttribute чтобы переключить галочку в чекбоксе! И все. А другой чувак дальше пишет: Я почитал спецификацию, атрибуты инпутов синхронизируются со свойствами DOM-объектов только в одну сторону, т.е.при изменении атрибута «checked» свойство и не должно меняться. Поэтому нет никакой гарантии, что во всех браузерах это будет стабильно работать. И действительно — работает через раз. Используйте obj.checked = true;
Разница заметна? Именно поэтому начинаю не уважать мануалы с фразами «НИКОГДА НЕ ИСПОЛЬЗУЙТЕ». Засоряет мозг, не давая понимания… «Багаж опыта» невозможно передать фразами с ключевым словом «НЕ»))) Серьезно, советую выбросить книжки, в которых много такого типа фраз — по таким учишься неполноценно.
А есть какие-то сформулированные вопросы про наследование?)) Давайте сюда хотя бы маленькую часть Вашей кучи) Очень интересно!
Ок, короткий вопрос про наследование — нахрена оно мне надо? Да простит меня администратор данного сайта про жестокий оффтоп не по теме статьи.
Александр,
круто) Спасибо))
Прекрасная тема урока, понятно и четко написано. И не менее захватывающие комментарии. Предлагаю лучшим признать комментарий Риты — 12.05.2013 23:47. И еще красиво написано — — 13.05.2013 18:57. )))
И кстате у тебя тут полно всякой фигни которую ты вообще не паяснил, например Граберры или как их там, ты только паяснил что они делают а пример и то как ими пользоватся или где их найти(ну ты понял, код) не предоставил. И указал какую то ссылку которая ведет на скачку денвера, хотя хотели мы скачать дополнительные модули PHP5
Ох))) Перечитала свои старые комментарии тут (Под именем Рита))) Ностальжи!)))
Сейчас я уже пишу на PHP и на Parser, и мой собственный ход мыслей кажется несколько странным и таким далеким))))
А разве нельзя всё это прописать на одном файле?
Я создал старничку с формой, а код php расположил на этой же страничке только сразу под формой. В action прописал название этого же файла, где и находится форма и вычислительный алгоритм и всё работает.
И не надо отвлекаться от формы. Заполнил — получил ответ. Ещё раз и ещё, ещё…
Правда, у меня в разработке не имена с возрастом, а маленькие приложения по отгадке слов, предложений, изображений. Для этого, как мне кажется, не зачем форму и задачу в разные файлы разводить.
Может кто знает как получить данные исполняемого файла на удаленном сервере который возвращает некие параметры. Как их вывести на свою страницу?
Хороший урок.
Но я никак не могу понять как кнопка вызывает пхп код? А если у меня много кнопок на форме будет, как указать чтобы именно эта кнопка вызывала пхп код по обработке формы?
Доброго времени. Обьясните,пожалуйста, зачем в
«»
употребляется сплэш «/» в конце,после «value=»» «?
Вывод данных можно было и одной строкой записать:
echo «имя — «.$_POST[user_name].»возраст — «.$_POST[age].» лет»;
Зачем «echo» плодить?