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 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 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 và để 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 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.