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如何透过ODBC来存取数据库
Oct 09 PHP
php.ini中的php-5.2.0配置指令详解
Mar 27 PHP
基于MySQL体系结构的分析
May 02 PHP
preg_match_all使用心得分享
Jan 31 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
CodeIgniter记录错误日志的方法全面总结
May 17 PHP
PHP线程的内存回收问题
Jul 08 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
js获取单选按钮的数据
2006/11/27 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
vue实现修改图片后实时更新
2019/11/14 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
Python 学习教程之networkx
2019/04/15 Python
django orm模块中的 is_delete用法
2020/05/20 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
python程序需要编译吗
2020/06/19 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
交通安全演讲稿
2014/01/07 职场文书
庆七一活动方案
2014/01/25 职场文书
论文诚信承诺书
2014/05/23 职场文书
医学专业自荐信
2014/06/14 职场文书
学用政策心得体会
2014/09/10 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
七一晚会主持词
2015/06/29 职场文书
学校团代会开幕词
2016/03/04 职场文书
Python基础详解之邮件处理
2021/04/28 Python
css height属性中的calc方法详解
2021/06/03 HTML / CSS
TS 类型收窄教程示例详解
2022/09/23 Javascript