Когда и почему следует использовать $REQUEST вместо $GET /$POST/ $COOKIE?


Вопрос в названии.

И что происходит, когда все 3 из $_GET[foo], $_POST[foo] и $_COOKIE[foo] exist? Какой из них включается в $_REQUEST?

 22
php
Author: Alive to Die, 2008-09-20

6 answers

Я бы сказал, никогда.

Если бы я хотел, чтобы что-то было установлено с помощью различных методов, я бы написал код для каждого из них, чтобы напомнить себе, что я сделал это таким образом, иначе вы могли бы в конечном итоге перезаписать вещи, не осознавая этого.

Разве это не должно работать так:

$_GET = неразрушающие действия (сортировка, запись действий, запросы)

$_POST = деструктивные действия (удаление, обновление)

$_COOKIE = тривиальные настройки (настройки таблицы стилей и т.д.)

$_SESSION = нетривиальные настройки (имя пользователя, вход в систему?, уровни доступа)

 51
Author: Rich Bradshaw, 2008-09-20 09:34:24

Иногда может потребоваться, чтобы один и тот же скрипт вызывался несколькими разными способами. На ум приходит отправка формы и вызов AJAX. Однако в большинстве случаев лучше быть откровенным.

Также см. http://docs.php.net/manual/en/ini.core.php#ini.request-order о том, как различные источники переменных перезаписывают друг друга, если возникает конфликт имен.

 7
Author: Internet Friend, 2008-09-20 09:08:31

Чтобы ответить на вопрос "что происходит, когда все 3 существуют", ответ будет "это зависит".

PHP автоматически заполняет $_REQUEST на основе директивы request_order (или variables_order, если request_order отсутствует) в PHP.INI. По умолчанию обычно используется "GPC", что означает, что сначала загружается GET, затем загружается POST (перезапись GET, если есть коллизия), затем загружаются файлы cookie (перезапись get/post, если есть коллизия). Однако вы можете изменить эту директиву в PHP.INI-файл. Например, изменение его на "CPG" заставляет файлы cookie сначала загружаться, затем публиковаться, а затем получать.

Что касается того, когда его использовать? Я повторю чувство "Никогда". Вы уже не доверяете пользователю, так зачем давать ему больше инструментов? Как разработчик, вы должны знать, откуда вы ожидаете получить данные. Все дело в уменьшении площади вашей поверхности атаки.

 4
Author: Nathan Strong, 2008-09-21 02:30:58

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

Есть некоторые подводные камни:

  • данные берутся из файлов cookie GET, POST и, наконец, из файлов COOKIE. Последнее переопределяет первое, так что будьте осторожны с этим.
  • Архитектуры REST требуют разделения сообщения и ПОЛУЧЕНИЯ семантики, в этом случае вы не можете полагаться на $_REQUEST.

Тем не менее, если вы знаете, что делаете, то это просто еще один удобный PHP трюк.

Я бы использовал его, если бы хотел быстро обновить var, который может поступать из нескольких источников. Например:

  • В вашем контроллере, чтобы решить, какую страницу обслуживать, не проверяя, поступает ли запрос от действия формы или гипертекстовой ссылки.
  • Чтобы проверить, активен ли сеанс независимо от способа передачи идентификатора сеанса.

 4
Author: e-satis, 2016-01-20 06:08:21

Когда вы не уверены, где заполнены значения, или когда вы используете их оба и хотите выполнить цикл по всем значениям с помощью методов POST и GET.

 2
Author: Sietse, 2008-09-20 09:05:16

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

 1
Author: Stuart, 2008-09-20 15:50:23