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调用mysql存储过程
Feb 14 PHP
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
php5数字型字符串加解密代码
Apr 24 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
PHP Swoole异步读取、写入文件操作示例
Oct 24 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
PHP7 新增功能
Mar 09 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 页面编码声明方法详解(header或meta)
2010/03/12 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP编写简单的App接口
2016/08/28 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
再谈javascript原型继承
2014/11/10 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
PyTorch实现AlexNet示例
2020/01/14 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
妇科医生自荐信
2013/11/05 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
实习生工作证明范本
2014/09/14 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
承诺保证书格式
2015/02/28 职场文书
2015年电工工作总结
2015/04/10 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书