有一个如下的表单:
该表单源码
<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));
看一下自动过滤和自动完成对数据的演变过程