mysqli 数据库工具类

mysqli 数据库工具类

单例设计模式

  • 描述:一个类只能创建一个实例对象
  • 设置要求(三私一公):
    • 私有的静态保存对象属性
    • 私有的构造方法,防止类外部new对象
    • 私有的克隆方法,防止类外部clone对象
    • 公共的静态创建对象的方法

代码实现

数据库初始化工作

<php?
class Db{
    //私有的静态保存对象属性
    private static $db = null;

    //私有数据库配置信息
    private $db_host;//主机名
    private $db_user;//用户名
    private $db_pass;//密码
    private $db_name;//数据库名
    private $charset;//字符集
    private $link;//数据库连接对象

    //构造方法
    private function __construct($config = array()){
        $this->db_host = $config['db_host'];
        $this->db_user= $config['db_user'];
        $this->db_pass= $config['db_pass'];
        $this->db_name= $config['db_name'];
        $this->charset = $config['charset'];

        $this->connectDB();//连接数据库
        $this->selectDb();//选择数据库
        $this->setCharset();//设置字符集
    }

    //连接数据库
    private function connectDb(){
       if(!$this->link = @mysqli_connect($this->db_host,$this->db_user,$this->db_pass)){
            die("连接MySQL数据库服务器失败!");
       }
    }

    //选择数据库
    private function selectDb(){
        if(!mysqli_select_db($this->link,$this->db_name)){
            die("选择数据库失败");
        }
    }

    //设置字符集
    private function setCharset(){
        mysqli_set_charset($this->link,$this->charset);
    }

    //私有的克隆方法
    private function __clone(){}
    //公共的静态创建对象方法
    public static function getInstance($config=array()){
        //判断当前对象是否存在
        if(!self::$db instanceof self){
            //如果对象不存在则创建对象
            self::$db = new self($config);
        }
        //存在则返回对象
        return self::$db;
    }

    //防止直接输出对象
    public function __toString(){
        return "对象不能直接输出";
    }

    //防止对象当函数调用
    public function __invoke(){
        echo  "对象不能当函数使用";
    }

    //关闭数据库连接
    public function __destruct(){
        mysqli_close($this->link);
    }
}

$arr = array(
    'db_host'=>'127.0.0.1',
    'db_user'=>'root',
    'db_pass'=>'root',
    'db_name'=>'shitu',
    'charset'=>'utf8',
);    
    
    
?>

SQL执行方法 exec()

  • 作用:公共的执行SQL语句的方法,insert、update、delete、set、drop等

  • 返回值:布尔值,成功返回true,失败返回flase

  • 方法代码

    <?php
    //公共执行sql语句方法
    public function exec($sql){
        //对sql语句进行大小写转换
        $sql = strtolower($sql);
    
        //判断是否为SELECT语句
        if(substr($sql,0,6)=='select'){
            die("该方法不能执行SELECT语句,请选择query()方法执行");
        }
    
        //返回执行结果值
        return mysqli_query($this->link,$sql);
    }    
        
        
    ?>    
    

    方法调用

    $db = Db::getInstance($arr);
    $sql = "INSERT INTO st_search_log(img_src,create_time,api_rel,show_rel) VALUES('/upload/images/test.jpg','".time()."','ok','ok')";
    $rel= $db->exec($sql);
    

    返回结果

    bool(true)
    

SQL查询方法 query()

  • 该方法定义为私有方法,由于其返回结果是一个结果集,需要类内处理再返回给用户

    <?php
    private function query($sql){
        //对sql语句进行大小写转换
        $sql = strtolower($sql);
    
        //判断是否为SELECT语句
        if(substr($sql,0,6)!='select'){
            die("该方法只能执行SELECT语句");
        }
    
        //返回执行结果值
        return mysqli_query($this->link,$sql);
    }    
        
    ?>
    

SQL查询结果 fetchOne()

  • 查询单条数据,传递两个参数 SQL语句和返回结果类型

  • 需要调用内部方法 query()执行SQL语句,再根据结果值和返回类型处理查询结果

    <?php
    //查询单条数据
    
        /**
         * @param $sql
         * @param int $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH
         */
        public function fetchOne($sql,$type=1){
        //获取查询结果值
        $result =  $this->query($sql);
        //判断查询结果类型
        switch ($type){
            case 1:
                $type = MYSQLI_NUM;
                break;
            case 2:
                $type = MYSQLI_ASSOC;
                break;
            default:
                $type = MYSQLI_BOTH;
        }
    
        return mysqli_fetch_array($result,$type);
    }    
        
    ?>
    

    方法使用

    <?php
    $db = Db::getInstance($arr);
    $sql = "SELECT * FROM st_search_log";
    $rel = $db->fetchOne($sql,1);
    echo "<pre>";
    var_dump($rel);   
            
    ?>
        
    

    返回结果

    array(5) {
      [0]=>
      string(1) "1"
      [1]=>
      string(23) "/upload/images/test.jpg"
      [2]=>
      string(8) "12525555"
      [3]=>
      string(2) "ok"
      [4]=>
      string(2) "ok"
    }
    

