В руководстве по 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
.