【发布时间】:2010-09-11 13:59:51
【问题描述】:
标题中的问题。
当$_GET[foo]、$_POST[foo] 和$_COOKIE[foo] exist? 中的哪一个都包含在$_REQUEST? 中时会发生什么
【问题讨论】:
-
变量根据 php.ini 中的 gpc_order 被覆盖,你也应该用引号来访问你的变量,像这样:$_GET['foo']
标签: php
标题中的问题。
当$_GET[foo]、$_POST[foo] 和$_COOKIE[foo] exist? 中的哪一个都包含在$_REQUEST? 中时会发生什么
【问题讨论】:
标签: php
$_REQUEST 只是阻止您测试 post、get 和 Cooking 的捷径,前提是数据可以来自这些中的任何一个。
有一些陷阱:
$_REQUEST。不过,如果您知道自己在做什么,那么这只是另一个方便的 PHP 技巧。
如果我想快速更新可能来自多个来源的变量,我会使用它。例如:
无论会话 id 的传输方式如何,都检查会话是否仍处于活动状态。
【讨论】:
要回答“当所有 3 个都存在时会发生什么”的问题,答案是“视情况而定”。
PHP 根据 PHP.INI 中的 request_order 指令(或 variables_order 如果 request_order 不存在)自动填充 $_REQUEST。默认值通常是“GPC”,这意味着首先加载 GET,然后加载 POST(如果有冲突,则覆盖 GET),然后加载 cookie(如果有冲突,则覆盖 get/post)。但是,您可以在 PHP.INI 文件中更改此指令。例如,将其更改为“CPG”会使 cookie 先加载,然后发布,然后获取。
至于什么时候使用呢?我会回应“从不”的观点。你已经不信任用户了,为什么还要给用户更多的工具呢?作为开发人员,您应该知道您期望数据来自哪里。这一切都是为了减少您的攻击面。
【讨论】:
当我不希望人们轻松访问正在传递的内容时,我使用 POST,当我不介意他们看到 url 中的值时,我使用 GET。我通常不经常使用 cookie,因为我发现 SESSION 可以很好地保存值(尽管拥有适当的注册表是利用它的最佳方式)。
【讨论】:
我会说永远不会。
如果我想通过各种方法设置某些内容,我会为每个方法编写代码以提醒自己我已经这样做了 - 否则您可能会在不知不觉中被覆盖。
不应该是这样的吗:
$_GET = 非破坏性操作(排序、记录操作、查询)
$_POST = 破坏性操作(删除、更新)
$_COOKIE = 琐碎设置(样式表首选项等)
$_SESSION = 重要设置(用户名、登录?、访问级别)
【讨论】:
有时您可能希望以多种不同的方式调用同一个脚本。我想到了表单提交和 AJAX 调用。然而,在大多数情况下,最好是明确的。
另外,请参阅http://docs.php.net/manual/en/ini.core.php#ini.request-order,了解如果发生名称冲突,不同来源的变量如何相互覆盖。
【讨论】:
当您不确定值的填充位置或同时使用它们并希望通过 POST 和 GET 方法遍历所有值时。
【讨论】: