探讨PHP变量解析顺序如何获取提交数据

开发 后端
PHP变量解析顺序可以帮助我们实现获取自己想要的提交数据。希望大家可以在这篇文章中获得自己想要的知识,提高自己的学识。

PHP的学习并不能局限于书本上的那几段概念就能完全掌握。还需要我们不断的从实践中去深入了解。下面就介绍一下PHP变量解析顺序的实践。故事从一个有点诡异的BUG开始,后台一个使用频率不是很高的广告提交功能有时候会莫名其妙的发生提交的链接网址出错的问题。#t#

由于提交后并没有告知该次提交的链接URL,所以这个BUG一直活到了今天。然而并不是每一次提交都会出现这个BUG,几次测试后发现只有在连续多次提交时发生。由于提交的表单比较复杂,分几部分录入,于是怀疑在中间环节发生错误。

排错的过程先是在各个过程中var_dump($_REQUEST),于是连续第二次提交时找到出错环节,在***个表单提交到第二个表单的过程中,$_REQUEST数组发生改变。到这里,我们有必要再看一下$_REQUEST数组:

手册上讲包含经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。以此将var_dump($_REQUEST)分解成var_dump($_POST),var_dump($_GET),var_dump($_COOKIE),问题就比较清晰了,原来为了便于在多个页面表单间保存值,试用了COOKIE,虽然没有设置expire项的情况下SESSION结束时COOKIE变销毁,但是如果在一次会话中连续提交多个广告,表单POST的值变会被之前保存在COOKIE的值覆盖,而之所以只有部分出错,在于保存到COOKIE的时候COOKIE变量名都加了前缀,除了url这个变量还是使用相同的变量名。

问题找到了,但是又有新的疑问,相同的变量名,为什么是COOKIE覆盖了POST而不是相反呢?于是终于要来到标题讲的variables_order设置项了,php.ini中原文如下:

This directive describes the order in which PHP registers GET, POST, Cookie,
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.

意思是该设置描述PHP解析变量顺序,包括$_GET,$_POST,$_COOKIE,$_ENV ,$_SERVER 数组,
解析顺序从左到右,后解析新值覆盖旧值。默认设定为EGPCS(Environment,GET,POST,Cookie,Server)。
如果将其设为“GP”,会导致 PHP 完全忽略环境变量,cookies 和 server 变量,并用 POST 方法的变量覆盖 GET 方法的同名变量。

结论:

就像手册上讲的,$_REQUEST是个并不值得信任的数组。为了尽量避免类似问题,在获取提交值是应明确使用$_POST或$_GET数组。

特殊情况下可以通过调整variables_order设置,使自己总是能得到想要获取的提交数据。

责任编辑:曹凯 来源: 百度博客
相关推荐

2009-12-10 15:00:20

PHP获取checkb

2009-12-01 18:11:03

PHP表单重复提交

2009-11-30 18:46:51

PHP字符串颠倒顺序

2009-11-30 18:59:52

PHP数组排序

2009-11-23 10:31:25

PHP使用JSON

2009-11-27 15:24:48

PHP递归效率

2009-12-02 09:21:04

PHP数据过滤

2009-12-01 15:48:12

提高PHP运行效率

2009-11-25 16:29:08

PHP删除数组元素

2009-12-01 19:08:18

PHP外部变量

2009-11-30 13:04:38

PHP获取Oracle

2022-05-05 10:10:28

DNS网络

2009-12-11 17:52:21

PHP获取博客数据

2009-11-23 17:16:54

PHP获取IP

2010-06-11 09:46:55

UML顺序图

2013-04-26 11:26:00

2010-07-21 09:38:15

PHP缓存技术

2009-11-30 15:58:13

PHP数学函数

2010-03-15 10:49:57

Python函数变量

2009-12-03 15:31:30

PHP获取显示数据库数
点赞
收藏

51CTO技术栈公众号