基于PHP MySQLi扩展的数据库操作Model

<?php
/*****************************
Model类(使用MySQL扩展访问数据库)
******************************/
class Model{
    private $table;
    //数据库链接
    private $link;
    //最后一次执行的sql语句
    private $sql;
    private $tableString;
    private $fieldString;
    private $whereString;
    private $orderString;
    private $limitString;

    //初始化类
    public function __construct($tableName){
        $dbinfo=array(
            'hostname'=>'192.168.1.246',
            'username'=>'liuchuan',
            'password'=>'liuchuan123',
            'database'=>'whatcart'
        );
        $this->link=new mysqli($dbinfo['hostname'],$dbinfo['username'],$dbinfo['password'],$dbinfo['database']);
        if($this->link->connect_errno)
            trigger_error('Error:Could not make a database link ('.$this->link->connect_errno.')'.$this->link->connect_errno);
        $this->link->set_charset("utf8");
        $this->fieldString='*';
        $this->tableString=$tableName;
        $this->leftJoinString='';
        $this->whereString='';
        $this->orderString='';
        $this->limitString='';
    }
 

    /********封装的MySQLI扩展方法********/

    //参数过滤,输入参数只能是基本类型或一维数组
    public function escape($param){
        if(is_array($param)){
            foreach ($param as $key => $value) {
                $param[$key]=$this->link->real_escape_string($value);
            }
        }else{
            $param=$this->link->real_escape_string($value);
        }
        return $param;
    }

    //获取插入后生成的ID
    public function getLastId(){
        return $this->link->insert_id;
    }

    //获取影响的行数
    public function countAffected(){
        return $this->link->affected_rows;
    }

