去年10月份,我在博客中分析过 《PHP接收前台name值相同的表单提交数据的处理》 问题。当时采用的方案是把相同的name值改成数组类型,PHP接收到数据之后,再对数组进行合并处理。
这样做的缺点是不能完全兼容原来的前台表单,用户必须对表单作出修改。而系统的需求是,所有升级都应该对用户透明,所以这种方式还是不够完美。
经过差不多一年的使用和思考,发现PHP提供了直接访问原始输入数据的方法,可以通过 php://input 获取POST提交的原始数据。
php://input是一个可以访问请求原始数据的只读流。在POST请求的情况下,可以使用php://input获取原始请求数据。需要注意的是,当enctype="multipart/form-data"时,不能使用这种方式获取表单数据。
所以,处理相同name值表单数据的思路可以调整为:
- 通过
php://input获取原始POST数据; - 对原始数据进行解析和合并;
- 将处理后的结果重新赋值给
$_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接收到的原始POST数据进行处理,对于需要兼容旧系统或已有表单的情况会更加方便。
评论0
欢迎分享你的看法,也欢迎补充不同的实践经验。