下面是一个基于单例模式封装的 MySQL 数据库操作类,包含常用的数据库操作方法。
完整代码实现
<?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// 引入数据库类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";}
功能特点
单例模式:确保全局只有一个数据库连接实例
PDO扩展:使用PDO进行数据库操作,支持多种数据库
预处理语句:防止SQL注入攻击
错误处理:完善的错误日志记录机制
事务支持:提供完整的事务操作方法
常用方法:
query()
- 执行查询语句execute()
- 执行增删改操作getOne()
- 获取单条记录getAll()
- 获取多条记录getScalar()
- 获取单个值lastInsertId()
- 获取最后插入ID安全防护:
防止克隆
防止序列化和反序列化
注意事项
在生产环境中,应该将数据库配置信息存储在安全的地方,而不是直接写在代码中
根据项目需求,可以扩展更多便捷的方法
对于大型项目,可以考虑使用连接池管理数据库连接
在高并发场景下,单例模式可能成为性能瓶颈,需要根据实际情况调整
这个MySQL数据库操作类封装了常用的数据库操作方法,可以直接在项目中使用,也可以根据需要进行扩展。
本文关键词: php 基于 单例 模式 封装 mysql
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。