文章大纲

php表单提交出现奇怪数据导致model保存失败,看看array_intersect_key方法的妙用

2020-02-24 20:54:58

最近做一个相册表单提交,例如我提交的数据如下:

array(7) { 
["form_token"]=> string(2) "ok" 
["album_name"]=> string(6) "ldjsfl" 
["album_des"]=> string(0) "" 
["album_sort"]=> string(0) "" 
["o"]=> string(1) "k" 
["l"]=> string(1) "d" 
[""]=> string(0) "" 
}

其中最后3个数据,完全不知道是怎么跑出来的。


实在没找到原因,只好先在后台手动过滤。


大致可以看出后面3个数据是由前面3个数据的值演变而来的,如果去一个个将前面3个元素值的第一个字符截取出来,再从数组中unset掉,虽然也可以实现,但这种方式未免太不优雅了,而且当表单值填写了中文时,还不知道后面3条数据的key值会出现什么难以预测的乱码。


废话不多说了,我就说说我的解决办法吧。


本人用的无名框架,所以大家看个大致思想就好。


第1步:

在AlbumModel里添加一个fillable属性,元素对应album数据库表列名。

//album.model.php
class AlbumModel extends Model{

    protected $fillable = [
    'album_id',
    'album_name',
    'album_desc',
    'album_sort',
    'album_cover',
    'upload_time',
    'is_default',
    'status'
    ];
...
}


第2步:

在父类Model里添加fillable属性,以及获取子类fillable属性值的方法。

//model.php
class Model{ 
    protected $fillable;

    public function getFillableFields(){
        return $this->fillable;
    }
    ...
}


第3步:

在接收表单提交数据的地方,通过fillable属性来过滤掉其它不是数据库列的栏位。

$post_data = array_intersect_key($post_data, array_flip($model_album->getFillableFields()) );

一行到位,你说优雅不优雅。


这样子只要fillable填写的栏位都在数据库里,表单再怎么出现其它脏数据,都无所谓了。


本文为翟码农个人博客蓝翟红尘下php分类有关过滤表单脏数据的原创技术文章,转载请注明出处:http://www.zhai14.com/blog/how-to-deal-with-a-form-submit-with-redundant-data-in-php.html。



我要评论
评论列表