PHP数据库模式
外观
PHP数据库模式[编辑 | 编辑源代码]
PHP数据库模式是指在PHP应用程序中与数据库交互的设计方式,它决定了如何组织和管理数据库连接、查询、事务处理等操作。理解数据库模式对于构建高效、可维护的PHP应用程序至关重要。
简介[编辑 | 编辑源代码]
数据库模式定义了PHP应用程序如何与数据库交互,包括:
- 连接管理:如何建立和关闭数据库连接
- 查询执行:如何执行SQL语句并处理结果
- 数据映射:如何将数据库记录映射到PHP对象或数组
- 事务处理:如何管理数据库事务
PHP支持多种数据库模式,从简单的过程式到复杂的ORM(对象关系映射)模式。
基本数据库模式[编辑 | 编辑源代码]
过程式模式[编辑 | 编辑源代码]
这是最基础的数据库交互方式,使用PHP的mysql/mysqli扩展。
<?php
// 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "database");
// 检查连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 执行查询
$sql = "SELECT id, name FROM users";
$result = mysqli_query($conn, $sql);
// 处理结果
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
}
} else {
echo "0 结果";
}
// 关闭连接
mysqli_close($conn);
?>
输出示例:
ID: 1 - Name: John Doe ID: 2 - Name: Jane Smith
面向对象模式[编辑 | 编辑源代码]
使用mysqli或PDO的面向对象接口。
<?php
// 使用PDO连接
try {
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 准备语句
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
// 执行查询
$id = 1;
$stmt->execute();
// 获取结果
$user = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($user);
} catch(PDOException $e) {
echo "错误: " . $e->getMessage();
}
?>
输出示例:
Array ( [id] => 1 [name] => John Doe )
高级数据库模式[编辑 | 编辑源代码]
数据访问对象(DAO)模式[编辑 | 编辑源代码]
DAO模式将数据访问逻辑与业务逻辑分离。
<?php
class UserDAO {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function getUserById($id) {
$stmt = $this->pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
public function getAllUsers() {
$stmt = $this->pdo->query("SELECT * FROM users");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
// 使用示例
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
$userDao = new UserDAO($pdo);
$users = $userDao->getAllUsers();
print_r($users);
?>
活动记录(Active Record)模式[编辑 | 编辑源代码]
每个数据库表对应一个类,类的实例对应表中的一行。
<?php
class User {
private $pdo;
public $id;
public $name;
public $email;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function save() {
if ($this->id) {
// 更新
$stmt = $this->pdo->prepare("UPDATE users SET name=?, email=? WHERE id=?");
$stmt->execute([$this->name, $this->email, $this->id]);
} else {
// 插入
$stmt = $this->pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute([$this->name, $this->email]);
$this->id = $this->pdo->lastInsertId();
}
}
public static function find(PDO $pdo, $id) {
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
$userData = $stmt->fetch(PDO::FETCH_ASSOC);
if ($userData) {
$user = new User($pdo);
$user->id = $userData['id'];
$user->name = $userData['name'];
$user->email = $userData['email'];
return $user;
}
return null;
}
}
// 使用示例
$pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
// 创建新用户
$newUser = new User($pdo);
$newUser->name = "Alice";
$newUser->email = "alice@example.com";
$newUser->save();
// 查找用户
$user = User::find($pdo, 1);
echo $user->name; // 输出: John Doe
?>
ORM(Object-Relational Mapping)模式[编辑 | 编辑源代码]
ORM框架如Doctrine或Eloquent提供了更高级的抽象。
<?php
// 使用Eloquent ORM示例
require 'vendor/autoload.php';
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection([
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'database',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]);
// 定义模型
class User extends Illuminate\Database\Eloquent\Model {
protected $table = 'users';
}
// 查询所有用户
$users = User::all();
foreach ($users as $user) {
echo $user->name;
}
// 创建新用户
$newUser = new User;
$newUser->name = "Bob";
$newUser->email = "bob@example.com";
$newUser->save();
?>
数据库模式比较[编辑 | 编辑源代码]
性能考虑[编辑 | 编辑源代码]
不同数据库模式对性能的影响:
- 过程式:最快但最不安全
- PDO:安全且性能良好
- DAO/Active Record:中等性能,更好的可维护性
- ORM:性能最低但开发效率最高
性能公式:
实际案例[编辑 | 编辑源代码]
电子商务网站用户管理 1. 使用DAO模式处理用户CRUD操作 2. 使用Active Record处理订单和产品 3. 使用ORM处理复杂的关系查询(如用户订单历史)
最佳实践[编辑 | 编辑源代码]
- 小型项目:PDO或Active Record
- 中型项目:DAO模式
- 大型复杂项目:ORM框架
- 始终使用预处理语句防止SQL注入
- 考虑使用连接池管理数据库连接
总结[编辑 | 编辑源代码]
PHP数据库模式的选择取决于项目规模、团队经验和性能需求。初学者应从PDO开始,逐步学习更高级的模式。理解这些模式将帮助你构建更健壮、可维护的PHP应用程序。