SQL查询结果 fetchALL()

  • 查询多行数据,传递两个参数 SQL语句和返回结果类型

  • 需要调用内部方法 query()执行SQL语句,再根据结果值和返回类型处理查询结果

    <?php
        //查询多行数据
        /**
         * @param $sql
         * @param int $type $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH
         * @return array|null
         */
        public function fetchAll($sql,$type=1){
            //获取查询结果值
            $result =  $this->query($sql);
            //判断查询结果类型
            switch ($type){
                case 1:
                    $type = MYSQLI_NUM;
                    break;
                case 2:
                    $type = MYSQLI_ASSOC;
                    break;
                default:
                    $type = MYSQLI_BOTH;
            }
            return mysqli_fetch_all($result,$type);
        }
    ?>
        
    

    方法使用

    <?php
    $db = Db::getInstance($arr);
    $sql = "SELECT * FROM st_search_log";
    $rel = $db->fetchAll($sql,1);
    echo "<pre>";
    var_dump($rel);
          
    ?>
    

    输出结果

    array(5) {
      [0]=>
      array(5) {
        [0]=>
        string(1) "1"
        [1]=>
        string(23) "/upload/images/test.jpg"
        [2]=>
        string(8) "12525555"
        [3]=>
        string(2) "ok"
        [4]=>
        string(2) "ok"
      }
      [1]=>
      array(5) {
        [0]=>
        string(1) "2"
        [1]=>
        string(23) "/upload/images/test.jpg"
        [2]=>
        string(1) "0"
        [3]=>
        string(2) "ok"
        [4]=>
        string(2) "ok"
      }
     ....
    
    }
    

SQL获取记录数 rowCount()

  • 获取数据库记录数

  • 传递查询查询结果记录数

    <?php
    //查询结果记录数
    public function rowCount($sql){
        //执行sql获取结果集
        $result = $this->query($sql);
        //返回结果记录数
        return mysqli_num_rows($result);
    }        
        
    ?>
    

完整代码

<?php
/**
 * Created by 。
 * user: rufeike
 * email: rufeike@163.com
 * Date:2019/11/4
 * Time: 16:06
 */

class Db{
    //私有的静态保存对象属性
    private static $db = null;

    //私有数据库配置信息
    private $db_host;//主机名
    private $db_user;//用户名
    private $db_pass;//密码
    private $db_name;//数据库名
    private $charset;//字符集
    private $link;//数据库连接对象

    //构造方法
    private function __construct($config = array()){
        $this->db_host = $config['db_host'];
        $this->db_user= $config['db_user'];
        $this->db_pass= $config['db_pass'];
        $this->db_name= $config['db_name'];
        $this->charset = $config['charset'];

        $this->connectDB();//连接数据库
        $this->selectDb();//选择数据库
        $this->setCharset();//设置字符集
    }

    //连接数据库
    private function connectDb(){
       if(!$this->link = @mysqli_connect($this->db_host,$this->db_user,$this->db_pass)){
            die("连接MySQL数据库服务器失败!");
       }
    }

    //选择数据库
    private function selectDb(){
        if(!mysqli_select_db($this->link,$this->db_name)){
            die("选择数据库失败");
        }
    }

    //设置字符集
    private function setCharset(){
        mysqli_set_charset($this->link,$this->charset);
    }

    //私有的克隆方法
    private function __clone(){}
    //公共的静态创建对象方法
    public static function getInstance($config=array()){
        //判断当前对象是否存在
        if(!self::$db instanceof self){
            //如果对象不存在则创建对象
            self::$db = new self($config);
        }
        //存在则返回对象
        return self::$db;
    }


    //公共执行sql语句方法
    public function exec($sql){
        //对sql语句进行大小写转换
        $sql = strtolower($sql);

        //判断是否为SELECT语句
        if(substr($sql,0,6)=='select'){
            die("该方法不能执行SELECT语句,请选择query()方法执行");
        }

        //返回执行结果值
        return mysqli_query($this->link,$sql);
    }

    //私有查询语句
    private function query($sql){
        //对sql语句进行大小写转换
        $sql = strtolower($sql);

        //判断是否为SELECT语句
        if(substr($sql,0,6)!='select'){
            die("该方法只能执行SELECT语句");
        }

        //返回执行结果值
        return mysqli_query($this->link,$sql);
    }

    //查询单条数据

    /**
     * @param $sql
     * @param int $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH
     */
    public function fetchOne($sql,$type=1){
        //获取查询结果值
        $result =  $this->query($sql);
        //判断查询结果类型
        switch ($type){
            case 1:
                $type = MYSQLI_NUM;
                break;
            case 2:
                $type = MYSQLI_ASSOC;
                break;
            default:
                $type = MYSQLI_BOTH;
        }

        return mysqli_fetch_array($result,$type);
    }

    //查询多行数据

    /**
     * @param $sql
     * @param int $type $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH
     * @return array|null
     */
    public function fetchAll($sql,$type=1){
        //获取查询结果值
        $result =  $this->query($sql);
        //判断查询结果类型
        switch ($type){
            case 1:
                $type = MYSQLI_NUM;
                break;
            case 2:
                $type = MYSQLI_ASSOC;
                break;
            default:
                $type = MYSQLI_BOTH;
        }
        return mysqli_fetch_all($result,$type);
    }

    //查询结果记录数
    public function rowCount($sql){
        //执行sql获取结果集
        $result = $this->query($sql);
        //返回结果记录数
        return mysqli_num_rows($result);
    }

    //防止直接输出对象
    public function __toString(){
        return "对象不能直接输出";
    }

    //防止对象当函数调用
    public function __invoke(){
        echo  "对象不能当函数使用";
    }

    //关闭数据库连接
    public function __destruct(){
        mysqli_close($this->link);
    }
}

$arr = array(
    'db_host'=>'127.0.0.1',
    'db_user'=>'root',
    'db_pass'=>'root',
    'db_name'=>'shitu',
    'charset'=>'utf8',
);
$db = Db::getInstance($arr);
//$sql = "INSERT INTO st_search_log(img_src,create_time,api_rel,show_rel) VALUES('/upload/images/test.jpg','".time()."','ok','ok')";
//$rel= $db->exec($sql);
$sql = "SELECT * FROM st_search_log";
$rel = $db->rowCount($sql);

echo "<pre>";
var_dump($rel);


?>
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值