# TỔNG HỢP BÀI TẬP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ MÃ NGUỒN MỞ TRONG PHP

---

## CHƯƠNG 1 / LAB 1: TỔNG QUAN VỀ LẬP TRÌNH WEB VỚI PHP VÀ MÔI TRƯỜNG PHÁT TRIỂN

### A. Bài tập tại lớp
* **Bài tập 01:** Viết chương trình in ra "Hello PHP!" và hiển thị ngày giờ hiện tại.
* **Bài tập 02:** Tạo biến lưu tên, tuổi và in ra câu giới thiệu: "Xin chào, tôi là ..., năm nay ... tuổi".
* **Bài tập 03:** Viết chương trình tính chu vi và diện tích hình tròn với bán kính nhập từ form GET (`circle_form.html` và `circle.php`).
* **Bài tập 04:** Viết chương trình nhận điểm số từ form POST, in ra xếp loại (Giỏi/Khá/Trung bình/Yếu) (`grade_form.html` và `grade.php`).
* **Bài tập 05:** In bảng cửu chương 2 → 9 bằng vòng lặp `for`.
* **Bài tập 06:** Viết chương trình liệt kê các số nguyên tố từ 1 đến 100.
* **Bài tập 07:** Viết hàm nhận vào bán kính và trả về diện tích hình tròn.
* **Bài tập 08:** Cho mảng số nguyên, viết hàm trả về số lớn nhất và nhỏ nhất trong mảng.
* **Bài tập 09:** Viết hàm đảo ngược một chuỗi (ví dụ: "Hello" → "olleH").
* **Bài tập 10:** Tạo form nhập họ tên, email, số điện thoại (`info_form.html`); xử lý và hiển thị lại thông tin (`info_process.php`).
* **Bài tập 11:** Tạo form upload ảnh (jpg/png) và hiển thị ảnh đã upload (`upload_form.html` và `upload.php`).
* **Bài tập 12:** Viết chương trình ghi thông tin từ form vào file `data.txt` và đọc lại hiển thị (`save_form.html` và `save.php`).
* **Bài tập 13:** Tạo form đăng nhập (username: admin, password: 123). Lưu trạng thái đăng nhập bằng Session, cho phép vào trang `welcome.php` nếu đăng nhập đúng (`login.php`, `welcome.php`, `logout.php`).
* **Bài tập 14:** Tạo Cookie lưu tên đăng nhập trong 1 giờ, tự động hiển thị "Chào mừng lại" nếu quay lại trang (`remember.php`).
* **Bài tập 15 (Mini-project):**
  - Trang 1: Form đăng nhập (admin/123).
  - Trang 2: Đăng nhập đúng thì tạo Session, cho phép upload tập tin và ghi log thông tin (username|filename|time) vào file `data/uploads.txt`.
  - Trang 3: Hiển thị danh sách các tập tin đã upload kèm tên người upload (`files.php`).

### B. Bài tập ôn luyện
* **Bài tập 16:** Viết chương trình nhập một số nguyên N, in ra tổng các số từ 1 đến N.
* **Bài tập 17:** Viết hàm nhận vào chuỗi và trả về chuỗi viết hoa toàn bộ.
* **Bài tập 18:** Viết chương trình quản lý danh sách sinh viên (họ tên, điểm) bằng mảng và hàm, cho phép tìm sinh viên có điểm cao nhất.
* **Bài tập 19:** Tạo form nhập nội dung, lưu vào file `note.txt` và hiển thị toàn bộ nội dung đã lưu.
* **Bài tập 20:** Viết ứng dụng "Ghi nhớ tên": Lần đầu hiển thị form nhập tên, lưu tên vào Cookie, các lần sau tự động chào lại tên đã lưu.

---

## CHƯƠNG 2 / LAB 2: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) TRONG PHP

