Какой из $ _REQUEST, $ _GET и $ _POST самый быстрый?


177

Какой из этих кодов будет быстрее?

$temp = $_REQUEST['s'];

или

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
Есть третий случай, понимаешь. !isset($_REQUEST['s']),
Франц

5
Насколько важно, чтобы другие люди четко понимали ваш код? POST и GET являются явными, тогда как REQUEST может поступать из различных источников. Я думаю, что эффективность незначительна, так как суперглобалы REQUEST, POST и GET всегда загружаются для каждого запроса.
Кевин

Ответы:


273

$_REQUEST, По умолчанию, содержит содержимое $_GET, $_POSTи $_COOKIE.

Но это только значение по умолчанию, которое зависит от variables_order; и не уверен, что вы хотите работать с куки.

Если бы мне пришлось выбирать, я бы, вероятно, не использовал $_REQUEST, и я бы выбрал $_GETили $_POST- в зависимости от того, что должно делать мое приложение (т.е. одно или другое, но не оба) : вообще говоря:

  • Вы должны использовать, $_GETкогда кто-то запрашивает данные из вашего приложения.
  • И вы должны использовать, $_POSTкогда кто-то помещает (вставляет, обновляет или удаляет) данные в ваше приложение.

В любом случае, разница в производительности не будет большой: разница будет незначительной по сравнению с тем, что сделает остальная часть вашего сценария.


1
В идеале вы всегда должны использовать $ _REQUEST. Но это, конечно, только идеальный мир.
Тайлер Картер

2
$ _REQUEST предположительно (или, по крайней мере, раньше) дороже, чем использование $ _POST и $ _GET напрямую.
Даррелл Брогдон

3
+1 за то, что концепция различия в производительности незначительна, а перспектива обслуживания более важна: $ _GET и $ _POST передают значение так, как не может $ _REQUEST.
Джон Крам

9
Использование $ _REQUEST не вызывает XSS / XSRF. Непонимание нюансов XSS / XSRF вызывает XSS / XSRF. Пока вы работаете с токенами, проблем не возникает И вы получаете преимущества от использования $ _REQUEST (все ваши переменные находятся в одном суперглобальном элементе). Я на самом деле перестраиваю $ _REQUEST перед его использованием на основе других суперглобалей из-за 'variable_order'. Я обрабатываю $ _COOKIE, затем $ _GET, затем $ _POST. Таким образом, POST-переменные имеют самый высокий приоритет, а cookie-файлы получают самый низкий, что позволяет мне неявно исправлять ряд ошибок (например, Adobe Flash и магические кавычки).
CubicleSoft

его во имя, Get = получить от, Post = сообщение для
сварливый

32

ПОЛУЧИТЬ против ПОЧТЫ

1) И GET, и POST создают массив (например, массив (ключ => значение, ключ2 => значение2, ключ3 => значение3, ...)). Этот массив содержит пары ключ / значение, где ключи - это имена элементов управления формы, а значения - входные данные пользователя.

2) И GET, и POST рассматриваются как $ _GET и $ _POST. Это суперглобальные, что означает, что они всегда доступны, независимо от области видимости - и вы можете получить к ним доступ из любой функции, класса или файла, не делая ничего особенного.

3) $ _GET - это массив переменных, передаваемых текущему скрипту через параметры URL.

4) $ _POST - это массив переменных, передаваемых текущему сценарию с помощью метода HTTP POST.

Когда использовать GET?

Информация, отправляемая из формы методом GET, видна всем (все имена и значения переменных отображаются в URL). GET также имеет ограничения на количество информации для отправки. Ограничение составляет около 2000 символов. Однако, поскольку переменные отображаются в URL-адресе, можно добавить страницу в закладки. Это может быть полезно в некоторых случаях.

GET может использоваться для отправки нечувствительных данных.

Примечание: GET НИКОГДА не должен использоваться для отправки паролей или другой конфиденциальной информации!

Когда использовать POST?

Информация, отправляемая из формы методом POST, невидима для других (все имена / значения встроены в тело HTTP-запроса) и не имеет ограничений на количество отправляемой информации.

Кроме того, POST поддерживает расширенные функциональные возможности, такие как поддержка двоичного ввода из нескольких частей при загрузке файлов на сервер.

Однако, поскольку переменные не отображаются в URL-адресе, невозможно добавить страницу в закладки.


6
Пожалуйста, добавьте что-нибудь о REQUEST тоже.
Черная Мамба

