Когда и почему следует использовать $ _REQUEST вместо $ _GET / $ _POST / $ _COOKIE?

Вопрос в заголовке.

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

Переменные перезаписываются в соответствии с gpc_order в php.ini, также вы должны обращаться к своим переменным с помощью кавычек, например: $ _GET ['foo']

Alix Axel 13.08.2009 16:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
22
1
9 080
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

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

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

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

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

Отличная точка зрения на методы GET и POST, они предназначены для разных целей. Однако в наши дни немногие веб-приложения работают таким образом ...

Internet Friend 20.09.2008 13:38

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

Rich Bradshaw 20.09.2008 13:40

Мы просто боремся с этим на моей работе. Наш продукт представляет собой систему CMS, в которой нет соответствует приведенному выше правилу. Мы хотели бы предоставить нашим клиентам устройства Google Mini www.google.com/enterprise/mini/, но невозможно позволить ему сканировать экстранет CMS, потому что ад вырвется наружу: /

Internet Friend 20.09.2008 13:47

Это расстраивает ... Хорошо подумать об этом, прежде чем начинать! Вы можете попробовать rel = "nofollow" для всех ссылок get, а затем постепенно удалять те, которые, как вы знаете, безопасны - конечно, это все еще немного пугает, не уверен, насколько строг Google в отношении nofollow.

Rich Bradshaw 20.09.2008 14:51

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

Internet Friend 20.09.2008 15:37

@RichBradshaw Это помогло мне в 2013 году. О да!

Yousuf Memon 23.04.2013 19:17

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

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

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

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

Другие вопросы по теме