为什么要在PHP中合并$_GET和$_POST?

10

我在学习WordPress源代码(PHP)时看到了这段代码,你可以看到他们将所有的GET和POST值合并/转换为一个请求数组。

现在据我所知,通过调用$_REQUEST就已经可以访问$_GET和$_POST了而不需要使用array_merge()函数,那么为什么他们要这样做呢?

$_REQUEST = array_merge($_GET, $_POST);
4个回答

20
那是因为默认情况下$_REQUEST$_GET$_POST$_COOKIE的合并。此外,这些superglobals变量合并到$_REQUEST中的顺序取决于ini设置variables_order,并且自PHP 5.3.0以来还可以受到request_order的影响。
所以我猜开发者想要确保$_REQUEST仅由$_GET$_POST组成,并按特定顺序合并,如果他无法访问ini设置(例如在共享主机上)。你知道,variables_orderrequest_order不能针对每个脚本进行配置。
希望对你有帮助。

6

$_REQUEST 默认包含 $_GET$_POST$_COOKIE 数组的内容。也许他们想要从中排除 COOKIE 变量,因为它通常不用于这个目的。


是的,也许出于安全原因,他们想从 $_REQUEST 中消除 COOKIES,以便能够同时使用 GET 和 POST。对于这个伟大的思维方式,点赞 +1。 - mauris
是的,这是一种常见的XSS攻击向量,因为恶意JavaScript可以在用户不知情的情况下设置cookie变量,并且PHP的默认GPC顺序意味着这些cookie值将覆盖用户输入表单中的任何内容。 - joelhardi

2

如果您拥有一个具有相同名称的GET变量和POST变量,那么它将选择POST变量而不是GET变量。

此外,您可能不希望在$_REQUEST变量中使用Cookies。


2
实际上,它会选择 $_POST 而不是 $_GET。array_merge 手册:http://www.php.net/manual/zh/function.array-merge.php - Havenard
[...] 它会选择 GET 变量而不是 POST 变量。这并不正确;实际上是相反的。具有相应键的后一个数组的值将覆盖前一个数组的值。请参见 http://www.php.net/array_merge - Decent Dabbler

1

我不知道你看到的情况具体原因,但我曾经看到过这种情况。当对一个数组中的值进行了一些处理,并且希望将这些更改合并回 $_REQUEST 中时,就可以这样做,以便使用 $_REQUEST 的任何人都可以获得更改,即使它们是对 $_POST 或 $_GET 变量进行的。

出现这种情况的原因是像 Wordpress 这样的情况,因为插件开发人员可能使用其中任何一个变量来访问数据,而 Wordpress 核心需要确保它们都获取相同的数据。

为什么不直接对 $_REQUEST 进行操作呢?因为 $_REQUEST 包含大量额外的信息,$_POST 和 $_GET 没有。您可能不希望将处理应用于所有这些额外的位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接