### A. Bài tập tại lớp
* **Bài tập 01:** Tạo class `Car` với các thuộc tính `brand`, `color` và phương thức `showInfo()`. Khởi tạo 2 đối tượng và hiển thị thông tin.
* **Bài tập 02:** Tạo class `Student` có các thuộc tính `name`, `age` (`private`), Constructor khởi tạo thuộc tính, phương thức `display()`, và Destructor in thông báo hủy đối tượng.
* **Bài tập 03 (Static và Kế thừa):** Tạo class `MathHelper` có phương thức tĩnh `add($a, $b)`. Tạo class `AdvancedMath` kế thừa `MathHelper` và thêm phương thức tĩnh `pow($a, $b)`.
* **Bài tập 04 (Abstract class & Interface):** Tạo abstract class `Animal` có phương thức trừu tượng `makeSound()`. Tạo 2 class `Dog` và `Cat` triển khai `makeSound()`. Tạo interface `CanRun` với phương thức `run()`, class `Dog` triển khai `CanRun`.
* **Bài tập 05 (Namespace & Autoloading):** Tạo class `User` thuộc namespace `App\Models`. Tạo file `autoload.php` bằng `spl_autoload_register()`. Gọi class `User` trong `index.php` mà không require thủ công.

### B. Bài tập ôn luyện
* **Bài tập 06:** Viết class `BankAccount` (số tài khoản, tên chủ tài khoản, số dư) với các phương thức nạp tiền, rút tiền (kiểm tra số dư), và hiển thị số dư.
* **Bài tập 07:** Viết hệ thống quản lý thư viện: Class `Book` (title, author, price), class `Ebook` kế thừa `Book` và thêm `fileSize`, interface `Downloadable` có phương thức `download()`.
* **Bài tập 08:** Viết ứng dụng quản lý sinh viên: Class `Person` (name, age), class `Student` kế thừa `Person` (studentID), Namespace `App\Students`, tự động nạp bằng `spl_autoload_register`.

---

## CHƯƠNG 2 / LAB 3: GIỚI THIỆU JAVASCRIPT VÀ TƯƠNG TÁC VỚI PHP

### A. Bài tập tại lớp
* **Bài tập 01 (JavaScript cơ bản):** Hiển thị "Hello JavaScript", in biến ra console/HTML, kiểm tra tuổi nhập vào (đủ 18 tuổi hay chưa).
* **Bài tập 02 (DOM Manipulation):** Tạo nút đổi màu nền ngẫu nhiên, lấy nội dung input hiển thị ra `div`, tạo danh sách công việc thêm phần tử `li` vào `ul`.
* **Bài tập 03 (Event Handling):** Đổi ảnh khi di chuột vào (hover), validate email bằng Regex khi submit form, tạo đồng hồ thời gian thực cập nhật mỗi giây.
* **Bài tập 04:** Tạo file `time.php` trả về giờ server, dùng Fetch API cập nhật hiển thị lên trang mỗi 5 giây.
* **Bài tập 05:** Tạo form nhập tên, gửi qua AJAX (Fetch API) tới `hello.php`, nhận phản hồi "Xin chào, [tên]" và hiển thị ra HTML.
* **Bài tập 06:** Lấy danh sách sản phẩm từ file JSON (`products.json`) bằng Fetch API và hiển thị dưới dạng bảng HTML.
* **Bài tập 07:** Tìm kiếm sản phẩm: JS gửi từ khóa tới `search.php`, PHP tìm kiếm và trả dữ liệu JSON, JS hiển thị danh sách kết quả.
* **Bài tập 08:** Ứng dụng chat đơn giản: JS gửi tin nhắn tới PHP lưu vào file `chat.txt`, PHP trả về lịch sử chat dạng JSON để JS tự động tải mỗi 2 giây.
* **Bài tập 09:** Ứng dụng dự báo thời tiết (fake data): JS gửi tên thành phố tới `weather.php`, nhận JSON thông tin nhiệt độ/thời tiết và hiển thị ra UI.

### B. Bài tập ôn luyện
* **Bài tập 10:** Xây dựng ứng dụng "To-do list" hoàn chỉnh (thêm, xóa, đánh dấu hoàn thành) lưu dữ liệu vào file JSON thông qua PHP.
* **Bài tập 11:** Ứng dụng hiển thị tỷ giá ngoại tệ bằng AJAX/Fetch API cập nhật dạng bảng định kỳ 10 phút.
* **Bài tập 12:** Xây dựng ứng dụng form đăng ký tài khoản: kiểm tra dữ liệu bằng JavaScript client-side, gửi AJAX sang PHP để lưu vào MySQL.

---

## CHƯƠNG 3 / LAB 4: TƯƠNG TÁC CƠ SỞ DỮ LIỆU VỚI MYSQL VÀ PDO

