对POST数据实现自动过滤和自动完成

有一个如下的表单:





该表单源码

<form action="" method="post">
	商品名:<input type="text" name = "goodsname"/><br/>
	价格:<input type="text" name = "goodsprice"/> 元<br/>
	精品<input type="checkbox" name="is_hot" value="1">  
	新品<input type="checkbox" name="is_new" value="1">  
	热销<input type="checkbox" name="is_best" value="1"><br/>
	<input type="submit"/>
</form>



现在要把数据插入到如下的数据库:注意:这个表并不需要价格之类的信息




但是,当submit数据时,$_POST接收的数据里并没有收到没打勾的checkbox信息,也没有商品的add_time时间戳信息




这时就需要我们手动对post数据进行处理:

$data = array();
$data['goodsname'] = trim($_POST['goodsname']);
$data['is_best'] = isset($_POST['is_best']) ? 1 : 0;
$data['is_new'] =isset($_POST['is_new']) ? 1 : 0;
$data['is_hot'] =isset($_POST['is_hot']) ? 1 : 0;
$data['add_time'] = time();



但是当要提交的数据数据越来越多时,我们这种手工方法耗时费力,于是我们可以弄个自动完成post的Model类

class Model{
	protected $_auto = NULL;
	protected $fields = NULL;
	/**
	*自动过滤 过滤数据库表中没有的字段
	*post过来的数据很多,但有时候某些表就只需要post过来的个行数据而已
	*@param $array array $_POST数据
	*@return $data array 某一表只需要的那些POST数据
	*/
	public function _facade($array=array()) {
        $data = array();
        foreach($array as $k=>$v) {
            if(in_array($k,$this->fields)) {  // 判断$k是否是表的字段
                $data[$k] = $v;
            }
        }

        return $data;
    }

    /**
    *自动填充 自动完成checkbox没选中的值 add_time这些表单不需要的数据
    *@param $data array 过滤后的POST
    *@return $data array 自动添加没有数据库需要的值,但是POST并没有的
    */
    public function _autoFill($data){
    	foreach ($this->_auto as $k => $v) {
    		if(!array_key_exists($v[0], $data)){
    			switch ($v[1]) {
    				case 'value':
    					$data[$v[0]] = $v[2];//把默认值赋过来
    					break;
    				case 'function':
    					$data[$v[0]] = call_user_func($v[2]);
    					//也可以使用php的动态调用函数$v[2]();
    					break;
    				default:
    					# code...
    					break;
    			}
    		}
    	}
    	return $data;
    }
}



之后就可以新建一个GoodsModel继承Model来使用预先定义好的模板

class GoodsModel extends Model{
	protected $fields = array('goodsname','is_best','is_new','is_hot','add_time');
	protected $_auto = array(
			array('is_hot','value',0),
			array('is_new','value',0),
			array('is_best','value',0),
			array('add_time','function','time')
	);
}

$goods = new GoodsModel();
$data = $goods->_autoFill($goods->_facade($_POST));



看一下自动过滤和自动完成对数据的演变过程






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值