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






Когда вы не уверены, где заполняются значения или когда вы используете их оба, и хотите перебрать все значения с помощью методов POST и GET.
Иногда может потребоваться, чтобы один и тот же сценарий вызывал несколькими разными способами. На ум приходит отправка формы и вызов AJAX. Однако в большинстве случаев лучше быть явным.
Также см. http://docs.php.net/manual/en/ini.core.php#ini.request-order о том, как разные источники переменных перезаписывают друг друга при конфликте имен.
$_REQUEST - это всего лишь ярлык, который не позволяет вам тестировать пост, получать и готовить, если данные могут поступать из любого из них.
Есть несколько подводных камней:
$_REQUEST.Тем не менее, если вы знаете, что делаете, то это просто еще один удобный трюк PHP.
Я бы использовал его, если бы хотел быстро обновить переменную, которая может поступать из нескольких источников. Напр .:
Чтобы проверить, активен ли сеанс, независимо от способа передачи идентификатора сеанса.
Я бы сказал никогда.
Если бы я хотел, чтобы что-то было установлено с помощью различных методов, я бы закодировал для каждого из них, чтобы напомнить себе, что я сделал это таким образом - иначе вы можете в конечном итоге что-то перезаписать, не осознавая.
Разве это не должно работать так:
$ _GET = неразрушающие действия (сортировка, запись действий, запросы)
$ _POST = деструктивные действия (удаление, обновление)
$ _COOKIE = тривиальные настройки (настройки таблицы стилей и т. д.)
$ _SESSION = нетривиальные настройки (имя пользователя, авторизация?, Уровни доступа)
Отличная точка зрения на методы GET и POST, они предназначены для разных целей. Однако в наши дни немногие веб-приложения работают таким образом ...
Я всегда думал, что идея заключалась в том, что если вы используете get для удаления вещей, то боты могут сканировать эти ссылки и, следовательно, удалять все в базе данных ... Это звучало как ужасная история, поэтому я всегда придерживался схемы, приведенной выше.
Мы просто боремся с этим на моей работе. Наш продукт представляет собой систему CMS, в которой нет соответствует приведенному выше правилу. Мы хотели бы предоставить нашим клиентам устройства Google Mini www.google.com/enterprise/mini/, но невозможно позволить ему сканировать экстранет CMS, потому что ад вырвется наружу: /
Это расстраивает ... Хорошо подумать об этом, прежде чем начинать! Вы можете попробовать rel = "nofollow" для всех ссылок get, а затем постепенно удалять те, которые, как вы знаете, безопасны - конечно, это все еще немного пугает, не уверен, насколько строг Google в отношении nofollow.
Он уважает nofollow, и, конечно же, от него можно защититься многими другими средствами. Но это все еще много ненужной работы, которой можно было бы избежать, в первую очередь, с помощью лучших дизайнерских решений.
@RichBradshaw Это помогло мне в 2013 году. О да!
Я использую 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 сначала загружаются, затем публикуются, а затем получают.
Насколько когда это использовать? Я повторю чувство «Никогда». Вы уже не доверяете пользователю, так зачем давать ему больше инструментов? Как разработчик вы должны знать, откуда вы ожидаете появления данных. Все дело в уменьшении площади вашей поверхности атаки.
Переменные перезаписываются в соответствии с gpc_order в php.ini, также вы должны обращаться к своим переменным с помощью кавычек, например: $ _GET ['foo']