慎用PHP $_REQUEST数组
我平时总是喜欢用$_REQUEST这个数组,不是因为别的,简单,而且想用GET时候就用GET直接测试即可。还可以把URL打出来,很是方便。从而很少用$_GET和$_POST超全局变量。
不过,从今以后我会尽量不再使用$_REQUEST这个数组,因为以前对这个数组有些一知半解,总以为用起来简单,并且随心所欲,和$_GET与$_POST一样,而且由系统为我判断,多好。下面我就来简单的介绍一下为何不应该使用$_REQUEST这个数组。
我们都知道,处理表单数据,可以使用PHP的$_GET和$_POST这两个超全局变量,具体是哪个由form表单提交时的method指定。除此之外PHP还为我们提供了$_REQUEST数组。但是其不仅包含$_GET和$_POST的所有数据元素,同时其还会包含$_COOKIE这个超全局数组的所有数据元素。
可是大家有没有想过,如果这三个数组里面的key相同,那么我用$_REQUEST得到的到底是哪个数组的值呢?会不会有什么问题?
我用如下代码为大家做演示,因为只是想说明问题,所以这里面不对$_COOKIE进行设置,请大家自行处理:
var_dump($_GET['a'],$_POST['a'],$_REQUEST['a']);
?>
<html>
<head><title>demo</title></head>
<body>
<form method= 'post' action = 'req.php?a=xxx'>
<input type='hidden' name='a' value='yyy'/>
<input type='submit' name='submit' value='submit'/>
</form>
</body>
</html>
当我提交表单的时候,我获取的页面内容为:
同样的内容,在$_REQUEST里面,POST的值覆盖了GET的值,这到底是怎么回事呢?
其实这是在PHP的配置文件里面设置的,让我们来看一下php.ini这个配置文件,在第466行左右有如下内容:
; Environment and Built-in variables (G, P, C, E & S respectively, often
; referred to as EGPCS or GPC). Registration is done from left to right, newer
; values override older values.
variables_order = "EGPCS"
这个EGPCS就是说明用$_REQUEST数组获取内容的优先级,其字母的含义分别代表为:E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SESSION。后面出现的数据会覆盖前面写入的数据,其默认的数据写入方式就是EGPCS,所以POST包含的数据将覆盖GET中使用相同关键字的数据。
所以为了避免此问题,我们应该明确的使用$_GET和$_POST全局变量,在要用到$_REQUEST 的时候想一下,是不是真的需要用$_REQUEST,为什么提交的方式不是固定的,这样设计程序是否有问题?是否是设计过度,也许我们为了可扩展性却导致了意想不到的问题发生,这显然是不值得的,而且提交方式只能有一种,为什么要考虑两种情况呢?
这里同时给大家两个建议:
1. 尽量不要设置全域的cookie,如果不是必须的话
2. 建议不使用Request 方法来获取变量
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/08/18/1381/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
什么都不说,先把沙发占领了!
[回复]
@JiaCheng
大晚上也不睡觉。呵呵。
[回复]
学习了,$_REQUEST一般不用,貌似用$_POST和$_GET打的字更少一些
$_REQUEST先接受get值xxx,在接受post值yyy,这样就POST的值覆盖了GET的值
$_ENV是什么东东?
[回复]
@beetea
$_ENV 是环境变量。
[回复]
@simaopig
倒,php预定义变量,没用过就忘记了
$_ENV:执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS 数组(依然有效,但反对使用)。
[回复]
@beetea
我这个用的也不多。很少用。呵。
[回复]
当年ASP时就坚持Request.Form(“”)或Request.Query(“”),从不Request(“”)
所以现在也只$_GET[]或$_POST[]
明确的知道自己要取得的值是POST还是GET的
[回复]
@JetKing
是啊.$_REQUEST一不小心就会让你困扰..
[回复]
瞎扯吧你,“其默认的数据写入方式就是EGPCS,所以POST包含的数据将覆盖GET中使用相同关键字的数据。” GET优先级大还POST覆盖GET数据!
[回复]
simaopig 回复:
七月 15th, 2011 at 12:47 下午
后面的会覆盖前面的,GET怎么会比POST优先级高?
[回复]
657 ; This directive determines which super global arrays are registered when PHP
658 ; starts up. If the register_globals directive is enabled, it also determines
659 ; what order variables are populated into the global space. G,P,C,E & S are
660 ; abbreviations for the following respective super globals: GET, POST, COOKIE,
661 ; ENV and SERVER. There is a performance penalty paid for the registration of
662 ; these arrays and because ENV is not as commonly used as the others, ENV is
663 ; is not recommended on productions servers. You can still get access to
664 ; the environment variables through getenv() should you need to.
665 ; Default Value: “EGPCS”
666 ; Development Value: “GPCS”
667 ; Production Value: “GPCS”;
668 ; http://www.php.net/manual/en/ini.core.php#ini.variables-order
669 variables_order = “GPCS”
这是我的php.ini中的内容,优先级不是G P C S ?
[回复]
还取决于request_order的定义哦!
[回复]