深入理解 PHP $_REQUEST 数组

image description

深入理解 PHP $_REQUEST 数组

因为简单方便,所以我平时总是喜欢用$_REQUEST这个数组,而且想用GET时候就用GET直接测试即可。还可以把URL打出来,很是方便。从而很少用$_GET超全局变量。

    但是,从今天起,我们要对$_REQUEST有一个全新的认识,或许因为以前对这个数组有些一知半解,总以为用起来简单,并且随心所欲,和>$_GET>$_POST一样,而且由系统为我判断,多好。下面我就来简单的介绍一下为何不应该使用$_REQUEST这个数组。

    我们都知道,处理表单数据,可以使用PHP$_GET$_POST这两个超全局变量,具体是哪个由form表单提交时的method指定。除此之外PHP还为我们提供了$_REQUEST数组。但是其不仅包含$_GET和$_POST的所有数据元素,同时其还会包含$_COOKIE这个超全局数组的所有数据元素。

    可是大家有没有想过,如果这三个数组里面的key相同,那么我用$_REQUEST得到的到底是哪个数组的值呢?会不会有什么问题?

我用如下代码为大家做演示,因为只是想说明问题,所以这里面不对$_COOKIE进行设置,请大家自行处理:

当我提交表单的时候,我获取的页面内容为:
1 string(3) "xxx" string(3) "yyy" string(3) "yyy"

同样的内容,在$_REQUEST里面,POST的值覆盖了GET的值,这到底是怎么回事呢?

其实这是在PHP的配置文件里面设置的,让我们来看一下php.ini这个配置文件,在第466行左右有如下内容:

1 ; This directive describes the order in which PHP registers GET, POST, Cookie,
2 ; Environment and Built-in variables (G, P, C, E & S respectively, often
3 ; referred to as EGPCS or GPC).  Registration is done from left to right, newer
4 ; values override older values.
5 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 方法来获取变量

立场声明

立场声明

www.zkbhj.com

1、站内除作者为站长本人的其他所有文章仅代表作者观点,不代表凯冰科技网站立场。

2、凡注明文章类型为“原创”的文章,均系凯冰科技专栏作家原创内容,如需转载请注明编者、出处,并保留文章在凯冰科技博客(blog.zkbhj.com)的完整链接,谢谢。

相关文章推荐

你也许也想看看下面几篇博文

image description

深入理解 PHP $_REQUEST 数组

image description

性能大提升:5个PHP7性能优化技巧

image description
image description
image description
image description
image description
image description
image description