当前位置: 代码迷 >> 综合 >> mysqli 数据库工具类
  详细解决方案

mysqli 数据库工具类

热度:37   发布时间:2023-12-22 09:45:18.0

文章目录

  • mysqli 数据库工具类
    • 单例设计模式
    • 代码实现
      • 数据库初始化工作
      • SQL执行方法 exec()
      • SQL查询方法 query()
      • SQL查询结果 fetchOne()
      • SQL查询结果 fetchALL()
      • SQL获取记录数 rowCount()
    • 完整代码

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);?>
  相关解决方案