在去年10月份,我在博客中分析了,当时说的方案是为把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; 下面是定义的一个函数:
$value){
//获取POST的KEY和Value值
$postname=urldecode(substr($value,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来获取处理之后各个表单的数据。
原文链接:https://www.f2er.com/php/22720.html