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数组函数
Aug 18 PHP
php替换超长文本中的特殊字符的函数代码
May 22 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
Nov 07 PHP
php jsonp单引号转义
Nov 23 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
学习PHP session的传递方式
Jun 15 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 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上传图片、删除图片实现代码
2010/05/12 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
Angular2库初探
2017/03/01 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
详解python调用cmd命令三种方法
2019/07/08 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
如何在sublime编辑器中安装python
2020/05/20 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
家庭财产分割协议书范本
2014/11/24 职场文书
工人先进事迹材料
2014/12/26 职场文书
小学推普周活动总结
2015/05/07 职场文书
《少年闰土》教学反思
2016/02/18 职场文书