一个数据库类

时间:2022-06-01 13:01:42

由于尚未知道使用哪种数据库这里应该编写一个数据库抽象类

abstract class db {
    /*
    parms $h服务器地址
    parms $u 用户名
    */
    public abstract function connect($h,$u,$p,$dbname);
    /*返回bool/resource*/
    public abstract function query($sql);
    /*单行数据*/
    public abstract function getRow($sql);
    /*单挑数据*/
    public abstract function getOne($sql);
    
    public abstract function autoExecute($table,$data,$act="insert",$where="");

}
/*一个基本的数据库应该包含主连接的数据库的主机名 账号 密码 数据库 编码字
符 以及用一个私有静态变量作为保存数据库连接结果 还有一个用于保存数据库基本配置
*/ class Mysql extends db{ private $host; private $user; private $pwd; private $dbname; private $charset;private static $conf = null; //保存服务器链接资源 private $conn = null; }

接下来在后边我们逐渐扩展该数据库类

protected function __construct(){
        /*首先获取数据库基本配置内容*/
        $conf = self::$conf = config::getIns();
        //使用配置文件中的配置
        $this->host = $conf->host;
        $this->user = $conf->user;
        $this->pwd = $conf->pwd;
        $this->dbname = $conf->dbname;
        $this->charset = $conf->charset;
        //连接数据库
        $this->connect($this->host,$this->user,$this->pwd);
        //切换数据库 因为数据库在程序执行过程中可能还需要切换所以这里应该编写一个方法用
于切换数据库而不是写死在这里
$this->switchdb($this->dbname); //设置字符集 同上 $this->setChar($this->charset); }
//连接数据
public function connect($h,$u,$p){
    //调用mysqli链接方法
    $this->conn = new mysqli($h,$u,$p);
    //var_dump($this->conn);
}



//后边使用Mysql::getInt方法获取 数据库连接资源 这里先判断是否已经连接数据库 实例化数据库 $conn= Mysql::getInt()
    public static function getInt(){
        if(self::$conn === false){
            self::$conn = new self();
        }
        return self::$conn;
    }

 



//
负责切换数据库 网站大时需要 public function switchdb($dbname){ $this->conn->select_db($dbname); }
//设置字符集
public function setChar($char){
    //注意有个空格
   $this->conn->set_charset($char);
}
//负责发送sql查询
public function query($sql){
    $c = $this->conn;
    $rst = $c->query($sql);
    if(!$rst){
        //这里利用到日志累的日志记录功能
        log::write(date("Y-m-d H:i:d",time()).$c->error);
    }
    //返回执行结果
    return $rst;
}
//负责获取多行查询结果
public function getAll($sql){
    //用一个数组保存执行结果
    $list = array();
    $rst = $this->query($sql);
    if(!$rst){
        return false;
    }
    while($row = $rst->fetch_assoc()){
        $list[] = $row;
    }
    return $list;
}
//获得一行数据
public function getRow($sql){
    $rst = $this->query($sql);
    if(!$rst){
        return false;
    }
    return $rst->fetch_assoc();
}
//得到单个值
public function getOne($sql){
    //exit;
    $rst = $this->query($sql);
    if(!$rst){
        return false;
    }
    //返回行值
    return $rst->fetch_assoc();
}
public function autoExecute($table , $data , $act="insert" , $where = ""){
        //执行插入功能
        if($act == 'insert'){
            //$table这里添加一个$符号在一个双引号当中会经过解析
            $sql = "insert into $table (";
            //将数组当中的数据以,隔离开 implode 讲数组转换成以','隔开的字符串 array_keys获取数组的键值
            $sql .= implode(',' , array_keys($data)) . ") values ('";
            $sql .= implode("','" , array_values($data)) ."')";
            //返回执行结果集
             $rst = $this->query($sql);
            if(!$rst){
                log::write(date("Y-m-d H:i:d",time()).$this->error);
            }
            return $rst;
        }else if($act == 'update'){
            $sql = "update $table set ";
            foreach ($data as $k => $v) {
                $sql .= $k . "='" . $v . "',";
            }
            $sql = rtrim($sql , ',') . " where " . $where;
            $rst = $this->query($sql);
            //如果执行失败将数据库返回来的错误信息记录到日志文件当中
            if(!$rst){
                log::write(date("Y-m-d H:i:d",time()).$this->error);
            }
            return $rst;
        }
    }
//返回受影响行数
    public function affected_rows(){
        return $this->conn->affected_rows;
    }
//返回受影响行数
    public function affected_rows(){
        return $this->conn->affected_rows;
    }
    //返回最新的auto_increment自增列的长度
    public function insert_id(){
        return $this->conn->insert_id;
    }
    public function close(){
        $this->conn->close();
    }