php中$_REQUEST变量用法细节分析

发布时间:2020-09-28编辑:脚本学堂
有关php中$_REQUEST变量的用法,php中$_RQUEST变量细节,使用php中$_REQUEST变量时的一些注意事项,以及php $_REQUEST变量处理cookie数据的实例教程。

一、php中$_RQUEST变量细节

5.3.0 引入 request_order。该指令会影响 $_REQUEST 的内容。
4.3.0 $_FILES 信息被从 $_REQUEST 中移除。
4.1.0 引入 $_REQUEST。

在使用php中$_REQUEST变量时的一些注意事项:

1、在php中脚本运行期间,如果认为的更改了$_GET和$_POST元素,并不会影响$_REQUEST元素。

例子:
 

复制代码 代码示例:
<?php
$_GET['foo'] = 'a';
$_POST['bar'] = 'b';
var_dump($_GET); // Element 'foo' is string(1) "a"
var_dump($_POST); // Element 'bar' is string(1) "b"
var_dump($_REQUEST); // Does not contain elements 'foo' or 'bar'
?>

2、在$_REQUEST是可以在php.ini文件中进行配置的!配置的项,主要起到了两个作用,
第一、决定了$_REQUEST中究竟包含什么元素
第二、这些元素的优先级,级别是从左向右越来越高!当发生参数同名的情况时,级别高的将会覆盖级别低的!
默认情况下,php.ini文件中的默认选项如下:request_order = "GP",也就是,并不包含COOKIE,如果我们希望他包含COOKIE的话,就将其改为request_order="GPC";

3、可以认为的定一个同$_REQUEST数组类似的数组,我们可以过$_SERVER['REQUEST_METHOD']方式来确定请求的方式,来决定向数组中添加哪些元素!

二、php中$_REQUEST变量用法

这个变量是"默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。"

测试:
 

$_COOKIE['name'] = "aaa";
print_r($_REQUEST);

输出结果:
Array ( ) 

并没有取到cookie的内容呀,手册写错了?再看手册,下面有一行:
5.3.0 引入 request_order。该指令会影响 $_REQUEST 的内容

php版本是5.3.17,打开php.ini,找到了这个request_order:
; This directive determines which super global data (G,P,C,E & S) should
; be registered into the super global array REQUEST. If so, it also determines
; the order in which that data is registered. The values for this directive are
; specified in the same manner as the variables_order directive, EXCEPT one.
; Leaving this value empty will cause PHP to use the value set in the
; variables_order directive. It does not mean it will leave the super globals
; array REQUEST empty.
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
; http://php.net/request-order
request_order = "GP"

翻译:
这条指令确定了哪些超全局数据该被注册到超全局数组REQUEST中,这些超全局数据包括G(GET),P(POST),C(COOKIE),E(ENV),S(SERVER)。这条指令同样指定了这些数据的注册顺序,换句话说GP和PG是不一样的。注册的顺序是从左至右,即右侧的值会覆盖左侧的。比如,当设置为GPC时,COOKIE > POST > GET,依次覆盖。如果这个项被设置为空,php将会使用指令variables_order的值来指定。

如果将php.ini中的request_order设置为"GPC"后,运行以下程序post.php查看结果:
 

复制代码 代码示例:
<?php
error_reporting(0);
setcookie("value", "cookie", time()+3600);
echo "===GET===<br />";
echo $_GET['value'] . "<br />";
echo "===POST===<br />";
echo $_POST['value'] . "<br />";
echo "===COOKIE===<br />";
echo $_COOKIE['value'] . "<br />";
echo "===REQUEST===<br />";
echo $_REQUEST['value'] . "<br />";
?>
<form method="post" action="?value=get">
    <input type="text" name="value" value="post"/>
    <input type="submit" value="submit"/>
</form>
点了提交按钮后会出现下面的结果:
===GET===
get
===POST===
post
===COOKIE===
cookie
===REQUEST===
cookie
 

可以看到cookie的值被取到了。
为了使程序兼容更多的版本,不要在程序中使用$_REQUEST这个超全局变量

当程序确实需要接收get和post过来的参数时,可以用以下方法代替:
$_REQ = array_merge($_GET, $_POST);

完整的程序:
 

复制代码 代码示例:
<?php
error_reporting(0);
setcookie("value", "cookie", time()+3600);
 
$_REQ = array_merge($_GET, $_POST);
 
echo "===GET===<br />";
echo $_GET['value'] . "<br />";
echo "===POST===<br />";
echo $_POST['value'] . "<br />";
echo "===COOKIE===<br />";
echo $_COOKIE['value'] . "<br />";
echo "===REQUEST===<br />";
echo $_REQ['value'] . "<br />";
?>
<form method="post" action="?value=get">
    <input type="text" name="value" value="post"/>
    <input type="submit" value="submit"/>
</form>
当点击提交后,输出结果:
===GET===
get
===POST===
post
===COOKIE===
cookie
===REQUEST===
post

另外,要判断用户到底是post还是get请求的页面,最好是用$_SERVER['REQUEST_METHOD'] 来判断。