Когда и почему следует использовать $REQUEST вместо $GET /$POST/ $COOKIE?
Вопрос в названии.
И что происходит, когда все 3 из $_GET[foo]
, $_POST[foo]
и $_COOKIE[foo] exist?
Какой из них включается в $_REQUEST?
6 answers
Я бы сказал, никогда.
Если бы я хотел, чтобы что-то было установлено с помощью различных методов, я бы написал код для каждого из них, чтобы напомнить себе, что я сделал это таким образом, иначе вы могли бы в конечном итоге перезаписать вещи, не осознавая этого.
Разве это не должно работать так:
$_GET = неразрушающие действия (сортировка, запись действий, запросы)
$_POST = деструктивные действия (удаление, обновление)
$_COOKIE = тривиальные настройки (настройки таблицы стилей и т.д.)
$_SESSION = нетривиальные настройки (имя пользователя, вход в систему?, уровни доступа)
Иногда может потребоваться, чтобы один и тот же скрипт вызывался несколькими разными способами. На ум приходит отправка формы и вызов AJAX. Однако в большинстве случаев лучше быть откровенным.
Также см. http://docs.php.net/manual/en/ini.core.php#ini.request-order о том, как различные источники переменных перезаписывают друг друга, если возникает конфликт имен.
Чтобы ответить на вопрос "что происходит, когда все 3 существуют", ответ будет "это зависит".
PHP автоматически заполняет $_REQUEST на основе директивы request_order (или variables_order, если request_order отсутствует) в PHP.INI. По умолчанию обычно используется "GPC", что означает, что сначала загружается GET, затем загружается POST (перезапись GET, если есть коллизия), затем загружаются файлы cookie (перезапись get/post, если есть коллизия). Однако вы можете изменить эту директиву в PHP.INI-файл. Например, изменение его на "CPG" заставляет файлы cookie сначала загружаться, затем публиковаться, а затем получать.
Что касается того, когда его использовать? Я повторю чувство "Никогда". Вы уже не доверяете пользователю, так зачем давать ему больше инструментов? Как разработчик, вы должны знать, откуда вы ожидаете получить данные. Все дело в уменьшении площади вашей поверхности атаки.
$_REQUEST
это всего лишь ярлык, чтобы вы не могли проверять публикацию, получать и готовить, если данные могут поступать из любого из них.
Есть некоторые подводные камни:
- данные берутся из файлов cookie GET, POST и, наконец, из файлов COOKIE. Последнее переопределяет первое, так что будьте осторожны с этим.
-
Архитектуры REST требуют разделения сообщения и ПОЛУЧЕНИЯ семантики, в этом случае вы не можете полагаться на
$_REQUEST
.
Тем не менее, если вы знаете, что делаете, то это просто еще один удобный PHP трюк.
Я бы использовал его, если бы хотел быстро обновить var, который может поступать из нескольких источников. Например:
- В вашем контроллере, чтобы решить, какую страницу обслуживать, не проверяя, поступает ли запрос от действия формы или гипертекстовой ссылки.
-
Чтобы проверить, активен ли сеанс независимо от способа передачи идентификатора сеанса.
Когда вы не уверены, где заполнены значения, или когда вы используете их оба и хотите выполнить цикл по всем значениям с помощью методов POST и GET.
Я использую POST, когда не хочу, чтобы люди имели легкий доступ к передаваемому, и я использую GET, когда я не возражаю, чтобы они видели значение в URL. Я обычно не использую файлы cookie для большей части, поскольку считаю, что СЕАНС подходит для сохранения значений (хотя наличие надлежащего реестра - лучший способ использовать это).