
下面是一个基于单例模式封装的 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数据库操作类封装了常用的数据库操作方法,可以直接在项目中使用,也可以根据需要进行扩展。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


