Когда и почему следует использовать $ _REQUEST вместо $ _GET / $ _POST / $ _COOKIE? - PullRequest
22 голосов
/ 20 сентября 2008

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

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

Ответы [ 6 ]

51 голосов
/ 20 сентября 2008

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

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

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

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

$ _ POST = разрушительные действия (удаление, обновление)

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

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

7 голосов
/ 20 сентября 2008

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

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

4 голосов
/ 21 сентября 2008

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

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

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

4 голосов
/ 20 сентября 2008

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

Есть несколько подводных камней:

  • данные взяты из GET, POST и, наконец, COOKIE. Последнее переопределяет первое, поэтому будьте осторожны с этим.
  • REST-архитектуры требуют разделения семантики POST и GET, в этом случае нельзя полагаться на $_REQUEST.

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

Я бы использовал его, если бы хотел быстро обновить переменную, которая может исходить из нескольких источников. E.G:

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

2 голосов
/ 20 сентября 2008

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

1 голос
/ 20 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...