    //执行SQL命令返回TRUE或FALSE
    public function execute($sql){
        $this->sql=$sql;
        $result=$this->link->real_query($this->sql);
        if(false===$result){
            trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
            return false;
        }else{
            $sql=strtolower($this->sql);
            return (false===strpos($sql,'insert')?true:$this->link->insert_id;//如果包含insert就返回插入记录的ID
        }
    }

    //执行SQL查询返回关联数组
    public function query($sql){
        $result=$this->link->real_query($sql);
        $this->sql=$sql;
        if($result!==false){
            $record=array();
            $list=array();
            while($record=$result->fetch_assoc()){
                $list[]=$record;
            }
            return $list;
        }else{
            trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
            return false;
        }
    }

    /********单表增删查改********/
    public function create($table,$model){
        $fields='';
        $values='';
        foreach ($model as $key => $value) {
            if($fields){
                $fields.=',';
            }
            $fields.="`$key`";
            if($values){
                $values.=',';
            }
            $values.=is_numeric($value)?$value:"'".$this->link->real_escape_string($value)."'";
        }
        $this->sql="INSERT INTO `$table`($fields) VALUES($values)";
        if(false===$this->link->real_query($this->sql))
            trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
        return $this->link->insert_id;
    }

    public function modify($table,$model,$where){
        $assins='';
        $where=$this->rewhere($where);
        foreach ($model as $key => $value) {
            $rkey=$this->link->real_escape_string($key);
            $rvalue=$this->link->real_escape_string($value);
            if(!is_numeric($rvalue)){
                $rvalue="'".$rvalue."'";
            }
            $assins.=$assins?",`$rkey`=$rvalue":"`$rkey`=$rvalue";
        }
        $result=$this->link->real_query($this->sql);
        if(false===$result)
             trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
    }

    public function remove($table,$where){
        $where=$this->rewhere($where);
        $this->sql="DELETE FROM `$table` WHERE $where";
        $result=$this->link->real_query($this->sql);
        if(false===$result)
             trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
        return $flag;
    }

    public function unique($where){
        $where=$this->rewhere($where);
        $this->sql="SELECT * FROM `$table` WHERE $where LIMIT 1";
        $result=$this->link->real_query($this->sql);
        if($result===false)
            trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
        return $result -> fetch_object();
    }

    public function countRow($where){
        $where=$this->rewhere($where);
        $this->sql=($where=='')?"SELECT COUNT(*) as 'totalRow' FROM `{$this->tableString}`":"SELECT COUNT(*) FROM `{$this->tableString}` WHERE $where";
        $result=$this->link->real_query($this->sql);
        if($result===false)
            trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
        $record=$result->fetch_Object();
        return $record->totalRow;
    }

    //按条件查找函数
    public function search($table,$fields,$leftJoin='',$where='',$order='',$limit=''){
        if(is_array($fields))
            $fields=implode(",",$fields);
        $this->sql=empty($fields)?"SELECT * FROM `$table`":"SELECT $fields FROM `$table`";
        if(!empty($where)){
            $where=$this->rewhere($where);
            $this->sql.=" WHERE $where";
        }
        if(!empty($order))
            $this->sql.=" ORDER BY $order";
        if(!empty($order))
            $this->sql.="LIMIT $limit";
        $result=$this->link->real_query($this->sql);
        if($result===false){
             trigger_error('<br/>ERROR MESSAGE:'.$this->link->error.'<br/>THE SQL:'.$this->sql);
        }else{
            $tempItem=array();
            $tempList=array();
            while($tempItem=$result -> fetch_assoc()){
                if(!empty($tempItem['create_time']))
                    $tempItem['create_time_exp']=date('Y-m-d H:i:s',$tempItem['create_time']);
                if(!empty($tempItem['add_time']))
                    $tempItem['add_time_exp']=date('Y-m-d H:i:s',$tempItem['end_time']);
                if(!empty($tempItem['start_time']))
                    $tempItem['start_time_exp']=date('Y-m-d H:i:s',$tempItem['start_time']);
                if(!empty($tempItem['end_time']))
                    $tempItem['end_time_exp']=date('Y-m-d H:i:s',$tempItem['end_time']);
                $tempList[]=$tempItem;
            };
            return $tempList;
        }
    }

    public function keyIn($ids){
        if(!empty($ids)){
            return false;
        }
        if(is_array($ids)){
            foreach ($ids as $key => $value) {
                $ids[$key]=$this->link->real_escape_string($value);
            }
            $ids=implode(',',$ids);
        }else{
            $ids=$this->link->real_escape_string($ids);
        }
        $primary=$this->getPrimaryKey();
        if(!empty($this->whereString))
            $this->whereString.=" AND ";
        $this->whereString.="`$primary` in ($ids)";
        return $this;
    }


/******************仿ThinkPHP的链式操作*******************************/
    //设置查询的字段
    public function field($field){
        if(is_array($field))
            $field=implode(',',$field);
        $this->fieldString=$field;
        return $this;
    }

    public function table($table){
        $this->tableString=$table;
    }

    public function order($order){
        $this->orderString=$order;
    }

    public function limit($limit){
        $this->limitString=$limit;
    }
    //将数组格式的条件组装成字符串
    public function where($where){
        if(is_array($where)&&count($where)>0){
            $str='';
            foreach($where as $key=>$value){
                if(!empty($str)){
                    $str.=' AND ';
                }
                $rekey=$this->link->real_escape_string($key);
                $revalue=$this->link->real_escape_string($value);
                $str.=is_numeric($revalue)?"`$rekey`=$revalue":"`$rekey`='$revalue'";
            }
            $this->whereString=$str;
        }else{
            $this->whereString=$where;
        }
        return $this;
    }

    //删除
    public function delete(){
        if(empty($this->whereString))
            trigger_error('<br/>ERROR MESSAGE:删除条件不可以是空');
        $this->sql="DELETE FROM {$this->tableString} WHERE {$this->whereString}";
    }

    //更新
    public function update($model){
        if(empty($this->whereString))
            trigger_error('<br/>ERROR MESSAGE:更新条件不可以是空');
        if(empty($model)||count($model)==0)
            trigger_error('<br/>ERROR MESSAGE:更新参数不可以是空')
        $assins='';
        foreach ($model as $key => $value) {
            $rkey=$this->link->real_escape_string($key);
            $rvalue=$this->link->real_escape_string($value);
            if(!is_numeric($rvalue)){
                $rvalue="'".$rvalue."'";
            }
            $assins.=$assins?",`$rkey`=$rvalue":"`$rkey`=$rvalue";
        }
        $this->sql="UPDATE {$this->tableString} SET $assins WHERE {$this->whereString}";
    }

    //查询
    public function select(){
        $this->sql="SELECT {$this->fieldString} FROM {$this->tableString}";
        if(!empty($this->whereString)) $this->sql.=' WHERE '.$this->whereString;
        if(!empty($this->orderString)) $this->sql.=' ORDER BY '.$this->orderString;
        if(!empty($this->limitString)) $this->sql.=' LIMIT '.$this->limitString;
        return $this->query($this->$sql);
    }

    /*开发环境用于调试的语句,生产环境可以删除*/
    public function getSql(){
        return $this->sql;
    }
}


你可能感兴趣的:(基于PHP MySQLi扩展的数据库操作Model)