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

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

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

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

下面是一个基于单例模式封装的 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数据库操作类封装了常用的数据库操作方法,可以直接在项目中使用,也可以根据需要进行扩展。




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

相关推荐

扫码关注

qrcode

QQ交谈

回顶部