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)
上一篇 2022年 10月 26日 上午1:34
下一篇 2022年 11月 1日 下午11:39

相关推荐

  • PHP类:$this和self关键字

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

    2022年 10月 19日
    35
  • PHP类的自动加载函数:spl_autload_register()

    一个PHP项目里通常有许多个类(class),如果在每个PHP页面的开头进行引入,非常麻烦,尤其是不同的PHP页面需要不同的类。 因此,PHP7之前,有__autoload()函数用于自动引用类,PHP7之后则改为了spl_autload_registe...

    2022年 10月 22日
    57
  • PHP:数组变量的序列化和反序列化

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

    2022年 10月 25日
    35
  • PHP连接数据库:使用类和函数两种方式

    PHP连接数据库是非常常用的功能,在初学时,一般使用函数来连接。 函数的方式非常简单,如果不需要报错信息的话,只有2行代码,加上报错信息,也只有6行而已。 我们尝试定义一个类来连接数据库,如下所示: 好家伙,...

    2022年 10月 20日
    54
  • 基于JQuery的AJAX异步文件上传方法

    对于许多初学者而言,上传表单很容易,但上传文件就麻烦了。 这里给出一个简单的方法,供参考。 HTML部分 谨记:action可以留空,enctype要设为“multipart/form-data” Javascript部分 PHP部分 如果不出意外,你的前...

    2022年 11月 8日
    42

发表回复

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