Model.Classs.php

设置初始化参数

<?php
                        /* 精简版Model类*/
/*************************设置初始化参数(需要修改)***************************/
    define('DB_HOST','localhost');
    define('DB_USER','root');
    define('DB_PWD','');
    define('DB_CHARSET','utf8');
    define('DB_NAME','one');
    define('DB_PREFIX','');

    class userModel extends Model{

    }
    $one = new userModel;

使用方法及其规范



/**************使用方法*****************************************
添加: $_POST = array('name'=>'强强','sex'=>1,'age'=>20,'memeda'=>'heiehi');
        if($new->insert($_POST))

修改:  1.  $_POST = array('name'=>'强强','sex'=>1,'age'=>20,'id'=>'3','meme'=>'hehe');
            if($new->update($_POST));
        2.  $new->where('sex=1')->update($_POST);
            if($new->update($_POST))

查询:  $row = $one->where("name like '%{$search}%'")->limit($num,$page)->order('id ASC')->select();
        返回数组

删除:  $new->where('id=1')->delete();
        if($new->delete($_POST));

where, limit,order,  field 查询指定字段  
查询指定字段 $new->field('name')->select();

多表联查 。。。
*********************************************/

代码部分

    class Model{
        //成员属性
        //数据库服务器地址
        protected $host;
        //数据库服务器用户名
        protected $user;
        //数据库密码
        protected $pwd;
        //字符集
        protected $charset;
        //数据库名
        protected $dbname;
        //要操作的表名
        protected $tabName;
        //表前缀
        protected $prefix;
        //要操作的SQL语句
        protected $sql;
        //所有的合法字段。
        protected $field;
        //数据里链接资源
        protected $link = null;
        //定义一个数组 允许调用不存在的方法关键字
        protected $method = array('where','order','limit','field');
        //定义where
        protected $where;
        //定义limit
        protected $limit;
        //定义order
        protected $order;
        //定义一个用户可以查询的指定字段
        protected $fields;
        //定义页
        protected $page;
        //传入当前页
        //protected $nowpage =
        //成员方法
        //构造方法   初始化成员属性
        function __construct($tabName = ''){
            //第一初始化配置相关属性
            $this->host = DB_HOST;
            $this->user = DB_USER;
            $this->pwd = DB_PWD;
            $this->charset = DB_CHARSET;
            $this->dbname = DB_NAME;
            $this->prefix = DB_PREFIX;
            //第二:初始化运行中需要的属性。
            //初始化表名
            if($tabName == ''){
                //没有参数表名, 他有可能继承。 想办法扣出表名
                //get_class() 获取对象的类名
                //标前缀 拼接 获取的表名
                $this->tabName = $this->prefix.strtolower(substr(get_class($this),0,-5));
                //var_dump($a);
            }else{
                $this->tabName = $this->prefix.$tabName;
            }
            //第三:初始化数据库链接
            $this->link = $this->connect();
            //初始化合法字段信息
            $this->field = $this->getField();
        }
        //定义链接数据库的方法
        protected function connect(){
            //第一:链接数据库和选择数据库
            $link = @mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);
            //少一个东西   加 一个判断
            if(!$link){
                //echo 11111;
                return false;
            }
            //第二:设置字符集
            mysqli_set_charset($link,$this->charset);

            return $link;
        }
        //获取合法字段的方法
        function getField(){
            //设置缓存文件的路径
            $cache = './cache/'.$this->tabName.'Cache.php';
            //echo $cache;
            //检测是否缓存过数据库字段
            if(file_exists($cache)){
                //直接读取缓存数据
                return include $cache;
            }else{
                //没有缓存文件, 查询数据库 缓存一次。
                //准备查询的SQL语句
                $sql = "DESC ".$this->prefix.$this->tabName;
                $result = $this->query($sql);
                //将查询到数据字段的结果 缓存起来   写入文件
                return $this->writeField($result);

            }
        }
        //生成缓存的方法 (就是把查询的字段 写入到文件中存储)
        function writeField($data){
            //设置路径
            $cache = './cache/'.$this->tabName.'Cache.php';
            //定义写入文件的数组
            $fields = array();
            //var_dump($data);
            foreach($data as $key=>$val){
                //获取主键
                if($val['Key'] == 'PRI'){
                    $fields['_pk'] = $val['Field'];
                }
                //获取自增键
                if($val['Extra'] == 'auto_increment'){
                    $fields['_auto'] = $val['Field'];
                }
                $fields[] = $val['Field'];

            }
            //var_dump($fields);
            //将$fields数组原样写到文件中
            file_put_contents($cache,"<?php\r\n return ".var_export($fields,true)."\r\n?>");
            return $fields;
        }
        //mysql执行数据的方法,返回数据的方法  执行 查询
        function query($sql){
            //将SQL语句写入到成员属性中  如果一旦报错 可以单独打印SQL语句 帮忙调试
            $this->sql = $sql;
            //定义返回数组变量
            $array = array();
            //发送sql
            $result = mysqli_query($this->link,$sql);
            //清空条件
            $this->clearWhere();
            //判断
            if($result && mysqli_num_rows($result)>0){
                while($row = mysqli_fetch_assoc($result)){
                    $array[] = $row;
                }
                return $array;
            }else{
                return false;
            }
        }
        //mysql执行数据的方法,返回受影响行方法     执行 增 、删、改
        function exec($sql){
            //将SQL语句保存
            $this->sql = $sql;
            //送sql语句
            $result = mysqli_query($this->link,$sql);
            //清空条件
            $this->clearWhere();
            //判断
            if($result && mysqli_affected_rows($this->link)>0){
                //返回受影响航  表示成功
                return mysqli_affected_rows($this->link);
            }else{
                //返回 false
                return false;
            }
        }
        //制作添加数据的方法
        public function insert($data){
            //声明变量
            $keys = '';
            $vals = '';
            //遍历用户传入的数组  将数组 和 sql语句拼接
            foreach($data as $key=>$val){
                //判断当前遍历的下标(字段名)是否在缓存的合法字段中出现
                var_dump($this->field);
                if(in_array($key,$this->field)){
                    //组合字段字符串
                    $keys .= '`'.$key.'`,';
                    $vals  .= "'".$val."',";
                }
            }
            //删除字段字符串中最后一个逗号
            $keys = rtrim($keys,',');
            $vals = rtrim($vals,',');
            //
            //添加数据的SQL语句
            $sql = "INSERT INTO {$this->prefix}{$this->tabName}({$keys}) VALUES({$vals})";
            echo $sql;
            //echo $sql;exit;
            //将SQL语句发送到数据库执行
            return $this->exec($sql);
        }
        //修改数据的方法
        public  function update($data){
            //var_dump($data);
            //定义一个变量
            $update = '';
            $con = '';
            foreach($data as $k=>$v){
                //过滤掉非法字段   过滤掉主键
                if(in_array($k,$this->field) && $k!=$this->field['_pk']){
                    $update .= '`'.$k.'`="'.$v.'",';
                }elseif($k == $this->field['_pk']){
                    $con = '`'.$k.'`="'.$v.'"';
                }
            }
            $update = rtrim($update,',');
            //判断是否有where条件
            if(!empty($this->where)){
                //有条件
                $where = ' WHERE '.$this->where;
            }else{
                //没有条件   拼接成 id = 1;
                $where = ' WHERE '.$con;
            }
            //echo $update;
            $sql = "UPDATE {$this->prefix}{$this->tabName} SET {$update} {$where}";
            //echo $sql;
            return $this->exec($sql);
        }
        //定义一个删除的方法
        function  delete(){
            //给条件  用条件
            if(!empty($this->where)){
                //有删除条件
                $where = ' WHERE '.$this->where;
            }else{
                全删
                $where = '';
                //自己留条活路  必须 给删除的条件
                //return false;
                //如果用户没有传入删除的条件 自动判断get数据中是否有为止键 如果有 则删除该唯一键
                if(!empty($_GET)){
                    //var_dump($_GET);
                    // //在缓存字段中获取主键
                    $id = $this->field['_pk'];
                    // $arr = explode(',',$id);
                    // //键值对调
                    // $fan  = array_flip($_GET);
                    // var_dump($fan);
                    // //取交集
                    // $jiao = array_intersect($arr,$fan);
                    //var_dump($jiao);
                    //第二种方法  遍历
                    foreach($_GET as $k=>$v){
                        if($id == $k){
                            //把当前值存入变量中
                            $val = $v;
                        }
                    }
                    $where = 'WHERE '.$id.'='.$val;
                }
            }


            $sql = "DELETE FROM {$this->prefix}{$this->tabName} {$where}";
            return $this->exec($sql);
        }
        //为多表联合查询备份合法字段
        function r_filed($args){
            $arr = array();
            //2.将多张表的合法字段 缓存
            foreach($args as $k=>$v){
                $this->tabName = $v;
                //初始化合法字段信息
                $arr[] = $this->getField();
            }
            return $arr;
        }
        //多表联合查询   
        function r_select($tabname1,$tabname2){
            //1.如果需要多表联合查询  必须制定表名
            $args = func_get_args();
            //缓存安全字段
            $result =$this->r_filed($args);
            //var_dump($result);
            //var_dump($args);
            //2.拼接表名
            $tabnames = implode(',',$args);
            //3.判断是否需要查询指定的字段
            $fields = '*';
            if(!empty($this->fields)){
                $fields = $this->fields;

            }
            //遍历实参数组 拼接数组 +表名
            foreach($args as $k=>$v){
                //拼接路径 读取 缓存文件信息
                $cache = './cache/'.$v.'Cache.php';
                $arr = include $cache;
                //var_dump($arr);
                foreach($arr as $key=>$val){
                    $num[] = $v.'.'.$val;
                }
            }
            var_dump($num);
            var_dump($fields);
            $keys  = array();
            foreach($fields as $k=>$v){
                // var_dump($v);
                // $a = strchr($v,' as ',true);
                // var_dump($a);
                // 截取字符串 做 判断
                // bumen.name as bname
                if(strchr($v,' as ',true) && in_array(strchr($v,' as ',true),$num)){
                    //合法
                    $keys[] = $v;
                }elseif(in_array($v,$num)){
                    $keys[] = $v;
                }
            }

            //var_dump($num);
            //加条件
            $where = $order = $limit = '';
            if(!empty($this->where)){
                $where = ' WHERE '.$this->where;
            }
            if(!empty($this->order)){
                $order = ' ORDER BY '.$this->order;
            }
            if(!empty($this->limit)){
                $limit = ' LIMIT '.$this->limit;
            }

            //3.安全过滤
            //去交集
            $fields = implode(',',$keys);
            //$fields = implode(',',$field);
            //echo $fields;exit;
            $sql = "SELECT {$fields} FROM {$tabnames} {$where} {$order} {$limit}";
            echo $sql;
            return $this->query($sql);
        }
        //单表查询
        function select(){
            $where = $limit = $order = '';
            //查询的条件
            if(!empty($this->where)){
                $where = ' WHERE '.$this->where;
            }
            if(!empty($this->limit)){
                $limit = ' LIMIT '.$this->limit;
            }
            if(!empty($this->order)){
                $order = ' ORDER BY '.$this->order;
            }
            //用户是否需要查询指定的字段
            if(!empty($this->fields)){
                //过滤安全字段   取数组的交集
                $hefa = array_intersect($this->fields,$this->field);
                //var_dump($hefa);
                $fields = implode(',',$hefa);
            }else{
                $fields = '*';
            }
            $sql = "SELECT {$fields} FROM {$this->prefix}{$this->tabName} {$where} {$order} {$limit}";
            //echo $sql;exit;
            return $this->query($sql);
        }
        //定义一个魔术方法  call  调用一个不存在的方法时自动触发,
        //where()  order()  limit();
        function __call($methodName,$vals){
            if(in_array($methodName,$this->method)){
                if(!empty($vals)){
                    //判断到底是调用哪一个
                    if($methodName == 'where'){
                        if (count($vals)>1) {
                            $this->where = implode(' and ',$vals);
                        }else{
                            $this->where = $vals[0];
                        }
                        //var_dump($this->where);
                    }elseif($methodName == 'order'){

                        $this->order = $vals[0];

                    }elseif($methodName == 'limit'){
                        if(count($vals) > 1){
                            $this->limit = $vals[0].','.$vals[1];
                        }else{
                            $this->limit = $vals[0];
                        }
                    }elseif($methodName == 'field'){

                            //用户需要查询指定字段
                            //var_dump($vals);
                            $this->fields = $vals;
                    }
                }
            }else{
                echo '对不起,您调用的'.$methodName.'方法不存在';
            }
            return $this;
        }
        //获取总条数
        function total(){
            $where = '';
            //会有where
            if(!empty($this->where)){
                $where = ' WHERE '.$this->where;
            }
            //获取主键
            if(isset($this->field['_pk'])){
                $pk = $this->field['_pk'];
            }else{
                $pk = '*';
            }
            $sql = "SELECT COUNT({$pk}) as total FROM {$this->prefix}{$this->tabName} {$where}";
            //echo $sql;
            //var_dump(intval($this->query($sql)[0]['total']));
            return intval($this->query($sql)[0]['total']);
        }
        //清除条件
        function clearWhere(){
            $this->where = null;
            $this->limit = null;
            $this->order = null;
            $this->fields = null;
        }
        //分页
        function fenye($page){
            $this->page = $page;

            $num = ($this->dpage() - 1) * $page;
            $row =$this->limit($num,$page)->select();
            return $row;
        }
        function pageALL(){
            return ceil($this->total() / $this->page);
        }
        function dpage(){
            return isset($_GET['page'])?$_GET['page']:1;
        }
        function prePage(){
            return $this->dpage()-1<=1?1:($this->dpage()-1);
        }
        function nextPage(){
            return  $this->dpage()+1>=$this->pageAll()?$this->pageAll():($this->dpage()+1);
        }
        //错误输出
        function getSql(){
            return $this->sql;
        }
        //析构方法
        function __destruct(){
            if($this->link != null){
                mysqli_close($this->link);
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值