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 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
php 获取完整url地址
Dec 20 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
php+Ajax处理xml与json格式数据的方法示例
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更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
初识laravel5
2015/03/02 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
python自动格式化json文件的方法
2015/03/11 Python
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
python 数据的清理行为实例详解
2017/07/12 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android