PHP và MySQL – Order DAO

Mô hình DAO cho Order (Đơn hàng) sẽ giúp quản lý các thao tác CRUD (Create, Read, Update, Delete) liên quan đến đơn hàng trong cơ sở dữ liệu. Dưới đây là cách triển khai chi tiết mô hình DAO cho Order 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
        OrderDAO.php
    /models
        Order.php
    /controllers
        OrderController.php
    /views
        order_view.php
    index.php

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

Tệp này chứa 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 (Order.php)

Lớp Order đại diện cho một đối tượng đơn hàng với các thuộc tính như id, user_id, order_date, status, v.v. và các phương thức getter và setter tương ứng.

<?php
class Order {
    private $id;
    private $user_id;
    private $order_date;
    private $status;

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

    public function setUserId($user_id) {
        $this->user_id = $user_id;
    }

    public function getOrderDate() {
        return $this->order_date;
    }

    public function setOrderDate($order_date) {
        $this->order_date = $order_date;
    }

    public function getStatus() {
        return $this->status;
    }

    public function setStatus($status) {
        $this->status = $status;
    }
}
?>

4. Lớp DAO (OrderDAO.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 đơn hàng.

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

class OrderDAO {
    private $conn;

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

    public function getAllOrders() {
        $query = "SELECT id, user_id, order_date, status FROM orders";
        $stmt = $this->conn->prepare($query);
        $stmt->execute();

        $orders = [];

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $order = new Order();
            $order->setId($row['id']);
            $order->setUserId($row['user_id']);
            $order->setOrderDate($row['order_date']);
            $order->setStatus($row['status']);

            $orders[] = $order;
        }

        return $orders;
    }

    public function getOrderById($id) {
        $query = "SELECT id, user_id, order_date, status FROM orders WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $id);
        $stmt->execute();

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

        $order = new Order();
        $order->setId($row['id']);
        $order->setUserId($row['user_id']);
        $order->setOrderDate($row['order_date']);
        $order->setStatus($row['status']);

        return $order;
    }

    public function createOrder($order) {
        $query = "INSERT INTO orders SET user_id=:user_id, order_date=:order_date, status=:status";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":user_id", $order->getUserId());
        $stmt->bindParam(":order_date", $order->getOrderDate());
        $stmt->bindParam(":status", $order->getStatus());

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

    public function updateOrder($order) {
        $query = "UPDATE orders SET user_id=:user_id, order_date=:order_date, status=:status WHERE id=:id";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":user_id", $order->getUserId());
        $stmt->bindParam(":order_date", $order->getOrderDate());
        $stmt->bindParam(":status", $order->getStatus());
        $stmt->bindParam(":id", $order->getId());

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

    public function deleteOrder($id) {
        $query = "DELETE FROM orders 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 (OrderController.php)

Lớp điều khiển (Controller) kết nối giữa các lớp DAO và View, xử lý logic nghiệp vụ cho đơn hàng.

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

class OrderController {
    private $orderDAO;

    public function __construct() {
        $this->orderDAO = new OrderDAO();
    }

    public function listOrders() {
        return $this->orderDAO->getAllOrders();
    }

    public function getOrder($id) {
        return $this->orderDAO->getOrderById($id);
    }

    public function createOrder($user_id, $order_date, $status) {
        $order = new Order();
        $order->setUserId($user_id);
        $order->setOrderDate($order_date);
        $order->setStatus($status);

        return $this->orderDAO->createOrder($order);
    }

    public function updateOrder($id, $user_id, $order_date, $status) {
        $order = new Order();
        $order->setId($id);
        $order->setUserId($user_id);
        $order->setOrderDate($order_date);
        $order->setStatus($status);

        return $this->orderDAO->updateOrder($order);
    }

    public function deleteOrder($id) {
        return $this->orderDAO->deleteOrder($id);
    }
}
?>

6. View (order_view.php)

View chịu trách nhiệm hiển thị thông tin về các đơn hàng cho người dùng.

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

$orderController = new OrderController();
$orders = $orderController->listOrders();
?>

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Danh sách đơn hàng</title>
</head>
<body>
    <h1>Danh sách đơn hàng</h1>
    <ul>
        <?php foreach ($orders as $order) { ?>
            <li><?php echo "ID: " . $order->getId() . " - User ID: " . $order->getUserId() . " - Ngày đặt hàng: " . $order->getOrderDate() . " - Trạng thái: " . $order->getStatus(); ?></li>
        <?php } ?>
    </ul>
</body>
</html>

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

  1. Model (Order.php): Đại diện cho dữ liệu đơn hàng với các thuộc tính như id, user_id, order_date, status.
  2. DAO (OrderDAO.php): Thực hiện các thao tác CRUD (Create, Read, Update, Delete) với cơ sở dữ liệu liên quan đến đơn hàng.
  3. Controller (OrderController.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 (order_view.php): Hiển thị dữ liệu đơn hàng, chẳng hạn như danh sách các đơn hàng.

Mô hình DAO này giúp mã nguồn của bạn dễ quản lý, bảo trì 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.