PHP中使用php://input处理相同name值的表单数据


Posted in PHP onFebruary 03, 2015

在去年10月份,我在博客中分析了php接收前台name值相同的表单提交数据的处理的问题,当时说的方案是为把name值改成数组类型,php接收到之后,再对数组进行合并处理。这样做的缺点就是不完全兼容前台表单,用户必须要对表单作出更改,而系统需求是所有升级对用户完全透明,所以说这种方式还是不够完美。

经过差不多一年时间的沉淀,发现php提供原始的访问输入/输出流的方法,POST的数据可以通过php://input来获取:

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是无效的。

php://input 打开的数据流只能读取一次; 数据流不支持 seek 操作。 不过,依赖于 SAPI 的实现,请求体数据被保存的时候, 它可以打开另一个 php://input 数据流并重新读取。 通常情况下,这种情况只是针对 POST 请求,而不是其他请求方式,比如 PUT 或者 PROPFIND。

所以用php获取相同name值的表单数据的思路可以是这样,1,通过php://input获取原始的POST数据; 2,对数据进行处理合并; 3, 重新把处理过的值赋给系统变量$_POST; 下面是定义的一个函数:

function GET_SUBMIT(){
 if(empty($_POST)) return $_POST;
 //判断提交类型
 if($_SERVER["HTTP_CONTENT_TYPE"] != 'application/x-www-form-urlencoded'){
 return $_POST;
 }
 //获取POST原始值
 $data= file_get_contents("php://input");
 if(empty($data)) return $_POST;
 //开始处理
 $POST=array();
 $list=explode('&',$data);
 foreach($list as $key=>$value){
 //获取POST的KEY和Value值
 $postname=urldecode(substr($value,0, stripos($value,"=")));
 $postvalue=urldecode(substr($value,(stripos($value,"=")+1)));
 //对KEY值和Value值进行处理
 //去空格和[]
 $postname=trim($postname,' ,[,]');
 $postvalue=trim($postvalue);
 if(array_key_exists($postname,$POST)){
  $POST[$postname]=$POST[$postname]." ,".$postvalue;
 }else{
  $POST[$postname]=$postvalue;
 }
 }
 return $POST;
}

接下来只要在需要的地方使用”$_POST=GET_SUBMIT()”, 后面就可以通过$_POST来获取处理之后各个表单的数据。

PHP 相关文章推荐
用PHP动态创建Flash动画
Oct 09 PHP
mysql下创建字段并设置主键的php代码
May 16 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
PHP之autoload运行机制实例分析
Aug 28 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
yii分页组件用法实例分析
Dec 28 PHP
PHP的PDO操作简单示例
Mar 30 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
Feb 03 #PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 #PHP
php上传中文文件名乱码问题处理方案
Feb 03 #PHP
php上传文件常见问题总结
Feb 03 #PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 #PHP
php对象在内存中的存在形式分析
Feb 03 #PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 #PHP
You might like
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
js实现表格数据搜索
2020/08/09 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
Python数据库小程序源代码
2019/09/15 Python
python中对_init_的理解及实例解析
2019/10/11 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
新郎婚宴答谢词
2014/01/19 职场文书
家教广告词
2014/03/19 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书