什么时候以及为什么应该使用$ _REQUEST代替$ _GET / $ _POST / $ _COOKIE?
标题中的问题。
当$ _GET [foo],$ _ POST [foo]和$ _COOKIE [foo]中的全部三个都存在时,会发生什么呢?
解决方案
当我们不确定在哪里填充值或者何时使用它们时,又想通过POST和GET方法遍历所有值。
有时,我们可能希望以几种不同的方式调用同一脚本。想到一个表单提交和一个AJAX调用。但是,在大多数情况下,最好明确一点。
另请参阅http://docs.php.net/manual/zh-CN/ini.core.php#ini.request-order,以了解在发生名称冲突时,不同的变量源如何相互覆盖。
$ _REQUEST只是防止我们测试发布,获取和烹饪数据的捷径,如果这些数据可以来自这些数据中的任何一个。
有一些陷阱:
- 数据取自GET,POST以及最后的COOKIE。最后一个优先于第一个,因此要小心。
- REST体系结构要求将POST和GET语义分开,在这种情况下,我们不能依赖于$ _REQUEST。
不过,如果我们知道自己在做什么,那只是另一个方便的PHP技巧。
如果要快速更新可能来自多个来源的var,可以使用它。例如:
- 在控制器中,无需检查请求是否来自表单操作或者超文本链接即可决定要服务的页面。
- 检查会话是否仍处于活动状态,而无论会话ID的传输方式如何。
我不会说。
如果我想通过各种方法来设置某些东西,我会为每个代码编写代码以提醒自己,我这样做的方式是这样,否则我们可能最终会被覆盖而没有意识到。
它不应该这样工作:
$ _GET =非破坏性动作(排序,记录动作,查询)
$ _POST =破坏性操作(删除,更新)
$ _COOKIE =琐碎的设置(样式表首选项等)
$ _SESSION =非重要的设置(用户名,已登录?,访问级别)
当我不希望人们轻松访问正在传递的内容时,我使用POST;当我不介意他们看到url中的值时,则使用GET。我通常不会使用cookie太多,因为我发现SESSION对于持久值是很好的(尽管拥有适当的注册表是使用它的最佳方法)。
要回答"三个都存在时会发生什么"问题,答案是"取决于"。
PHP根据PHP.INI中的request_order指令(或者如果没有request_order,则为variables_order)自动填充$ _REQUEST。默认值通常是" GPC",这意味着首先加载GET,然后加载POST(如果发生冲突则覆盖GET),然后加载Cookie(如果发生冲突则覆盖get / post)。但是,我们可以在PHP.INI文件中更改此伪指令。例如,将其更改为" CPG"将使cookie先加载,然后发布,然后获取。
至于什么时候使用呢?我会表达"永不"的情绪。我们已经不信任用户,那么为什么要给用户更多工具呢?作为开发人员,我们应该知道数据预期来自何处。这一切都是为了减少攻击表面积。