PHP và MySQL – User DAO

Mô hình DAO (Data Access Object) cho User là một mẫu thiết kế giúp tách biệt logic truy cập dữ liệu với logic nghiệp vụ trong ứng dụng PHP. Mô hình này giúp mã nguồn dễ bảo trì, mở rộng và cải tiến. Dưới đây là hướng dẫn cụ thể về cách xây dựng mô hình DAO cho User trong PHP.

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

Giữ nguyên cấu trúc thư mục như sau để tổ chức các tệp tin của bạn:

/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 thông tin và logic kết nối tới cơ sở dữ liệu sử dụng 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 User đại diện cho một đối tượng người dùng với các thuộc tính như id, name, email, v.v. và các phương thức getter và setter tương ứ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 về các thao tác cơ sở dữ liệu như thêm, sửa, xóa, và truy vấn dữ liệu liên quan đến người dùng.

<?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 điều khiển (Controller) là nơi xử lý logic nghiệp vụ và kết nối giữa các lớp DAO và 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ị thông tin cho người dùng. Trong trường hợp này, nó sẽ hiển thị danh sách người dùng.

<?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>

Tóm tắt mô hình DAO cho User:

  1. Model (User.php): Đại diện cho dữ liệu người dùng với các thuộc tính như id, name, email.
  2. DAO (UserDAO.php): Thực hiện các thao tác CRUD (Create, Read, Update, Delete) với cơ sở dữ liệu.
  3. Controller (UserController.php): Xử lý logic nghiệp vụ, tương tác với DAO và chuẩn bị dữ liệu cho View.
  4. View (user_view.php): Hiển thị dữ liệu người dùng, chẳng hạn như danh sách người dùng.

Mô hình DAO này giúp mã nguồn trở nên rõ ràng, dễ quản lý và mở rộng, đồng thời tăng cường tính bảo mật và tái sử dụng mã nguồn.