PHP và MySQL – Mô hình DAO

Mô hình DAO (Data Access Object) là một mẫu thiết kế phổ biến trong lập trình để tách rời logic truy cập dữ liệu từ logic nghiệp vụ. Trong PHP, DAO thường được sử dụng để làm việc với cơ sở dữ liệu MySQL nhằm giữ cho mã nguồn sạch sẽ, dễ bảo trì và dễ mở rộng.

Mô hình DAO trong PHP và MySQL

1. Cấu trúc thư mục

Bạn có thể cấu trúc các tệp tin của mình như sau:

/project
    /config
        database.php
    /dao
        UserDAO.php
    /models
        User.php
    /controllers
        UserController.php
    /views
        user_view.php
    index.php

2. Tệp cấu hình cơ sở dữ liệu (database.php)

Tệp này chứa các thiết lập kết nối cơ sở dữ liệu và tạo kết nối PDO:

<?php
class Database {
    private $host = "localhost";
    private $dbname = "database_name";
    private $username = "username";
    private $password = "password";
    public $conn;

    public function getConnection() {
        $this->conn = null;

        try {
            $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
            $this->conn->exec("set names utf8");
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $exception) {
            echo "Connection error: " . $exception->getMessage();
        }

        return $this->conn;
    }
}
?>

3. Lớp mô hình (User.php)

Lớp này đại diện cho một đối tượng dữ liệu cụ thể, ví dụ như một người dùng.

<?php
class User {
    private $id;
    private $name;
    private $email;

    // Getter và Setter cho từng thuộc tính
    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getEmail() {
        return $this->email;
    }

    public function setEmail($email) {
        $this->email = $email;
    }
}
?>

4. Lớp DAO (UserDAO.php)

Lớp này chịu trách nhiệm thao tác với cơ sở dữ liệu liên quan đến đối tượng User.

<?php
require_once 'config/database.php';
require_once 'models/User.php';

class UserDAO {
    private $conn;

    public function __construct() {
        $database = new Database();
        $this->conn = $database->getConnection();
    }

    public function getAllUsers() {
        $query = "SELECT id, name, email FROM users";
        $stmt = $this->conn->prepare($query);
        $stmt->execute();

        $users = [];

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $user = new User();
            $user->setId($row['id']);
            $user->setName($row['name']);
            $user->setEmail($row['email']);

            $users[] = $user;
        }

        return $users;
    }

    public function getUserById($id) {
        $query = "SELECT id, name, email FROM users WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $id);
        $stmt->execute();

        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        $user = new User();
        $user->setId($row['id']);
        $user->setName($row['name']);
        $user->setEmail($row['email']);

        return $user;
    }

    public function createUser($user) {
        $query = "INSERT INTO users SET name=:name, email=:email";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":name", $user->getName());
        $stmt->bindParam(":email", $user->getEmail());

        if($stmt->execute()) {
            return true;
        }
        return false;
    }

    public function updateUser($user) {
        $query = "UPDATE users SET name=:name, email=:email WHERE id=:id";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":name", $user->getName());
        $stmt->bindParam(":email", $user->getEmail());
        $stmt->bindParam(":id", $user->getId());

        if($stmt->execute()) {
            return true;
        }
        return false;
    }

    public function deleteUser($id) {
        $query = "DELETE FROM users WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $id);

        if($stmt->execute()) {
            return true;
        }
        return false;
    }
}
?>

5. Lớp điều khiển (UserController.php)

Lớp này là cầu nối giữa mô hình (model) và giao diện (view). Nó nhận yêu cầu từ người dùng, gọi lớp DAO để lấy dữ liệu, và sau đó gửi dữ liệu đó đến view.

<?php
require_once 'dao/UserDAO.php';

class UserController {
    private $userDAO;

    public function __construct() {
        $this->userDAO = new UserDAO();
    }

    public function listUsers() {
        return $this->userDAO->getAllUsers();
    }

    public function getUser($id) {
        return $this->userDAO->getUserById($id);
    }

    public function createUser($name, $email) {
        $user = new User();
        $user->setName($name);
        $user->setEmail($email);

        return $this->userDAO->createUser($user);
    }

    public function updateUser($id, $name, $email) {
        $user = new User();
        $user->setId($id);
        $user->setName($name);
        $user->setEmail($email);

        return $this->userDAO->updateUser($user);
    }

    public function deleteUser($id) {
        return $this->userDAO->deleteUser($id);
    }
}
?>

6. View (user_view.php)

View chịu trách nhiệm hiển thị dữ liệu cho người dùng. Bạn có thể dùng view để hiển thị danh sách người dùng, thông tin người dùng cụ thể, hoặc các form để nhập liệu.

<?php
require_once 'controllers/UserController.php';

$userController = new UserController();
$users = $userController->listUsers();
?>

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Danh sách người dùng</title>
</head>
<body>
    <h1>Danh sách người dùng</h1>
    <ul>
        <?php foreach ($users as $user) { ?>
            <li><?php echo "ID: " . $user->getId() . " - Tên: " . $user->getName() . " - Email: " . $user->getEmail(); ?></li>
        <?php } ?>
    </ul>
</body>
</html>

Cách hoạt động của mô hình DAO:

  1. Model (User.php): Đại diện cho dữ liệu người dùng và chứa các phương thức getter và setter để truy xuất và thay đổi thuộc tính.
  2. DAO (UserDAO.php): Quản lý các truy vấn cơ sở dữ liệu, thực hiện các tác vụ như thêm, sửa, xóa, và lấy dữ liệu người dùng.
  3. Controller (UserController.php): Xử lý logic nghiệp vụ, nhận yêu cầu từ người dùng và tương tác với DAO.
  4. View (user_view.php): Hiển thị dữ liệu người dùng cho người dùng cuối.

Mô hình DAO giúp mã nguồn của bạn trở nên tổ chức hơn, dễ quản lý và dễ dàng mở rộng khi cần. Nó tách biệt các lớp truy cập dữ liệu với lớp nghiệp vụ, làm cho mã nguồn dễ bảo trì và phát triển hơn.