何时以及为什么要使用$ _REQUEST而不是$ _GET / $ _POST / $ _COOKIE?

时间:2008-09-20 09:02:24

标签: php

标题中的问题。

$_GET[foo]$_POST[foo]$_COOKIE[foo] exist?中的所有3个被包含到$_REQUEST?

时,会发生什么?

6 个答案:

答案 0 :(得分:51)

我永远不会说。

如果我想通过各种方法设置某些东西,我会为每个方法编写代码以提醒自己我是这样做的 - 否则你最终可能会被覆盖而没有意识到。

它不应该像这样工作:

$ _ GET =非破坏性操作(排序,记录操作,查询)

$ _ POST =破坏性行为(删除,更新)

$ _ COOKIE =琐碎的设置(样式表首选项等)

$ _ SESSION =非常重要的设置(用户名,登录?,访问级别)

答案 1 :(得分:7)

有时您可能希望使用多种不同方式调用相同的脚本。我想到了表单提交和AJAX调用。然而,在大多数情况下,最好是明确的。

另外,如果存在名称冲突,请参阅http://docs.php.net/manual/en/ini.core.php#ini.request-order,了解不同的变量来源如何相互覆盖。

答案 2 :(得分:4)

$_REQUEST只是阻止您测试帖子,获取和烹饪的快捷方式,如果数据可以来自其中任何一种。

有一些陷阱:

  • 数据来自GET,POST,最后是COOKIE。最后覆盖第一个,所以要小心。
  • REST架构需要分离POST和GET语义,在这种情况下,您不能依赖$_REQUEST

然而,如果你知道自己在做什么,那么这只是另一个方便的 PHP 技巧。

如果我想快速更新可能来自多个来源的var,我会使用它。 E.G:

  • 在您的控制器中,决定要投放的页面,而不检查请求是来自表单操作还是超文本链接。
  • 检查会话是否仍处于活动状态,无论会话ID的传输方式如何。

     

答案 3 :(得分:4)

要回答“当所有3个存在时会发生什么”的问题,答案是“它取决于。”

PHP在PHP.INI中根据request_order指令(或者如果request_order不存在则使用variables_order)自动填充$ _REQUEST。默认值通常是“GPC”,这意味着首先加载GET,然后加载POST(如果发生冲突则覆盖GET),然后加载cookie(如果发生冲突,则覆盖get / post)。但是,您可以在PHP.INI文件中更改此指令。例如,将其更改为“CPG”会使cookie首先加载,然后发布,然后加载。

何时使用它?我会回应“永远不会”的情绪。您已经不信任该用户,那么为什么要为用户提供更多工具呢?作为开发人员,您应该知道您希望数据来自何处。这都是为了减少攻击面积。

答案 4 :(得分:2)

如果您不确定填充值的位置或何时使用它们,并希望通过POST和GET方法遍历所有值。

答案 5 :(得分:1)

当我不希望人们轻松访问正在传递的内容时,我使用POST。当我不介意他们看到网址中的值时,我使用GET。我通常不会使用cookie,因为我发现SESSION对于持久化值很好(尽管使用适当的注册表是最好的方法)。