PHP中使用php://input处理相同name值的表单数据
在去年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;下面是定义的一个函数:
functionGET_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($listas$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来获取处理之后各个表单的数据。