### A. Bài tập tại lớp
* **Bài tập 01:** Viết chương trình PHP kết nối tới CSDL `labdb` trên MySQL bằng PDO (`connect.php`).
* **Bài tập 02:** Tạo bảng `students` (id, name, email, phone) và thêm một số bản ghi dữ liệu mẫu.
* **Bài tập 03:** Viết chương trình dùng PDO lấy dữ liệu từ bảng `students` và hiển thị dưới dạng bảng HTML (`list_students.php`).
* **Bài tập 04:** Tạo form thêm sinh viên mới (`add_student.php`) và lưu vào CSDL bằng Prepared Statement để chống SQL Injection.
* **Bài tập 05:** Viết chức năng xóa sinh viên theo `id` (`delete_student.php`) có xác nhận JavaScript `confirm()`.
* **Bài tập 06:** Tạo chức năng cập nhật (sửa) thông tin sinh viên (`edit_student.php`).
* **Bài tập 07:** Xây dựng chức năng phân trang (Pagination) kết hợp tìm kiếm theo tên sinh viên bằng PDO Prepared Statement và giao diện Bootstrap 5.

### B. Bài tập ôn luyện
* **Bài tập 08:** Thêm cột `birthday` vào bảng `students` và cập nhật dữ liệu.
* **Bài tập 09:** Viết chức năng tìm kiếm sinh viên theo tên.
* **Bài tập 10:** Chuyển toàn bộ các truy vấn SQL sang dạng Prepared Statement.
* **Bài tập 11:** Thêm tính năng sắp xếp danh sách sinh viên theo tên hoặc email.

---

## CHƯƠNG 3 / LAB 5: TƯƠNG TÁC CƠ SỞ DỮ LIỆU VỚI MYSQL VÀ PDO (NÂNG CAO)

### A. Bài tập tại lớp
* **Bài tập 01:** Thống kê số lượng sản phẩm trong từng loại hàng (`COUNT`, `LEFT JOIN`, `GROUP BY`).
* **Bài tập 02:** Tính tổng doanh thu từng ngày đặt hàng (`SUM(quantity * price)`, `JOIN`, `GROUP BY`).
* **Bài tập 03:** Tìm loại hàng có trên 5 sản phẩm (sử dụng điều kiện lọc `HAVING`).
* **Bài tập 04:** Hiển thị danh sách khách hàng và tổng số tiền đã mua (chỉ hiển thị khách hàng có tổng chi tiêu > 1.000.000 VNĐ).
* **Bài tập 05:** Tìm sản phẩm có giá cao nhất trong từng loại hàng (sử dụng Subquery).
* **Bài tập 06:** Liệt kê các sản phẩm chưa từng được đặt hàng (`LEFT JOIN` kết hợp `IS NULL`).
* **Bài tập 07:** Tìm thông tin khách hàng mua nhiều số lượng sản phẩm nhất (`SUM`, `ORDER BY DESC`, `LIMIT 1`).

### B. Bài tập ôn luyện
* **Bài tập 08:** Thống kê tổng số lượng và doanh thu của từng loại sản phẩm.
* **Bài tập 09:** Tìm 3 sản phẩm bán chạy nhất (dựa trên tổng số lượng bán ra).
* **Bài tập 10:** Liệt kê 5 khách hàng chi tiêu nhiều nhất.
* **Bài tập 11:** Tìm loại hàng mang lại doanh thu cao nhất.
* **Bài tập 12:** Liệt kê tất cả sản phẩm và số lần được đặt hàng (nếu chưa đặt hiển thị 0).

---

## CHƯƠNG 4 / LAB 6: LARAVEL FRAMEWORK - GIỚI THIỆU VÀ CÀI ĐẶT

