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 相关文章推荐
安装APACHE
Jan 15 PHP
php下判断数组中是否存在相同的值array_unique
Mar 25 PHP
php 静态页面中显示动态内容
Aug 14 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 PHP
使用URL传输SESSION信息
Jul 14 PHP
php的闭包(Closure)匿名函数初探
Feb 14 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
PHP程序员的技术成长规划
Mar 25 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 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
星际争霸秘籍
2020/03/04 星际争霸
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php ci框架验证码实例分析
2013/06/26 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
prototype class详解
2006/09/07 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
2016/05/05 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
Python contextlib模块使用示例
2015/02/18 Python
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
python reduce 函数使用详解
2017/12/05 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
详解Python学习之安装pandas
2019/04/16 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
自主实习接收函
2014/01/13 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
2014年接待工作总结
2014/11/26 职场文书
小学科学课教学反思
2016/02/23 职场文书
思想品德课教学反思
2016/02/24 职场文书
亲情作文之母爱
2019/09/25 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python