燕十八公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it
商城项目(一)
主要包括:1,商品管理
商品的增加,删除,修改,查询
2,分类管理
分类的增加,删除,修改,查询
仿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);
}
}