什么是$ _REQUEST优先级?

时间:2017-04-01 14:13:32

标签: php arrays multidimensional-array

PHP超全局变量

PHP具有全局变量,可以在脚本的任何范围内访问。其中三个变量($_GET$_POST$_COOKIE)存储在第四个变量($_REQUEST)中。

$_GET

  

通过URL参数传递给当前脚本的关联变量数组。

请考虑以下示例,其中发送和访问URL。

http://www.example.com/myPage.php?myVar=myVal
echo $_GET["myVar"]; // returns "myVal"

$_POST

  

当使用application / x-www-form-urlencoded或multipart / form-data作为请求中的HTTP Content-Type时,通过HTTP POST方法传递给当前脚本的关联变量数组。

使用它的一个例子如下。

<form action="somePage.php" method="POST">
    <input type="text" name="myVar" value="myVal" />
    <input type="submit" name="submit" value="Submit" />
</form>
echo $_POST["myVar"]; // returns "myVal"

$_COOKIE

  

通过HTTP Cookies传递给当前脚本的关联变量数组

setcookie("myVar", "myVal", time() + 3600);
echo $_COOKIE["myVar"]; // returns "myVal"

$_REQUEST

  

一个关联数组,默认情况下包含$_GET$_POST$_COOKIE的内容。

这就是

$_REQUEST包含所有三个一个数组,可通过$_REQUEST["myVar"]访问。

随机场景

我们假设,无论出于何种原因,我对$_GET$_POST$_COOKIE使用相同的名称。

$_REQUEST中存储的内容的优先级是什么。

假设我通过URL设置发送的数据,通过表单发布,并设置一个彼此相同名称的cookie(我知道这是一个奇怪的场景)。
假设我使用了名称&#34;示例&#34;。

以下输出的输出是什么?

     if ($_REQUEST["example"] == $_GET["example"])    echo "GET";
else if ($_REQUEST["example"] == $_POST["example"])   echo "POST";
else if ($_REQUEST["example"] == $_COOKIE["example"]) echo "COOKIE";

TL;博士

如果$_GET$_POST$_COOKIE都有一个存储有相同名称的值;哪一个将$_REQUEST以该名称存储?

2 个答案:

答案 0 :(得分:5)

php.ini文件中有2个指令:request_ordervariables_order

  

request_order string

This directive describes the order in which PHP registers GET, POST and Cookie variables
into the _REQUEST array. Registration is done from left to right, newer values override 
older values.

If this directive is not set, variables_order is used for $_REQUEST contents.

Note that the default distribution php.ini files does not contain the 'C' for cookies, 
due to security concerns.

  

variables_order string

Sets the order of the EGPCS (Environment, Get, Post, Cookie, and Server) variable 
parsing. For example, if variables_order is set to "SP" then PHP will create the 
superglobals $_SERVER and $_POST, but not create $_ENV, $_GET, and $_COOKIE. Setting 
to "" means no superglobals will be set.

If the deprecated register_globals directive is on, then variables_order also configures 
the order the ENV, GET, POST, COOKIE and SERVER variables are populated in global scope. 
So for example if variables_order is set to "EGPCS", register_globals is enabled, and both 
$_GET['action'] and $_POST['action'] are set, then $action will contain the value of 
$_POST['action'] as P comes after G in our example directive value.



取自official documentation

答案 1 :(得分:4)

php.ini文件中有一行描述variables_order。例如:

variables_order = "GPC"

G为获取,P为发布,C为Cookie。 在这种情况下,第一个Get变量设置为$_REQUEST,下一个Post变量设置为它,最后一个Cookie变量设置为它。所以优先考虑的是cookie,然后是Post,然后是Get。

您可以更改variables_order文件中php.ini的值,随意更改优先级。

P.S:您可以在variables_order的值中写出G,P,C,S和E. S代表Session,E代表环境变量。

P.S:在PHP 5.3中,在request_order文件中引入了php.ini指令,该指令设置了直接在$_REQUEST数组中设置变量的顺序。