PHP và MySQL – Category DAO

Mô hình DAO cho một danh mục (Category) trong PHP hoạt động tương tự như mô hình DAO cho người dùng (User), nhưng thay vì làm việc với dữ liệu người dùng, bạn sẽ thao tác với các danh mục sản phẩm, bài viết, hoặc bất kỳ loại danh mục nào khác. Dưới đây là một ví dụ về cách triển khai mô hình DAO cho đối tượng Category.

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

Giả sử chúng ta giữ nguyên cấu trúc thư mục như sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/project
/config
database.php
/dao
CategoryDAO.php
/models
Category.php
/controllers
CategoryController.php
/views
category_view.php
index.php
/project /config database.php /dao CategoryDAO.php /models Category.php /controllers CategoryController.php /views category_view.php index.php
/project
    /config
        database.php
    /dao
        CategoryDAO.php
    /models
        Category.php
    /controllers
        CategoryController.php
    /views
        category_view.php
    index.php

2. Lớp mô hình (Category.php)

Lớp này đại diện cho một đối tượng Category.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
class Category {
private $id;
private $name;
private $description;
// 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 getDescription() {
return $this->description;
}
public function setDescription($description) {
$this->description = $description;
}
}
?>
<?php class Category { private $id; private $name; private $description; // 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 getDescription() { return $this->description; } public function setDescription($description) { $this->description = $description; } } ?>
<?php
class Category {
    private $id;
    private $name;
    private $description;

    // 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 getDescription() {
        return $this->description;
    }

    public function setDescription($description) {
        $this->description = $description;
    }
}
?>

3. Lớp DAO (CategoryDAO.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 Category.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require_once 'config/database.php';
require_once 'models/Category.php';
class CategoryDAO {
private $conn;
public function __construct() {
$database = new Database();
$this->conn = $database->getConnection();
}
public function getAllCategories() {
$query = "SELECT id, name, description FROM categories";
$stmt = $this->conn->prepare($query);
$stmt->execute();
$categories = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$category = new Category();
$category->setId($row['id']);
$category->setName($row['name']);
$category->setDescription($row['description']);
$categories[] = $category;
}
return $categories;
}
public function getCategoryById($id) {
$query = "SELECT id, name, description FROM categories WHERE id = ?";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(1, $id);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$category = new Category();
$category->setId($row['id']);
$category->setName($row['name']);
$category->setDescription($row['description']);
return $category;
}
public function createCategory($category) {
$query = "INSERT INTO categories SET name=:name, description=:description";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(":name", $category->getName());
$stmt->bindParam(":description", $category->getDescription());
if($stmt->execute()) {
return true;
}
return false;
}
public function updateCategory($category) {
$query = "UPDATE categories SET name=:name, description=:description WHERE id=:id";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(":name", $category->getName());
$stmt->bindParam(":description", $category->getDescription());
$stmt->bindParam(":id", $category->getId());
if($stmt->execute()) {
return true;
}
return false;
}
public function deleteCategory($id) {
$query = "DELETE FROM categories WHERE id = ?";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(1, $id);
if($stmt->execute()) {
return true;
}
return false;
}
}
?>
<?php require_once 'config/database.php'; require_once 'models/Category.php'; class CategoryDAO { private $conn; public function __construct() { $database = new Database(); $this->conn = $database->getConnection(); } public function getAllCategories() { $query = "SELECT id, name, description FROM categories"; $stmt = $this->conn->prepare($query); $stmt->execute(); $categories = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $category = new Category(); $category->setId($row['id']); $category->setName($row['name']); $category->setDescription($row['description']); $categories[] = $category; } return $categories; } public function getCategoryById($id) { $query = "SELECT id, name, description FROM categories WHERE id = ?"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $id); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); $category = new Category(); $category->setId($row['id']); $category->setName($row['name']); $category->setDescription($row['description']); return $category; } public function createCategory($category) { $query = "INSERT INTO categories SET name=:name, description=:description"; $stmt = $this->conn->prepare($query); $stmt->bindParam(":name", $category->getName()); $stmt->bindParam(":description", $category->getDescription()); if($stmt->execute()) { return true; } return false; } public function updateCategory($category) { $query = "UPDATE categories SET name=:name, description=:description WHERE id=:id"; $stmt = $this->conn->prepare($query); $stmt->bindParam(":name", $category->getName()); $stmt->bindParam(":description", $category->getDescription()); $stmt->bindParam(":id", $category->getId()); if($stmt->execute()) { return true; } return false; } public function deleteCategory($id) { $query = "DELETE FROM categories WHERE id = ?"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $id); if($stmt->execute()) { return true; } return false; } } ?>
<?php
require_once 'config/database.php';
require_once 'models/Category.php';

class CategoryDAO {
    private $conn;

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

    public function getAllCategories() {
        $query = "SELECT id, name, description FROM categories";
        $stmt = $this->conn->prepare($query);
        $stmt->execute();

        $categories = [];

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $category = new Category();
            $category->setId($row['id']);
            $category->setName($row['name']);
            $category->setDescription($row['description']);

            $categories[] = $category;
        }

