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版
Oct 09 PHP
PHP 高手之路(三)
Oct 09 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
php遍历树的常用方法汇总
Jun 18 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
php头像上传预览实例代码
May 02 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
详解php中流行的rpc框架
May 29 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 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Python缓存技术实现过程详解
2019/09/25 Python
python超时重新请求解决方案
2019/10/21 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
门面房租房协议书
2014/08/20 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
销售员态度差检讨书
2014/10/26 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python