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 动态执行带有参数的类方法
Apr 10 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
php中用数组的方法设置cookies
Apr 21 PHP
关于Zend Studio 配色方案插件的介绍
Jun 24 PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 PHP
php实现搜索类封装示例
Mar 31 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
php连接mysql数据库
Mar 21 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
禁止直接访问php文件代码分享
May 05 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
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
smarty中post用法实例
2014/11/28 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
php两种无限分类方法实例
2015/04/21 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
js获取页面description的方法
2015/05/21 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
在Python中处理XML的教程
2015/04/29 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
Python实现控制台进度条功能
2016/01/04 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Django模板Templates使用方法详解
2019/07/19 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
美国羊皮公司:Overland
2018/01/15 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
校园文化建设方案
2014/02/03 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书