上一篇
2025年8月),随着PHP 8.4的发布,数据库操作性能再次得到显著提升,这使得使用PHP进行数据库开发比以往任何时候都更加高效,今天我们就来聊聊如何创建一个简单但功能强大的PHP数据库操作类,让你的开发工作更加轻松。
在PHP项目中,直接使用原生MySQLi或PDO函数虽然可行,但会导致代码重复、难以维护,一个好的数据库操作类可以:
下面我们一步步构建一个实用的数据库操作类:
<?php class Database { private $host; private $username; private $password; private $database; private $connection; private $lastQuery; public function __construct($host, $username, $password, $database) { $this->host = $host; $this->username = $username; $this->password = $password; $this->database = $database; $this->connect(); } private function connect() { $this->connection = new mysqli($this->host, $this->username, $this->password, $this->database); if ($this->connection->connect_error) { die("数据库连接失败: " . $this->connection->connect_error); } // 设置字符集 $this->connection->set_charset("utf8mb4"); } // 执行查询 public function query($sql, $params = []) { $stmt = $this->connection->prepare($sql); if (!$stmt) { throw new Exception("SQL准备失败: " . $this->connection->error); } if (!empty($params)) { $types = ''; $bindParams = []; 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([$stmt, 'bind_param'], $this->refValues($bindParams)); } $stmt->execute(); $this->lastQuery = $stmt; return $stmt; } // 获取单行数据 public function fetchOne($sql, $params = []) { $stmt = $this->query($sql, $params); $result = $stmt->get_result(); return $result->fetch_assoc(); } // 获取多行数据 public function fetchAll($sql, $params = []) { $stmt = $this->query($sql, $params); $result = $stmt->get_result(); $rows = []; while ($row = $result->fetch_assoc()) { $rows[] = $row; } return $rows; } // 插入数据并返回ID public function insert($table, $data) { $columns = implode(', ', array_keys($data)); $placeholders = implode(', ', array_fill(0, count($data), '?')); $values = array_values($data); $sql = "INSERT INTO $table ($columns) VALUES ($placeholders)"; $stmt = $this->query($sql, $values); return $this->connection->insert_id; } // 更新数据 public function update($table, $data, $where, $whereParams = []) { $setParts = []; $values = []; foreach ($data as $column => $value) { $setParts[] = "$column = ?"; $values[] = $value; } $sql = "UPDATE $table SET " . implode(', ', $setParts) . " WHERE $where"; $values = array_merge($values, $whereParams); $stmt = $this->query($sql, $values); return $stmt->affected_rows; } // 删除数据 public function delete($table, $where, $params = []) { $sql = "DELETE FROM $table WHERE $where"; $stmt = $this->query($sql, $params); return $stmt->affected_rows; } // 辅助方法:处理引用值 private function refValues($arr) { $refs = []; foreach ($arr as $key => $value) { $refs[$key] = &$arr[$key]; } return $refs; } // 关闭连接 public function close() { if ($this->connection) { $this->connection->close(); } } public function __destruct() { $this->close(); } }
现在我们已经有了一个基础但功能完整的数据库操作类,下面看看如何使用它:
// 初始化数据库连接 $db = new Database('localhost', 'root', 'password', 'my_database'); // 查询单条记录 $user = $db->fetchOne("SELECT * FROM users WHERE id = ?", [1]); echo "用户名: " . $user['username']; // 查询多条记录 $products = $db->fetchAll("SELECT * FROM products WHERE price > ?", [50]); foreach ($products as $product) { echo $product['name'] . " - " . $product['price']; } // 插入数据 $newUserId = $db->insert('users', [ 'username' => 'newuser', 'email' => 'new@example.com', 'password' => password_hash('123456', PASSWORD_DEFAULT) ]); echo "新用户ID: " . $newUserId; // 更新数据 $affectedRows = $db->update('products', ['price' => 99.99], 'id = ?', [5] ); echo "更新了 {$affectedRows} 行数据"; // 删除数据 $deletedRows = $db->delete('users', 'last_login < ?', [strtotime('-1 year')]); echo "删除了 {$deletedRows} 个不活跃用户";
我们的基础类已经很好用了,但还可以添加更多实用功能:
public function beginTransaction() { $this->connection->begin_transaction(); }
public function commit() { $this->connection->commit(); }
public function rollback() { $this->connection->rollback(); }
2. **批量插入**:
```php
public function batchInsert($table, $columns, $rows) {
$placeholders = implode(', ', array_fill(0, count($columns), '?'));
$sql = "INSERT INTO $table (" . implode(', ', $columns) . ") VALUES ";
$values = [];
$sqlParts = [];
foreach ($rows as $row) {
$sqlParts[] = "($placeholders)";
$values = array_merge($values, array_values($row));
}
$sql .= implode(', ', $sqlParts);
$stmt = $this->query($sql, $values);
return $stmt->affected_rows;
}
分页查询:
public function paginate($sql, $params, $page, $perPage) { $countSql = "SELECT COUNT(*) as total FROM ($sql) as subquery"; $total = $this->fetchOne($countSql, $params)['total']; $offset = ($page - 1) * $perPage; $dataSql = $sql . " LIMIT $offset, $perPage"; $data = $this->fetchAll($dataSql, $params); return [ 'total' => $total, 'per_page' => $perPage, 'current_page' => $page, 'last_page' => ceil($total / $perPage), 'data' => $data ]; }
使用数据库类时,安全永远是第一位的:
通过创建一个自定义的PHP数据库操作类,我们大大简化了数据库交互代码,提高了开发效率,同时增强了安全性和可维护性,这个基础类可以根据项目需求进一步扩展,比如添加Redis缓存支持、查询日志等功能。
好的数据库抽象层应该既简单到足以快速上手,又强大到能满足大多数业务需求,希望这个数据库类能为你的PHP开发带来便利!
本文由 阙乐儿 于2025-08-04发表在【云服务器提供商】,文中图片由(阙乐儿)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/534574.html
发表评论