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中调用JAVA
Oct 09 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
php数组去重的函数代码
Feb 03 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
php跨域cookie共享使用方法
Feb 20 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
PHP+JavaScript实现无刷新上传图片
Feb 21 PHP
PDO::errorCode讲解
Jan 28 PHP
PHP项目多语言配置平台实现过程解析
May 18 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
如何更好的编写js async函数
2018/05/13 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
python中的set实现不重复的排序原理
2018/01/24 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
python asyncio 协程库的使用
2021/01/21 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
酒店应聘自荐信
2013/11/09 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
2014年少先队工作总结
2014/12/03 职场文书
人力资源部岗位职责
2015/02/11 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
丧事答谢词大全
2015/09/30 职场文书