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 相关文章推荐
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
php 删除记录实现代码
Mar 12 PHP
php环境套包 dedeampz 伪静态设置示例
Mar 26 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
php封装的验证码类分享
Feb 26 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
php实现每日签到功能
Nov 29 PHP
PHP实现发送微博消息功能完整示例
Dec 04 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 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的可变变量名的使用方法分享
2012/02/05 PHP
php实现简单爬虫的开发
2016/03/28 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
教你安装python Django(图文)
2013/11/04 Python
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python isinstance函数介绍
2015/04/14 Python
python从入门到精通(DAY 1)
2015/12/20 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
啤酒销售实习自我鉴定
2013/09/24 职场文书
服装公司总经理岗位职责
2013/11/30 职场文书
企业行政文员岗位职责
2013/12/03 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
Python如何使用循环结构和分支结构
2022/04/13 Python