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 相关文章推荐
分页显示Oracle数据库记录的类之二
Oct 09 PHP
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
php异常处理方法实例汇总
Jun 24 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
浅析PHP数据导出知识点
Feb 17 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 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时间戳使用实例代码
2008/06/07 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Vue中使用sass实现换肤功能
2018/09/07 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python生成圆形图片的方法
2020/03/25 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
浅谈django的render函数的参数问题
2018/10/16 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
群众路线教育实践活动实施方案
2014/10/31 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
MySQL触发器的使用
2021/05/24 MySQL