        return $categories;
    }

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

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

        $category = new Category();
        $category->setId($row['id']);
        $category->setName($row['name']);
        $category->setDescription($row['description']);

        return $category;
    }

    public function createCategory($category) {
        $query = "INSERT INTO categories SET name=:name, description=:description";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":name", $category->getName());
        $stmt->bindParam(":description", $category->getDescription());

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

    public function updateCategory($category) {
        $query = "UPDATE categories SET name=:name, description=:description WHERE id=:id";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":name", $category->getName());
        $stmt->bindParam(":description", $category->getDescription());
        $stmt->bindParam(":id", $category->getId());

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

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

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

4. Lớp điều khiển (CategoryController.php)

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require_once 'dao/CategoryDAO.php';
class CategoryController {
private $categoryDAO;
public function __construct() {
$this->categoryDAO = new CategoryDAO();
}
public function listCategories() {
return $this->categoryDAO->getAllCategories();
}
public function getCategory($id) {
return $this->categoryDAO->getCategoryById($id);
}
public function createCategory($name, $description) {
$category = new Category();
$category->setName($name);
$category->setDescription($description);
return $this->categoryDAO->createCategory($category);
}
public function updateCategory($id, $name, $description) {
$category = new Category();
$category->setId($id);
$category->setName($name);
$category->setDescription($description);
return $this->categoryDAO->updateCategory($category);
}
public function deleteCategory($id) {
return $this->categoryDAO->deleteCategory($id);
}
}
?>
<?php require_once 'dao/CategoryDAO.php'; class CategoryController { private $categoryDAO; public function __construct() { $this->categoryDAO = new CategoryDAO(); } public function listCategories() { return $this->categoryDAO->getAllCategories(); } public function getCategory($id) { return $this->categoryDAO->getCategoryById($id); } public function createCategory($name, $description) { $category = new Category(); $category->setName($name); $category->setDescription($description); return $this->categoryDAO->createCategory($category); } public function updateCategory($id, $name, $description) { $category = new Category(); $category->setId($id); $category->setName($name); $category->setDescription($description); return $this->categoryDAO->updateCategory($category); } public function deleteCategory($id) { return $this->categoryDAO->deleteCategory($id); } } ?>
<?php
require_once 'dao/CategoryDAO.php';

class CategoryController {
    private $categoryDAO;

    public function __construct() {
        $this->categoryDAO = new CategoryDAO();
    }

    public function listCategories() {
        return $this->categoryDAO->getAllCategories();
    }

    public function getCategory($id) {
        return $this->categoryDAO->getCategoryById($id);
    }

    public function createCategory($name, $description) {
        $category = new Category();
        $category->setName($name);
        $category->setDescription($description);

        return $this->categoryDAO->createCategory($category);
    }

    public function updateCategory($id, $name, $description) {
        $category = new Category();
        $category->setId($id);
        $category->setName($name);
        $category->setDescription($description);

        return $this->categoryDAO->updateCategory($category);
    }

    public function deleteCategory($id) {
        return $this->categoryDAO->deleteCategory($id);
    }
}
?>

5. View (category_view.php)

View hiển thị danh sách các danh mục và các thông tin chi tiết về từng danh mục.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require_once 'controllers/CategoryController.php';
$categoryController = new CategoryController();
$categories = $categoryController->listCategories();
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<title>Danh sách danh mục</title>
</head>
<body>
<h1>Danh sách danh mục</h1>
<ul>
<?php foreach ($categories as $category) { ?>
<li><?php echo "ID: " . $category->getId() . " - Tên: " . $category->getName() . " - Mô tả: " . $category->getDescription(); ?></li>
<?php } ?>
</ul>
</body>
</html>
<?php require_once 'controllers/CategoryController.php'; $categoryController = new CategoryController(); $categories = $categoryController->listCategories(); ?> <!DOCTYPE html> <html lang="vi"> <head> <meta charset="UTF-8"> <title>Danh sách danh mục</title> </head> <body> <h1>Danh sách danh mục</h1> <ul> <?php foreach ($categories as $category) { ?> <li><?php echo "ID: " . $category->getId() . " - Tên: " . $category->getName() . " - Mô tả: " . $category->getDescription(); ?></li> <?php } ?> </ul> </body> </html>
<?php
require_once 'controllers/CategoryController.php';

$categoryController = new CategoryController();
$categories = $categoryController->listCategories();
?>

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Danh sách danh mục</title>
</head>
<body>
    <h1>Danh sách danh mục</h1>
    <ul>
        <?php foreach ($categories as $category) { ?>
            <li><?php echo "ID: " . $category->getId() . " - Tên: " . $category->getName() . " - Mô tả: " . $category->getDescription(); ?></li>
        <?php } ?>
    </ul>
</body>
</html>

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

  1. Model (Category.php): Đại diện cho dữ liệu của một danh mục và chứa các phương thức getter và setter để truy xuất và thay đổi thuộc tính.
  2. DAO (CategoryDAO.php): Quản lý các truy vấn cơ sở dữ liệu liên quan đến danh mục, thực hiện các tác vụ như thêm, sửa, xóa, và lấy dữ liệu danh mục.
  3. Controller (CategoryController.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 (category_view.php): Hiển thị danh sách các danh mục và thông tin liên quan đến người dùng cuối.

Mô hình này 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.