跳转到内容

PHP数据库模式

来自代码酷
Admin留言 | 贡献2025年5月2日 (五) 00:28的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

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();
?>

数据库模式比较[编辑 | 编辑源代码]

pie title PHP数据库模式使用场景 "过程式" : 15 "面向对象(PDO)" : 30 "DAO模式" : 25 "Active Record" : 20 "ORM" : 10

性能考虑[编辑 | 编辑源代码]

不同数据库模式对性能的影响:

  • 过程式:最快但最不安全
  • PDO:安全且性能良好
  • DAO/Active Record:中等性能,更好的可维护性
  • ORM:性能最低但开发效率最高

性能公式:Performance=Execution SpeedDevelopment Time

实际案例[编辑 | 编辑源代码]

电子商务网站用户管理 1. 使用DAO模式处理用户CRUD操作 2. 使用Active Record处理订单和产品 3. 使用ORM处理复杂的关系查询(如用户订单历史)

最佳实践[编辑 | 编辑源代码]

  • 小型项目:PDO或Active Record
  • 中型项目:DAO模式
  • 大型复杂项目:ORM框架
  • 始终使用预处理语句防止SQL注入
  • 考虑使用连接池管理数据库连接

总结[编辑 | 编辑源代码]

PHP数据库模式的选择取决于项目规模、团队经验和性能需求。初学者应从PDO开始,逐步学习更高级的模式。理解这些模式将帮助你构建更健壮、可维护的PHP应用程序。