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");//这句话是删除某个表的全部数据

原创文章,作者:STEVE,如若转载,请注明出处:https://shinecloud.com.cn

(0)
STEVESTEVE
上一篇 2022年 10月 26日 上午1:34
下一篇 2022年 11月 7日 下午5:08

相关推荐

  • PHP:数组变量的序列化和反序列化

    序列化和反序列化是PHP操作数据库、读写文件时常见的操作。 序列化,就是将PHP的变量转化为可保存的、可传输的字符串的过程; 反序列化,则是将(序列化的)字符串转化回变量。 比如,我们需要将某学生的个人信息...

    2022年 10月 25日
    226
  • PHP类:$this和self关键字

    $this是指向对象的指针,self是指向当前类的指针。 来一个案例 $this只能在成员方法中使用。self既可以在成员方法中使用,也可以在静态方法中使用,用来调用类的常量、静态属性和方法。 若在静态方法中调用$this...

    2022年 10月 19日
    223
  • 实战:最麻烦的群晖SHR+Btrfs阵列数据救援

    开篇语 这篇文章与其说是教程,不如说是一次经验总结。 我并不是专业数据恢复人员,只是在互联网上搜索各类教程,然后尝试,最终获得了成功! 前前后后一共折腾了5天,有很多次都不想搞了,但我抱着一个信念:只...

    2022年 8月 18日
    670
  • PHP常量:Const和Define有什么区别?

    在初学PHP时,我对这两个函数有点迷糊,虽然知道如何使用,但不知道设计这两个有什么意义。 Const const是一种语言结构,最早只能用在类(class)内,PHP5.3之后可以用在类外,实现了通用。 Define define是一个...

    2022年 10月 19日
    309
  • PHP:in_array()和array_search()的奇葩问题

    近期做项目,发现使用array_search出现的问题——搜索出错,元素分明有在数组中,但给出的结果是FALSE! 操作逻辑如下 从数据库中取出符合条件的字符串的用户id合集 使用foreach遍历这些对象 将对象中的字符串使用e...

    2022年 11月 20日
    383

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注