下面是一个完整的基于 MySQLi 扩展封装的数据库操作类,包含常用的数据库操作方法。
完整代码实现
<?php/** * MySQLi 数据库操作封装类 */class MySQLiDB{ // MySQLi 连接对象 private $conn; // 数据库配置 private $config = array( 'host' => 'localhost', 'port' => 3306, 'user' => 'root', 'password' => '', 'dbname' => 'test', 'charset' => 'utf8mb4' ); // 查询结果 private $result; // 最后执行的SQL private $lastSql = ''; // 最后插入ID private $lastInsertId = 0; // 影响行数 private $affectedRows = 0; // 错误信息 private $error = ''; /** * 构造函数 * @param array $config 数据库配置 */ public function __construct($config = array()) { // 合并配置 if (!empty($config)) { $this->config = array_merge($this->config, $config); } // 连接数据库 $this->connect(); } /** * 连接数据库 */ private function connect() { $this->conn = new mysqli( $this->config['host'], $this->config['user'], $this->config['password'], $this->config['dbname'], $this->config['port'] ); // 检查连接 if ($this->conn->connect_error) { die("数据库连接失败: " . $this->conn->connect_error); } // 设置字符集 $this->conn->set_charset($this->config['charset']); } /** * 执行SQL查询 * @param string $sql SQL语句 * @param array $params 绑定参数 * @return bool|mysqli_result */ public function query($sql, $params = array()) { $this->lastSql = $sql; $this->error = ''; // 预处理SQL $stmt = $this->conn->prepare($sql); if (!$stmt) { $this->error = $this->conn->error; return false; } // 绑定参数 if (!empty($params)) { $types = ''; $bindParams = array(); foreach ($params as $param) { if (is_int($param)) { $types .= 'i'; // 整数 } elseif (is_float($param)) { $types .= 'd'; // 浮点数 } else { $types .= 's'; // 字符串 } $bindParams[] = $param; } array_unshift($bindParams, $types); call_user_func_array(array($stmt, 'bind_param'), $this->refValues($bindParams)); } // 执行查询 if (!$stmt->execute()) { $this->error = $stmt->error; return false; } // 获取结果 $this->result = $stmt->get_result(); $this->affectedRows = $stmt->affected_rows; // 如果是INSERT操作,获取最后插入ID if (preg_match('/^\s*INSERT\s+/i', $sql)) { $this->lastInsertId = $stmt->insert_id; } $stmt->close(); return $this->result; } /** * 获取单条记录 * @param string $sql SQL语句 * @param array $params 绑定参数 * @return array|bool */ public function getOne($sql, $params = array()) { $result = $this->query($sql, $params); if (!$result) { return false; } return $result->fetch_assoc(); } /** * 获取多条记录 * @param string $sql SQL语句 * @param array $params 绑定参数 * @return array|bool */ public function getAll($sql, $params = array()) { $result = $this->query($sql, $params); if (!$result) { return false; } $rows = array(); while ($row = $result->fetch_assoc()) { $rows[] = $row; } return $rows; } /** * 获取单个字段值 * @param string $sql SQL语句 * @param array $params 绑定参数 * @return mixed|bool */ public function getScalar($sql, $params = array()) { $result = $this->query($sql, $params); if (!$result || !$result->num_rows) { return false; } $row = $result->fetch_row(); return $row[0]; } /** * 插入数据 * @param string $table 表名 * @param array $data 数据数组 * @return bool|int 插入ID或false */ public function insert($table, $data) { if (empty($table) || empty($data)) { return false; } $fields = array(); $values = array(); $placeholders = array(); foreach ($data as $field => $value) { $fields[] = "`$field`"; $placeholders[] = '?'; $values[] = $value; } $sql = "INSERT INTO `$table` (" . implode(', ', $fields) . ") VALUES (" . implode(', ', $placeholders) . ")"; if ($this->query($sql, $values)) { return $this->lastInsertId; } return false; } /** * 更新数据 * @param string $table 表名 * @param array $data 数据数组 * @param string $where WHERE条件 * @param array $whereParams WHERE参数 * @return bool|int 影响行数或false */ public function update($table, $data, $where = '', $whereParams = array()) { if (empty($table) || empty($data)) { return false; } $set = array(); $values = array(); foreach ($data as $field => $value) { $set[] = "`$field` = ?"; $values[] = $value; } $sql = "UPDATE `$table` SET " . implode(', ', $set); if (!empty($where)) { $sql .= " WHERE $where"; $values = array_merge($values, $whereParams); } if ($this->query($sql, $values)) { return $this->affectedRows; } return false; } /** * 删除数据 * @param string $table 表名 * @param string $where WHERE条件 * @param array $whereParams WHERE参数 * @return bool|int 影响行数或false */ public function delete($table, $where = '', $whereParams = array()) { if (empty($table)) { return false; } $sql = "DELETE FROM `$table`"; if (!empty($where)) { $sql .= " WHERE $where"; } if ($this->query($sql, $whereParams)) { return $this->affectedRows; } return false; } /** * 开启事务 * @return bool */ public function beginTransaction() { return $this->conn->autocommit(false); } /** * 提交事务 * @return bool */ public function commit() { $result = $this->conn->commit(); $this->conn->autocommit(true); return $result; } /** * 回滚事务 * @return bool */ public function rollBack() { $result = $this->conn->rollback(); $this->conn->autocommit(true); return $result; } /** * 获取最后插入ID * @return int */ public function getLastInsertId() { return $this->lastInsertId; } /** * 获取影响行数 * @return int */ public function getAffectedRows() { return $this->affectedRows; } /** * 获取错误信息 * @return string */ public function getError() { return $this->error; } /** * 获取最后执行的SQL * @return string */ public function getLastSql() { return $this->lastSql; } /** * 引用传递参数 * @param array $arr * @return array */ private function refValues($arr) { $refs = array(); foreach ($arr as $key => $value) { $refs[$key] = &$arr[$key]; } return $refs; } /** * 析构函数 */ public function __destruct() { if ($this->conn) { $this->conn->close(); } }}
使用示例
<?php// 引入MySQLiDB类require_once 'MySQLiDB.php';// 配置数据库连接$config = array( 'host' => '127.0.0.1', 'user' => 'root', 'password' => '123456', 'dbname' => 'test_db', 'charset' => 'utf8mb4');// 实例化数据库类$db = new MySQLiDB($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->insert('users', [ 'username' => 'testuser', 'email' => 'test@example.com', 'password' => password_hash('123456', PASSWORD_DEFAULT)]);echo "插入ID: $insertId\n";// 5. 更新数据$affectedRows = $db->update('users', ['status' => 0], 'id = ?', [1]);echo "影响行数: $affectedRows\n";// 6. 删除数据$affectedRows = $db->delete('users', 'id = ?', [2]);echo "删除行数: $affectedRows\n";// 7. 事务处理try { $db->beginTransaction(); $db->update('account', ['balance' => 'balance - 100'], 'user_id = ?', [1] ); $db->update('account', ['balance' => 'balance + 100'], 'user_id = ?', [2] ); $db->commit(); echo "转账成功\n";} catch (Exception $e) { $db->rollBack(); echo "转账失败: " . $e->getMessage() . "\n";}
功能特点
面向对象封装:基于 MySQLi 扩展的面向对象接口
预处理语句:防止 SQL 注入攻击
参数绑定:支持参数化查询
常用方法:
query()
- 执行SQL查询getOne()
- 获取单条记录getAll()
- 获取多条记录getScalar()
- 获取单个值insert()
- 插入数据update()
- 更新数据delete()
- 删除数据事务支持:
beginTransaction()
- 开启事务commit()
- 提交事务rollBack()
- 回滚事务实用功能:
获取最后插入ID
获取影响行数
获取错误信息
获取最后执行的SQL
注意事项
在生产环境中,应该将数据库配置信息存储在安全的地方
对于大型项目,可以考虑使用连接池管理数据库连接
在高并发场景下,可能需要调整 MySQL 服务器的连接数限制
所有数据库操作都应该有适当的错误处理机制
这个 MySQLi 数据库操作类封装了常用的数据库操作方法,可以直接在项目中使用,也可以根据需要进行扩展。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。