### A. Bài tập tại lớp
* **Bài tập 01:** Khởi tạo dự án Laravel `Lab01_Framework` qua Composer/Laragon và kiểm tra trang chào mừng.
* **Bài tập 02:** Tạo các Route cơ bản trong `routes/web.php`: `/hello`, `/time` (dùng Carbon/`now()`), và `/sum/{a}/{b}` (tính tổng 2 số).
* **Bài tập 03:** Tạo `StudentController@index`, khai báo mảng tĩnh sinh viên và truyền sang view Blade (`students/index.blade.php`) kế thừa layout `layouts/app.blade.php`.
* **Bài tập 04:** Tạo Model `Student`, Migration `students` (name, email, age, gender), Factory, Seeder gieo 10 bản ghi mẫu và hiển thị từ CSDL bằng Eloquent ORM kết hợp phân trang.
* **Bài tập 05:** Xây dựng giao diện 2 Tab so sánh nguồn dữ liệu: "Mảng tĩnh (Array)" và "CSDL (Eloquent)".
* **Bài tập 06:** Áp dụng Blade Directive hiện đại (`@class`, `@selected`) và tạo Blade Component `<x-badge>` hiển thị nhãn độ tuổi (Adult / Under 18).

### B. Bài tập ôn luyện
* **Bài tập 07:** Tạo trang "Giới thiệu khóa học" (`/about`, `PageController@about`) kế thừa layout chung.
* **Bài tập 08:** Tạo form thêm sinh viên mới có bảo vệ CSRF và Validate dữ liệu cơ bản.
* **Bài tập 09:** Tạo migration mới bổ sung cột `class_name` vào bảng `students` và seed lại dữ liệu.
* **Bài tập 10:** Tạo Component `<x-card>` và tách header/menu ra partial `partials/header.blade.php`.
* **Bài tập 11:** Viết PHPUnit test đơn giản kiểm tra Route `/hello` trả về HTTP 200 OK.

---

## CHƯƠNG 4 / LAB 7: LARAVEL - ROUTING NÂNG CAO, CONTROLLER RESTFUL, BLADE & FORM

### A. Bài tập tại lớp
* **Bài tập 01:** Khai báo Routing nâng cao cho mô-đun Articles: tham số động `{page}`, tham số tùy chọn với regex `{slug?}`, named routes, và route group với prefix `admin`.
* **Bài tập 02:** Tạo `ArticleController` RESTful với 7 action chuẩn và định nghĩa `Route::resource('articles', ArticleController::class)`.
* **Bài tập 03:** Tạo Blade Layout chung (`layouts/app.blade.php`), tách partials (`partials.nav`, `partials.footer`), và sử dụng `@stack('scripts')` / `@push`.
* **Bài tập 04:** Tạo các Blade Component `<x-alert>` và `<x-input>` để tái sử dụng trong form.
* **Bài tập 05:** Xây dựng Form tạo/sửa bài viết (`articles/create.blade.php`, `articles/edit.blade.php`) với `@csrf`, `@method('PUT')`, inline validation và hiển thị thông báo lỗi `@error`.

### B. Bài tập ôn luyện
* **Bài tập 06:** Thử nghiệm Route Model Binding (implicit) với Model `Article`.
* **Bài tập 07:** Xây dựng form xóa an toàn kết hợp Method Spoofing (`DELETE`) và xác nhận JS `confirm()`.
* **Bài tập 08:** Tạo Component `<x-button>` và chèn CSS qua `@push('styles')`.
* **Bài tập 09:** Tối ưu hóa các named routes trong view và tạo breadcrumb động.

---

## CHƯƠNG 4 / LAB 8: LARAVEL - ELOQUENT ORM, MIGRATION, SEEDER, FACTORY VÀ QUAN HỆ CƠ BẢN

### A. Bài tập tại lớp
* **Bài tập 01:** Tạo Migration & Model cho `Category` và `Product`, thiết lập quan hệ One-to-Many (`hasMany` / `belongsTo`).
* **Bài tập 02:** Tạo Seeder và Factory sinh 5 categories, mỗi category tự động gán 10 products bằng Faker.
* **Bài tập 03:** Tạo `ProductController@index`, lấy danh sách sản phẩm kèm danh mục bằng Eager Loading (`Product::with('category')->get()`) để tránh lỗi N+1 query.
* **Bài tập 04:** Cài đặt quan hệ Many-to-Many giữa `Student` và `Course` thông qua bảng trung gian `course_student`, gieo dữ liệu bằng `attach()` trong Seeder và hiển thị danh sách môn học đăng ký của từng sinh viên.

