PHP:单例模式的多功能数据库工具类

此数据库工具类根据传智播客2018年8月的PHP教程所设计。

class Db
{
    /*
    这是一个“三私一公”的单例设计数据库模式类
    */

    //私有的静态的保存对象的属性
    private static $obj = null;

    //私有的数据库配置信息
    private $Db_host;
    private $Db_user;
    private $Db_pswd;
    private $Db_name;
    private $link;

    //私有的构造方法防止外部创建对象
    //将外部传来的数据库连接参数赋值给私有成员属性
    private function __construct($config=array())
    {
        $this->Db_host = $config["Db_host"];
        $this->Db_user = $config["Db_user"];
        $this->Db_pswd = $config["Db_pswd"];
        $this->Db_name = $config["Db_name"];
        $this->connectDb();
        $this->selectDb();
    }

    //私有的克隆方法防止外部克隆对象
    private function __clone()
    {}

    //公共的静态的创建对象的方法
    public static function getInstance($config=array()){
        //检测$obj是否存在,如不存在即创建,如存在即返回
        if(!self::$obj instanceof self){
            self::$obj = new self($config);
        }
            return self::$obj;
        }

    //私有的连接数据库的方法
    private function connectDb(){
        if(!$this->link = mysqli_connect($this->Db_host,$this->Db_user,$this->Db_pswd)){
            echo "连接数据库{$this->Db_host}失败,具体错误是:".mysqli_connect_error();
            die();
        }
    }

    //私有的选择数据库的方法
    private function selectDb(){
        if(!mysqli_select_db($this->link,$this->Db_name)){
            echo "选择{$this->Db_host}数据库失败,具体错误是:".mysqli_connect_error();
            die();
        }
    }

    //公共的执行增删改语句的方法
    public function exec($sql){
        $sql = strtolower($sql);
        if(substr($sql,0,6)=="select"){
            echo "不能执行SELECT语句";
            die();
        }else{
            return mysqli_query($this->link,$sql);
        }
    }

    //私有的执行查询语句的方法
    private function query($sql){
        $sql = strtolower($sql);
        if(substr($sql,0,6)!="select"){
            echo "只能执行SELECT语句";
            die();
        }else{
            //返回查询的结果集对象
            return mysqli_query($this->link,$sql);
        }
    }

    //获取单行数据
    public function fetchOne($sql,$type=3){
        $result = $this->query($sql);
        $types=array(
            1 => MYSQLI_NUM,
            2 => MYSQLI_BOTH,
            3 => MYSQLI_ASSOC,
        );
        return mysqli_fetch_array($result,$types[$type]);
    }

    //获取多行数据
    public function fetchAll($sql,$type=3){
        $result = $this->query($sql);
        $types=array(
            1 => MYSQLI_NUM,
            2 => MYSQLI_BOTH,
            3 => MYSQLI_ASSOC,
        );
        return mysqli_fetch_all($result,$types[$type]);
    }

    //获取记录数量
    public function rowCount($sql){
        $result = $this->query($sql);
        return mysqli_num_rows($result);
    }

    //公共的析构方法用于关闭数据库连接
    public function __destruct()
    {
        mysqli_close($this->link);
    }
};

$arr=array(
    "Db_host" => "localhost",
    "Db_user" => "username",
    "Db_pswd" => "password",
    "Db_name" => "name"
);
$Db= Db::getInstance($arr);

//查询并返回结果行数
$search = $obj->rowCount("SELECT * from Table_name");

//查询并返回结果集
$search = $obj->fetchAll("SELECT * from Table_name");

//查询并返回一个结果
$search = $obj->fetchOne("SELECT * from Table_name");

//增删改数据库并返回布尔值结果
$operate = $obj->exec("DELETE from Table_name");//这句话是删除某个表的全部数据