前记
今天测试返回一个API调用接口不对的bug,查看API发现变量是通过$_REQUEST来获取参数的,难道获取方法有问题?
排查
既然有了怀疑,那么我们来打印下变量吧,通过实验发现:
$_REQUEST获取的参数 和URL中的不一致,
为啥会不一致呢,请教了下Google大神,查看ini
的设置,发现1
$ variables_order = "EGPCS";
打印EGPCS时发现cookie 和 get中有相同的变量,原来是cookie中的参数覆盖了get中的参数,囧~
(腹诽:cookie中应该加个前缀啥的吧……):
结论
php版本< 5.3时 会 根据variables_order的设置读取参数;
PHP版本 > 5.3时 会根据request_order的设置读取参数;
PHP version < 5.3时默认读取顺序为:E G P C S,即 :1
$ variables_order = "EGPCS";
variables_order 系统在定义PHP预定义变量,EGPCS 是 Environment, Get, Post, Cookie, and Server
的简写。
这个变量主要是在php执行时,对超级变量创建的设置。EGPCS对应的超级变量为$_ENV
, $_GET
, $_POST
, $_COOKIE
, $_SERVER
。如果variables_order被设置为””,则对应的超级全局变量的值都为空数组。
所以,要想$_REQUEST
包含的预定义变量的值,variables_order必须有对应的设置。例如,variables_order = “G”,则$_REQUEST中肯定不会有post的值。
在register_globals=on
的情况,这个配置的顺序将影响对应变量的值,重复key,后边的会覆盖前边的。1
$ request_order = "PGC"
这个变量,说明$_REQUEST
包含哪些类型的外部数据、数据加载的顺序。这个是有顺序的,如果key重复,后边的就会覆盖前边的值。
比如:
$_GET
里面有个$_GET['id']=2
,$_POST
里有一个$_POST['id'] =3
。
如果request_order = “PG”的形式设置,那么$_REQUEST['id']=2
。
如果request_order = “GP”的形式设置,则$_REQUEST['id']=3
。