Как насчет $ _REQUEST?
Аамир Калими

22

$ _GET извлекает переменные из строки запроса или вашего URL.>

$ _POST извлекает переменные из метода POST, такого как (обычно) формы.

$ _REQUEST - это слияние $ _GET и $ _POST, где $ _POST переопределяет $ _GET. Хорошо использовать $ _REQUEST на самореференциальных формах для валидации.


3
+1 Это в основном то, чему меня учили. Не технический, как другие ответы, но гораздо легче запомнить ( GETиз строки запроса, POSTиз отправки формы).
jp2code

18

Я бы предложил использовать $_POSTи $_GETявно.

В любом случае использование $ _REQUEST не должно быть необходимым при правильном дизайне сайта, и у него есть некоторые недостатки, такие как оставление вас открытыми для более легких CSRF/XSSатак и других глупостей, возникающих при хранении данных в URL.

Разница в скорости должна быть минимальной в любом случае.


8

Используйте ЗАПРОС. Никто не заботится о скорости такой простой операции, и это намного более чистый код.


7
Хороший ответ, с оговоркой, что во многих ситуациях GET или POST должны выбираться в зависимости от ситуации, а не с использованием одного из них.
ceejayoz

3
Вы правы, что никого не волнует, но, по моему мнению, использование $_REQUESTнеправильного вывода. Смотри мой ответ.
Франц

4
почему использование $ _REQUEST чище по сравнению с $ _GET или $ _POST? $ _REQUEST выполняет ту же логику за сценой, и выбор GET или POST дает вам больше контроля.
Джей Цзэн

6
Утверждение, что _REQUEST является более гигиеническим, требует проработки.