### B. Bài tập ôn luyện
* **Bài tập 05:** Cài đặt quan hệ One-to-One giữa `User` và `Profile` (`hasOne` / `belongsTo`).
* **Bài tập 06:** Bổ sung trường `stock` (tồn kho) vào bảng `products` bằng migration bổ sung.
* **Bài tập 07:** Xây dựng chức năng CRUD Sản phẩm đầy đủ (Create, Read, Update, Delete).
* **Bài tập 08:** Sử dụng Eloquent Query Builder thực hiện các truy vấn nâng cao: tìm sản phẩm giá > 100.000, đếm số sản phẩm từng danh mục (`withCount`).

---

## CHƯƠNG 4 / LAB 9: LARAVEL - VALIDATION, MIDDLEWARE, AUTHENTICATION & AUTHORIZATION

### A. Bài tập tại lớp
* **Bài tập 01:** Chuẩn hóa Validation bằng cách tách logic ra Form Request riêng (`StoreArticleRequest`) cấu hình rules, custom messages, và attributes.
* **Bài tập 02:** Tạo Custom Rule `NoForbiddenWords` kiểm tra từ cấm trong tiêu đề và bổ sung File Validation cho tệp ảnh đại diện upload (`image`, `mimes`, `max`).
* **Bài tập 03:** Tạo Middleware `CheckAdmin` kiểm tra quyền truy cập và cấu hình giới hạn tần suất truy cập Throttle (Rate limiting).
* **Bài tập 04:** Tích hợp Laravel Breeze Authentication, bảo vệ các route tạo/sửa/xóa bài viết bằng middleware `auth`, điều hướng theo trạng thái `@guest` / `@auth`.
* **Bài tập 05:** Phân quyền Authorization bằng Policy (`ArticlePolicy`), đảm bảo chỉ tác giả (owner) mới được phép cập nhật hoặc xóa bài viết.

### B. Bài tập ôn luyện
* **Bài tập 06:** Việt hóa (Localization) toàn bộ thông điệp lỗi Validation trong thư mục `lang/vi`.
* **Bài tập 07:** Cấu hình luồng xác minh email (Email verification) và đặt lại mật khẩu (Password reset).
* **Bài tập 08:** Cấu hình ngoại lệ CSRF cho một endpoint Webhook trong `bootstrap/app.php`.
* **Bài tập 09:** Định nghĩa Gate `admin` tổng quát và ẩn/hiện menu quản trị trong Blade bằng `@can('admin')`.
* **Bài tập 10:** Viết Feature Test đơn giản bằng PHPUnit/Pest kiểm tra luồng đăng nhập và chuyển hướng route bảo vệ.

---

## CHƯƠNG 4 / LAB 11: LARAVEL - QUẢN TRỊ WEBSITE TIN TỨC (ADMIN PANEL & CRUD)

### A. Bài tập tại lớp
* **Bài tập 01:** Xây dựng khu vực quản trị Admin (`/admin`), phân quyền đăng nhập bằng Middleware `auth`, tạo khung Layout Admin chuẩn (`main.blade.php`, `sidebar`, `topbar`, `flash`).
* **Bài tập 02:** Xây dựng module CRUD Danh mục tin tức (`DanhMucController`, `DanhMucRequest`, `DanhMuc` Model) kèm chức năng tìm kiếm và phân trang.
* **Bài tập 03:** Xây dựng module CRUD Bài viết tin tức (`TinTucAdminController`), xử lý upload ảnh đại diện vào `storage/app/public/news`, áp dụng `SoftDeletes` (xóa tạm, khôi phục, xóa vĩnh viễn và dọn dẹp file ảnh).
* **Bài tập 04:** Chuẩn hóa giao diện Dashboard hiển thị số lượng bài viết, số danh mục, số bài viết trong thùng rác và thống nhất style Bootstrap 5.

### B. Bài tập ôn luyện
* **Bài tập 05:** Bổ sung quản lý trạng thái bài viết (Draft / Published) kèm hiển thị Badge màu và bộ lọc tương ứng.
* **Bài tập 06:** Thêm chức năng tự động tạo `slug` duy nhất cho bài viết khi tạo mới hoặc chỉnh sửa (`Str::slug`).
* **Bài tập 07:** Mở rộng form tìm kiếm bài viết nâng cao (theo tiêu đề, danh mục, trạng thái, khoảng ngày đăng) và hỗ trợ upload nhiều ảnh phụ (Gallery) cho bài viết.
* **Bài tập 08:** Phân quyền quản trị dựa trên vai trò (Role-Based Access Control: Admin, Editor) bằng Middleware.
