PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > 工作总结

php基于单例模式封装mysql类完整实例

管理员 2025-03-26
工作总结
35

下面是一个基于单例模式封装的 MySQL 数据库操作类,包含常用的数据库操作方法。

完整代码实现

php
复制
<?php/**
 * 基于单例模式的MySQL数据库操作类
 */class MySQLDB{
    // 单例对象
    private static $instance = null;
    
    // 数据库连接
    private $conn = null;
    
    // 数据库配置
    private $config = array(
        'host'     => 'localhost',
        'port'     => 3306,
        'user'     => 'root',
        'password' => '',
        'dbname'   => 'test',
        'charset'  => 'utf8mb4'
    );
    
    /**
     * 私有化构造函数,防止外部实例化
     */
    private function __construct($config = array())
    {
        // 合并配置
        if (!empty($config)) {
            $this->config = array_merge($this->config, $config);
        }
        
        // 连接数据库
        $this->connect();
    }
    
    /**
     * 私有化克隆方法,防止克隆
     */
    private function __clone()
    {
    }
    
    /**
     * 获取单例实例
     */
    public static function getInstance($config = array())
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self($config);
        }
        return self::$instance;
    }
    
    /**
     * 连接数据库
     */
    private function connect()
    {
        try {
            $dsn = "mysql:host={$this->config['host']};port={$this->config['port']};dbname={$this->config['dbname']};charset={$this->config['charset']}";
            
            $options = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => false,
            );
            
            $this->conn = new PDO($dsn, $this->config['user'], $this->config['password'], $options);
        } catch (PDOException $e) {
            die("数据库连接失败: " . $e->getMessage());
        }
    }
    
    /**
     * 执行SQL查询,返回结果集
     */
    public function query($sql, $params = array())
    {
        try {
            $stmt = $this->conn->prepare($sql);
            $stmt->execute($params);
            return $stmt;
        } catch (PDOException $e) {
            $this->error($e, $sql, $params);
            return false;
        }
    }
    
    /**
     * 执行SQL操作,返回影响行数
     */
    public function execute($sql, $params = array())
    {
        try {
            $stmt = $this->conn->prepare($sql);
            $stmt->execute($params);
            return $stmt->rowCount();
        } catch (PDOException $e) {
            $this->error($e, $sql, $params);
            return false;
        }
    }
    
    /**
     * 获取单条记录
     */
    public function getOne($sql, $params = array())
    {
        $stmt = $this->query($sql, $params);
        return $stmt ? $stmt->fetch() : false;
    }
    
    /**
     * 获取多条记录
     */
    public function getAll($sql, $params = array())
    {
        $stmt = $this->query($sql, $params);
        return $stmt ? $stmt->fetchAll() : false;
    }
    
    /**
     * 获取单个字段值
     */
    public function getScalar($sql, $params = array())
    {
        $stmt = $this->query($sql, $params);
        if ($stmt) {
            $result = $stmt->fetch(PDO::FETCH_NUM);
            return $result ? $result[0] : false;
        }
        return false;
    }
    
    /**
     * 获取最后插入的ID
     */
    public function lastInsertId()
    {
        return $this->conn->lastInsertId();
    }
    
    /**
     * 开启事务
     */
    public function beginTransaction()
    {
        return $this->conn->beginTransaction();
    }
    
    /**
     * 提交事务
     */
    public function commit()
    {
        return $this->conn->commit();
    }
    
    /**
     * 回滚事务
     */
    public function rollBack()
    {
        return $this->conn->rollBack();
    }
    
    /**
     * 错误处理
     */
    private function error($e, $sql = '', $params = array())
    {
        $error = array(
            'code'    => $e->getCode(),
            'message' => $e->getMessage(),
            'sql'     => $sql,
            'params'  => $params
        );
        
        // 记录错误日志
        error_log('MySQL Error: ' . json_encode($error, JSON_UNESCAPED_UNICODE));
        
        // 开发环境直接输出错误
        if (defined('APP_DEBUG') && APP_DEBUG) {
            echo '<pre>';
            print_r($error);
            echo '</pre>';
        }
    }
    
    /**
     * 防止序列化
     */
    public function __sleep()
    {
        throw new Exception('Serialization of MySQLDB is not allowed');
    }
    
    /**
     * 防止反序列化
     */
    public function __wakeup()
    {
        throw new Exception('Unserialization of MySQLDB is not allowed');
    }}

使用示例

php
复制
<?php// 引入数据库类require_once 'MySQLDB.php';// 配置数据库连接$config = array(
    'host'     => '127.0.0.1',
    'user'     => 'root',
    'password' => '123456',
    'dbname'   => 'test_db');// 获取数据库实例$db = MySQLDB::getInstance($config);// 1. 查询单条记录$user = $db->getOne("SELECT * FROM users WHERE id = ?", [1]);print_r($user);// 2. 查询多条记录$users = $db->getAll("SELECT * FROM users WHERE status = ?", [1]);print_r($users);// 3. 查询单个值$count = $db->getScalar("SELECT COUNT(*) FROM users");echo "用户总数: $count\n";// 4. 插入数据$insertId = $db->execute(
    "INSERT INTO users (username, email, password) VALUES (?, ?, ?)",
    ['testuser', 'test@example.com', password_hash('123456', PASSWORD_DEFAULT)]);echo "插入ID: $insertId\n";// 5. 更新数据$affectedRows = $db->execute(
    "UPDATE users SET status = ? WHERE id = ?",
    [0, 1]);echo "影响行数: $affectedRows\n";// 6. 事务处理try {
    $db->beginTransaction();
    
    $db->execute(
        "UPDATE account SET balance = balance - ? WHERE user_id = ?",
        [100, 1]
    );
    
    $db->execute(
        "UPDATE account SET balance = balance + ? WHERE user_id = ?",
        [100, 2]
    );
    
    $db->commit();
    echo "转账成功\n";} catch (Exception $e) {
    $db->rollBack();
    echo "转账失败: " . $e->getMessage() . "\n";}

功能特点

  1. 单例模式:确保全局只有一个数据库连接实例

  2. PDO扩展:使用PDO进行数据库操作,支持多种数据库

  3. 预处理语句:防止SQL注入攻击

  4. 错误处理:完善的错误日志记录机制

  5. 事务支持:提供完整的事务操作方法

  6. 常用方法

    • query() - 执行查询语句

    • execute() - 执行增删改操作

    • getOne() - 获取单条记录

    • getAll() - 获取多条记录

    • getScalar() - 获取单个值

    • lastInsertId() - 获取最后插入ID

  7. 安全防护

    • 防止克隆

    • 防止序列化和反序列化

注意事项

  1. 在生产环境中,应该将数据库配置信息存储在安全的地方,而不是直接写在代码中

  2. 根据项目需求,可以扩展更多便捷的方法

  3. 对于大型项目,可以考虑使用连接池管理数据库连接

  4. 在高并发场景下,单例模式可能成为性能瓶颈,需要根据实际情况调整

这个MySQL数据库操作类封装了常用的数据库操作方法,可以直接在项目中使用,也可以根据需要进行扩展。



本文关键词: php 基于 单例 模式 封装 mysql

希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部