Статьи

На $ _GET и $ _POST

В руководстве по PHP сказано следующее о пресловутых суперглобалах, $_GET и $_POST :

$ _GET
Ассоциативный массив переменных, передаваемых текущему сценарию с помощью метода HTTP GET.
Источник: php.net

$ _POST
Ассоциативный массив переменных, переданных в текущий скрипт через метод HTTP POST.
Источник: php.net

Давайте посмотрим, как работает типичное PHP-приложение?

Когда PHP-скрипт вызывается веб-сервером, это происходит в результате HTTP-запроса . HTTP-запрос имеет целевой URI, и этот URI состоит из разных частей. Одной из этих частей является query . Это та часть, которая идет после любого знака вопроса. Или более формально:

  <Схема>: // <власть> <путь> <запрос>?
   absoluteURI = схема ":" (hier_part | opaque_part)
   hier_part = (net_path | abs_path) ["?"  запрос]
   net_path = "//" author [abs_path]
   abs_path = "/" path_segments

Источник: rfc 2396

Когда процесс PHP запускается, query разбирается в ассоциативный массив. И по какой-то причине кто-то выбрал неудачный $_GET , потому что это то, что вы используете для запросов GET — верно?

Неправильно!

Все HTTP-запросы — GET, POST и менее известные — имеют URI. Поскольку все они имеют URI, у них также есть query , и, таким образом, массив $_GET доступен для всех них. Другими словами, запрос POST также имеет параметры $_GET . Неудивительно, что люди запутались в HTTP и REST. Но это еще хуже.

В дополнение к URI некоторые HTTP-запросы могут содержать тело сообщения; Не все запросы (например, GET не может), но некоторые. Наиболее распространенным примером запроса, который содержит тело сообщения, является тип POST. Введите переменную $_POST . Как и его двоюродный брат $_GET , он заполняется при запуске, но тело сообщения анализируется как application/x-www-form-urlencoded . В отличие от $_GET это не часть спецификации HTTP, а конкретная разновидность кодировки, в которую браузеры будут отправлять HTML <form> . На практике это довольно безопасная ставка, поскольку браузеры могут только отправлять формы в виде GET и POST, но технически ничто не мешает кому-то отправить запрос типа PUT с телом сообщения в кодированной форме.

Затем есть $_FILES , который похож на $_POST , в том $_FILES , что это интерпретация тела сообщения, но на этот раз согласно rfc 1867 , который, кстати, является рекомендуемой кодировкой для запросов POST. Ура!

Итак, теперь, когда все спецификации были обобщены, вот мое знакомство с PHP.

Проблема с $_GET и $_POST заключается в том, что многие люди предполагают — понятно, но ошибочно — что $_GET каким-то образом привязан к GET-запросам, и что $_POST соответственно, используется для POST-запросов. Но это не так. Запрос POST может содержать соответствующие данные в $_GET . Или в $_FILES . И кодирование формы не ограничивается запросами POST — таким образом, $_POST может содержать соответствующие данные для запроса PUT.

Текущие имена сбивают с толку и скрывают намерение HTTP; Более описательные имена были бы $_QUERY вместо $_GET и $_FORM * вместо $_POST (что соответствовало бы этимологии имени $_FILES ).

* Как отмечалось в комментариях , возможно, $_FORM — не лучшее из названий.

Если кажется, что это сложно, позвольте мне напомнить, что нечто подобное было сделано пару лет назад, и тогда это никого не беспокоило. Но для начала уточнение документации было бы шагом в правильном направлении.

И я даже не буду комментировать злобность $_REQUEST .