PHP变量解析顺序variables_order
转载自:http://blog.csdn.net/knight0450/article/details/4291556
故事从一个有点诡异的BUG开始,后台一个使用频率不是很高的广告提交功能有时候会莫名其妙的发生提交的链接网址出错的问题。
由于提交后并没有告知该次提交的链接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设置,使自己总是能得到想要获取的提交数据。
PHP变量解析顺序variables_order的更多相关文章
- JavaScript解析顺序和变量作用域
JavaScript基础之变量作用域. 一. 1.全局变量:全局变量的意思就是,在代码的不论什么地方都能够訪问到.注意:未定义 直接赋值的变量拥有全局属性. 2.局部变量:局部变量的意思就是,变量的作 ...
- SELECT的解析顺序及慢查询优化
标准的 SQL 的解析顺序为:(1)FROM 子句, 组装来自不同数据源的数据(2)WHERE 子句, 基于指定的条件对记录进行筛选(3)GROUP BY 子句, 将数据划分为多个分组(4)使用聚合函 ...
- js的解析顺序 作用域 严格模式
一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a); 2 var a = 1; 如果执行顺序是从上到 ...
- javascript的解析顺序
一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a);2 var a = 1;如果执行顺序是从上到下的 ...
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...
- Python的方法解析顺序(MRO)[转]
本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...
- 调整static变量初始化顺序的一个办法
// wrap the LaunchDir variable in a function to work around static/global initialization order stati ...
- bash环境变量读取顺序
bash环境变量读取顺序: 交互式登录的用户: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bas ...
随机推荐
- Linux命令-查看进程命令:pstree
查看进程树,ps aux查看进程,如果进程太多看起来很不方便,可以使用pstree以树形方式显示正在运行的所有进程 pstree -p 查看进程树 还是太多了,可以使用管道符进行查找httpd(apa ...
- Linux内存初始化(一)
一.前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众.另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成 ...
- Javascript变量名混淆细节
前言 UglifyJS会对JS文件的变量名进行混淆处理.要理解Javascript变量混淆的细节.我们须要回答下面几个问题: 1.遇到一个变量myName,我们怎么知道这个myName变量要不要混淆 ...
- django web 笔记
安装 django pip install django 创建虚拟环境 python -m venv testenvironment 进入虚拟环境: testenvironment\Script ...
- Nginx访问PHP文件的File not found错误处理,两种情况
这个错误很常见,原有有下面两种几种 1. php-fpm找不到SCRIPT_FILENAME里执行的php文件 2. php-fpm不能访问所执行的php,也就是权限问题 第一种情况 可以在你的loc ...
- haproxy 制作使用ssl
http://www.oschina.net/translate/haproxy-ssl-termation-pass-through
- angular.js ng-repeat动态插入删除dom节点
既然上面提到 angular.js 下无需用户直接操作dom ,而是在编译间断 dom 与 控制层model 实现了双向绑定,一方做出改变,另一方就会立即改变,那问题来了,我想插入一个文本框和按钮,并 ...
- Windows Azure Mobiles Services实现client的登录注冊
下文仅仅是简单实现,client以Android端的实现为例: 用户表Account: package com.microsoft.ecodrive.model; public class Accou ...
- μCOS-II系统之事件(event)的使用规则及Semaphore实例
**************************************************************************************************** ...
- java.lang.IllegalStateException:Fragment XXXFragment{409864b0} not attached to Activity
现象: 这类bug产生的现象就是在Fragment还没添加到Activity中时,去调用了Fragment的getResources().getString(R.string.xxx)这样的函数. 原 ...