PHP封装数据库

(1)按照步骤封装数据库

①引入抽象类和抽象方法,即引入模板;

②继承抽象类,注意参数(规定几个就传入几个);

③逐个写入抽象方法,必须一一对应;(抽象方法必须一一引入,否则会报错-->有个抽象方法没有被实现)

④给抽象方法名加上方法体,即代码块;

 

(2)下面直接上代码,具体解析在代码里做了注释

<meta charset="utf-8">
<?php
    abstract class aDB{
        // 连接数据库,从配置文件读取配置信息
        abstract public function coon();
        /*发送query查询
        * @param string $sql sql语句
        * @return mixed
        */
        abstract public function query($sql);
        /*查询多行数据
        *@param string $sql sql语句
        * @return array
        */
        abstract public function getAll($sql);
        /*单行数据
        *@param string $sql sql语句
        * @return array
        */
        abstract public function getRow($sql);
        /*查询单个数据,如count(*)
        *@param string $sql sql语句
        * @return mixed
        */
        abstract public function getOne($sql);
        /*自动创建sql并执行,拼接sql语句
        *@param array $data 关键数组 键值与表的列值对应
        *@param string $table表名字
        *@param string act 动作/update/insert
        *@param string where 条件,用于update
        *@return int 新插入的列的主键值或影响行数
        */
        abstract public function Exec($data,$table,$act='insert',$where='0');
        /*返回上一条语句影响的行数
        */
        abstract public function affectedRows();
    }
    class MySQL extends aDb{
        //全局变量
        public $link;
        //构造函数,自动触发连接数据库
        public function __construct(){
            $this->coon();
        }
        //连接数据库,从配置文件读取配置信息(这里我写一个config配置文件)
        public function coon(){
            include './config.php';
            // var_dump($cfg['host']);获取配置信息
            //连接数据库,两种风格对比
            // mysqli_connect();这里是过程化风格,下面是面向对象风格
            $this ->link = new mysqli($cfg['host'],$cfg['user'],$cfg['pwd'],$cfg['db']);//返回连接数据库的版本等信息(常说的连接点)
            $this->query('set name'.$cfg['charset']);//设置字符集
        }
        public function query($sql){
            return $this->link->query($sql);
        }
        public function getAll($sql){
            $data = [];
            $res = $this->query($sql);
            // mysqli_fetch_assoc();过程化风格,下面介绍下面向对象风格fetch_assoc
            while ($row = $res->fetch_assoc()) {
                $data[] = $row;
            }
            return $data;
        }
        public function getRow($sql){
            //查询单条时,加上where条件即可,例如select* from user where id = 1
            $res = $this->query($sql);
            $row = $res->fetch_row()[0];
            return $row;
        }
        public function getOne($sql){//查询单个数据
            $res = $this->query($sql);
            $row = $res->fetch_row()[0];//查询出数组长度,即数据数量
            return $row;
        }
        //$act='insert/update'控制插入和删除数据
        public function Exec($data,$table,$act='insert',$where='0'){//自动创建sql并执行
            if ($act == 'insert') {
                //插入语句
                //insert into 表名(id,name) values('2','tony')过程化风格
                $sql = 'insert into '.$table .'(';
                //array_keys()返回包含数组中所有键名的一个新数组
                $sql.=implode(',',array_keys($data)).')';//将数组拆成字符串,用,分隔
                // var_dump($sql);    到这步已经可以输出insert into user(name,money),还差values
                $sql.= " values ('";
                $sql.= implode("','",array_values($data))."')";//这里通过拼接字符串,插入values(注意单引号的拼接)
            }else{
                //更新语句****更新和删除操作必须加条件
                //update xx set name='www',password='12' where ;
                $sql = "update $table set ";
                foreach ($data as $key => $value) {
                    $sql.= $key ."='".$value."',";
                }
                // var_dump($sql);此时输出结果会多一个,,所以下面来去掉,
                $sql = rtrim($sql,',');
                $sql.= " where $where";
                var_dump($sql);
            }
            return $this->query($sql);
        }
        public function lastId(){//返回新增数据的id,新增数据时触发
            return $this->link->insert_id;
        }
        public function affectedRows(){//影响行数
            return $this->link->affected_rows;
        }
    }
    $mysql = new MySQL();
    var_dump($mysql->Exec(['name'=>'haizwi','password'=>'5601'],'user','update',"name='tony'"));
    var_dump($mysql->affectedRows());
?>

config.php:

<?php
    $cfg = array(
        'host' => 'localhost',
        'user' => 'root',
        'pwd' => 'root',
        'db' => 'user',
        'charset' => 'utf8'
    );
    return $cfg;
?>

 

posted @ 2018-03-26 18:15  剑仙6  阅读(220)  评论(0编辑  收藏  举报
欢迎访问个人网站www.qingchun.在线