数字营销 · Web开发 · 基础设施

PHP处理相同name值的表单数据

PHP默认处理相同name值的表单数据时可能会丢失部分内容。本文通过php://input获取原始POST数据,并重新解析合并,实现对旧表单的兼容处理。

去年10月份,我在博客中分析过 《PHP接收前台name值相同的表单提交数据的处理》 问题。当时采用的方案是把相同的name值改成数组类型,PHP接收到数据之后,再对数组进行合并处理。

这样做的缺点是不能完全兼容原来的前台表单,用户必须对表单作出修改。而系统的需求是,所有升级都应该对用户透明,所以这种方式还是不够完美。

经过差不多一年的使用和思考,发现PHP提供了直接访问原始输入数据的方法,可以通过 php://input 获取POST提交的原始数据。

php://input 是一个可以访问请求原始数据的只读流。在POST请求的情况下,可以使用 php://input 获取原始请求数据。需要注意的是,当 enctype="multipart/form-data" 时,不能使用这种方式获取表单数据。

所以,处理相同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接收到的原始POST数据进行处理,对于需要兼容旧系统或已有表单的情况会更加方便。

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。