2008-09-20 39 views
21

标题中的问题。

会发生什么的时候$_GET[foo]$_POST[foo]$_COOKIE[foo] exist?所有3,其中一人被纳入到$_REQUEST?

+1

根据php.ini中的gpc_order,变量会被覆盖,你也应该用引号访问你的变量,像这样:$ _GET ['foo'] – 2009-08-13 12:13:23

回答

49

我从来不会说。

如果我想要的东西通过各种方法来设置,我的代码为他们每个人来提醒自己,我做这些是这样 - 否则你可能有事情都是没有意识到改写结束。

它不应该像这样工作:

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

$ _ POST =破坏性操作(删除,更新)

$ _COOKIE =琐碎的设置(样式喜好等)

$ _SESSION =不平凡的设置(用户名,登录?,访问级别)

+0

GET和POST方法的优点在于它们的意思是不同的目的。现在很少有Web应用程序以这种方式工作,但是... – 2008-09-20 09:38:02

2

当你不能确定的填充值,其中或当您在使用这两个并希望环POST和GET方法的所有值。

7

有时候您可能希望通过几种不同的方式调用相同的脚本。想到表单提交和AJAX调用。在大多数情况下,但是,it's最好是明确的。

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

4

$_REQUEST只是一个快捷方式,以防止您测试帖子,获取和烹饪,如果数据可能来自任何这些。

有一些缺陷:

  • 数据从GET,POST和COOKIE最后拍摄。最后覆盖第一个,所以要小心。
  • REST体系结构要求分开POST和GET语义,在这种情况下不能依赖$_REQUEST

不过,如果你知道你在做什么,那么它只是一个方便的PHP伎俩。

我会使用它,如果我想快速更新变种可能来自几个方面。 E.G:

  • 在您的控制器中,决定要提供哪个页面而不检查请求是来自表单动作还是超文本链接。
  • 要检查是否不管方式会话ID的会话仍活跃传输。

1

我使用POST时,我不希望人们轻松访问正在传递的内容,并且我使用GET的时候不介意他们在url中查看值。我通常不会使用cookies,因为我发现SESSION对于持久化值是没问题的(尽管有一个正确的注册表是最好的方式来利用它)。

4

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

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

至于何时使用它?我会回应“从不”的观点。你已经不相信用户,为什么要给用户更多的工具?作为开发者,你应该知道你期望数据来自哪里。这都是关于减少你的攻击面积。

相关问题