燕十八公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it
商城项目(一)
主要包括:仿ThinkPHP写了一个微型框架,把常用的增加改查写到一个Model类中,商品Model和分类Model继承可以直接增删改查方法,因为这些方法都是最基本的,所以放在Model,另外对分类进行了无限级分类,自动过滤,自动完成,自动验证的功能实现。尤其是自动验证功能比较麻烦,对于我这个初学者来说稍微有点难度,还需要自己以后不断的学习。
Model代码
<?php class Model{ protected $table=null;//表名 protected $db=null; protected $pk=null;//主键 protected $fields=array(); protected $_auto=array(); protected $error=array(); function __construct(){ $this->db=mysql::getIns(); $this->fields=$this->getFields(); } //直接执行sql语句 public function query($sql){ return $this->db->query($sql); } //增加,$data为带键值的数组 public function add($data){ $res=$this->db->autoExecute($this->table,$data); if($res){ if($this->db->affected_rows()){ return true; }else{ return false; } }else{ return false; } } //删除,$id为传入的主键值 public function del($id){ $sql='delete from '.$this->table.' where '.$this->pk.'='.$id; $res=$this->db->query($sql); if($res){ if($this->db->affected_rows()){ return true; }else{ return false; } }else{ return false; } } //修改,$data为带键值的数组 public function update($data=array(),$id){ $res=$this->db->autoExecute($this->table,$data,$action='update',$where=$this->pk.'='.$id); if($res){ if($this->db->affected_rows()){ return true; }else{ return false; } }else{ return false; } } //查询所有表数据 public function select(){ $sql='select * from '.$this->table; return $this->db->getAll($sql); } //查询单条表记录,$id为传入的主键值 public function find($id){ $sql='select * from '.$this->table.' where '.$this->pk.'='.$id; return $this->db->getRow($sql); } //获取表中字段名 public function getFields(){ $sql='desc '.$this->table; $res=$this->query($sql); $field=array(); while($row=mysql_fetch_row($res)){ $field[]=$row[0]; } return $field; } //过滤post数组,如果post数组中的键和数组的列名没有对应的,就去掉这个键值对 public function _facade($arr=array()){ $data=array(); foreach($arr as $k=>$v){ if(in_array($k,$this->fields)){ $data[$k]=$v; } } return $data; } //自动完成功能,表中的字段名称如果没有出现在post的键中,就用默认值自动填充 public function _autoFill($data=array()){ 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': $fun=$v[2]; $data[$v[0]]=$fun(); break; } } } return $data; } //自动验证功能,不如长度不符合,必填的没填,类型的检验 /* array('goods_name',1,'商品名不能为空','require'), array('cat_id',1,'类名的值只能是数字','number'), array('is_new',0,'是否新品的值只能是1或者0','in','0,1'), array('goods_dec',2,'描述的长度只能是10-100','length','10,100') */ public function __validate($data){ if(empty($this->_validate)){//没有验证条件存在时即为真 return true; } foreach($this->_validate as $k=>$v){ switch ($v[1]){ case 1: if(!isset($data[$v[0]])){//如果data中的goods_name不存在,直接返回false并记录错误信息 $this->error[]=$v[2]; return false; } if(!$this->check($data[$v[0]],$v[3])){//传入data['goods_name']的值和requre $this->error[]=$v[2]; return false; } break; case 0: if(isset($data[$v[0]])){ if(!$this->check($data[$v[0]],$v[3],$v[4])){//传入data['is_new']的值,in,'0,1' $this->error[]=$v[2]; return false; } break; } case 2: if((isset($data[$v[0]]))&&(!empty($data[$v[0]]))){ if(!$this->check($data[$v[0]],$v[3],$v[4])){//传入data['goods_dec']的值,length,'10,100' $this->error[]=$v[2]; return false; } break; } } } return true; } public function check($value,$rule='',$parm=''){ switch ($rule){ case 'require': return !empty($value); case 'number': return is_numeric($value); case 'in': list($a,$b)=explode(',',$parm); return $value==$a||$value==$b; case 'length': list($a,$b)=explode(',',$parm); return strlen($value)>=$a&&strlen($value)<=$b; default: return true; } } public function getError(){ return $this->error; } //自动完成,自动过滤功能汇总函数 public function create($data){ $data=$this->_facade($data); return $this->_autoFill($data); } }