2
Я бы порекомендовал использовать GET, если вы хотите, чтобы пользователь мог скопировать URL-адрес и выполнить ту же самую операцию, т. Е. (URL-адрес отображается как «google.com/q=searchWord», а POST следует использовать для публикации данных на веб-сайте. это должно быть вставлено только один раз, или много данных активно, и пользователь не должен иметь возможность сохранять URL-адрес, например, вставку данных в базы данных, вход в систему и т. д.
Dean Meehan

7

Не беспокойся Но вы все равно должны использовать второе решение (плюс дополнительный чек ни одна из этих переменных существующих), потому что есть проблемы с безопасностью $_REQUEST(начиная с $_GETи $_POSTне являются единственными источниками для этого массива).

Был пост о проблемах со $_REQUESTвчерашним днем, я полагаю. Позволь мне найти это.

РЕДАКТИРОВАТЬ : Ну хорошо, не прямо сообщение, но здесь это в любом случае: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Используйте это, потому что это безопаснее и не будет иметь заметного различия в скорости


Совсем неплохое решение. Он заботится о недостатках безопасности, связанных с, $_REQUESTно по-прежнему позволяет доступ к одному и тому же сценарию в любом случае (в моем случае один и тот же сценарий используется с разными «действиями», и иногда $ _GET будет в порядке, но в других случаях мне нужно $ _POST, чтобы скрыть / защитить данные).
Ксандор

4

Существуют определенные проблемы безопасности, так как хакер может установить cookie, который переопределит значение $ _POST или $ _GET. Если вы обрабатываете конфиденциальные данные, я бы не рекомендовал использовать $ _REQUEST. - Ксандор

Вы не можете использовать $_GETальтернативу в $_POSTнекоторых случаях.

Когда ??

  • когда вы хотите загрузить файл.
  • когда вы не хотите показывать данные в URL.

GETтакже есть ограничения на количество информации для отправки. Ограничение составляет около 2000 символов.

Другое дело, что есть несколько случаев, когда вы не можете получить данные, используя $_POST

Когда ?

  • когда данные передаются в URL.

Для отдыха

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

нет ничего плохого в использовании $_REQUEST.

Но способ сделать это - явно проверить $ _SERVER ['REQUEST_METHOD'], а не полагаться на то, что $ _POST будет пустым для GET.


1
Хороший совет по использованию, $_SERVER['REQUEST_METHOD']чтобы проверить, будет ли скрипт вызываться с любым из них. Но сказать, что все в порядке, $_REQUESTне на 100% верно. Существуют определенные проблемы безопасности, так как хакер может установить cookie, который переопределит значение $ _POST или $ _GET. Если вы обрабатываете конфиденциальные данные, я бы не рекомендовал использовать $_REQUEST.
Ксандор

Я добавил ваш комментарий в мой ответ, это поможет, спасибо
Парт Чавда

3

$ _GET извлекает переменные из строки запроса или вашего URL.>

$ _POST извлекает переменные из метода POST, такого как (обычно) формы.

$ _REQUEST - это слияние $ _GET и $ _POST, где $ _POST переопределяет $ _GET. Хорошо использовать $ _REQUEST на самореференциальных формах для валидации.


2
Переопределение зависит от request_orderзначений cookie и может содержать их, поэтому это не очень надежная и не полезная функция.
Ja͢ck

1

Я бы использовал второй метод, так как он более явный. В противном случае вы не знаете, откуда берутся переменные.

В любом случае, зачем вам проверять GET и POST? Конечно, использование одного или другого имеет больше смысла.


1
Я видел это раньше, GETбудучи использованным только для одного элемента (например, для его перемещения) и POSTдля нескольких из них (форма с флажками ...).
Франц

1

Я использую только _GET или _POST. Я предпочитаю иметь контроль.

Что мне не нравится ни в одном фрагменте кода в OP, так это в том, что они отбрасывают информацию о том, какой метод HTTP был использован. И эта информация важна для очистки входных данных.

Например, если скрипт принимает данные из формы, которая будет введена в БД, тогда в форме лучше использовать POST ( используйте GET только для идемпотентных действий ). Но если скрипт получает входные данные с помощью метода GET, он должен (обычно) быть отклонен. Для меня такая ситуация может потребовать записи нарушения безопасности в журнал ошибок, поскольку это признак того, что кто-то что-то пытается.

С любым фрагментом кода в OP эта очистка была бы невозможна.


На самом деле, просто написать маленькую страницу, которая будет публиковать на странице все, что вы хотите. Поэтому, если вы не полагаетесь на отправляемые заголовки реферера, почтовые переменные не более безопасны, чем получение переменных. Я полагаю, что самое большое преимущество явного $_POSTзаключается в том, что сканеры поисковых систем не должны делать что-то вроде этого: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth

Я ничего не сказал наоборот. Я сказал, что если форма HTML использует POST и сценарий, обрабатывающий ее, получает данные формы через GET, то сценарий захочет узнать об этом, а не отбрасывать этот факт, как это делают оба примера kobra. (Кстати:

1

Я бы использовал $_POSTи $_GETпотому , что в отличие от $_REQUESTих содержания не влияет variables_order.
Когда использовать $_POSTи $_GETзависит от того, какая операция выполняется. Операция, которая изменяет данные, обрабатываемые с сервера, должна выполняться с помощью запроса POST, тогда как другие операции должны выполняться с помощью запроса GET. Например, операция, которая удаляет учетную запись пользователя, не должна выполняться непосредственно после того, как пользователь щелкнет ссылку, а просмотр изображения можно выполнить по ссылке.


1

Я использую это,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

оператор проверяет, имеет ли $ _REQUEST более одного параметра (первым параметром в $ _REQUEST будет uri запроса, который можно использовать при необходимости, некоторые пакеты PHP не будут возвращать $ _GET, поэтому проверьте, если его значение больше $ 1 для $ _GET, по умолчанию это будет $ _POST.


0

Вы преждевременно оптимизируете. Кроме того, вы должны по-настоящему задуматься о том, следует ли использовать GET для вещей, которые вы размещаете, из соображений безопасности.


3
Пожалуйста, не пытайтесь говорить людям, что есть что-то более безопасное в POST, чем в GET.

Я не. Дело в том, что об их использовании следует подумать, а не явно использовать взаимозаменяемо, потому что «просто набрать REQUEST намного проще».
Алекс Брасетвик

Если вы имеете в виду, что Кобра должен проверить, что данные были отправлены с использованием ожидаемого метода, то я согласен. Любой из его примеров кода делает такое тестирование невозможным.

0

Это некрасиво, и я бы не рекомендовал его в качестве окончательного решения при отправке кода в реальном времени, но при построении функций отдыха иногда удобно иметь средство захвата параметра «все-таки»:

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Возможно, кто-то из креативщиков мог бы даже добавить к нему параметры командной строки или что-то еще из вашей IDE. После того, как вы решите, что делает данная функция rest, вы можете выбрать ту, которая подходит для данного вызова, чтобы убедиться, что вы получите то, что вам нужно для версии deploy. Это предполагает, что 'REQUEST_METHOD' установлен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.