'', 'email' => '', 'age' => '20', 'gender' => 'male', 'class_name' => 'CNTT-K18A']; $success = null; $dbError = null; $students = []; try { $pdo = getPdoConnection(); $pdo->exec(" CREATE TABLE IF NOT EXISTS `students` ( `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL UNIQUE, `age` INT UNSIGNED NOT NULL DEFAULT 18, `gender` ENUM('male', 'female') NOT NULL DEFAULT 'male', `class_name` VARCHAR(50) NULL DEFAULT 'CNTT-K18A', `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $token = $_POST['_token'] ?? ''; $old['name'] = trim((string) ($_POST['name'] ?? '')); $old['email'] = trim((string) ($_POST['email'] ?? '')); $old['age'] = trim((string) ($_POST['age'] ?? '')); $old['gender'] = trim((string) ($_POST['gender'] ?? '')); $old['class_name'] = trim((string) ($_POST['class_name'] ?? 'CNTT-K18A')); // Kiểm tra CSRF Token (@csrf) if (!hash_equals($_SESSION['csrf_token'], $token)) { $errors['csrf'] = 'HTTP 419 Page Expired: CSRF token không hợp lệ!'; } // Validate dữ liệu tương đương $request->validate() if ($old['name'] === '') { $errors['name'] = 'Vui lòng nhập họ và tên sinh viên.'; } elseif (mb_strlen($old['name']) < 3) { $errors['name'] = 'Họ và tên phải có ít nhất 3 ký tự.'; } if ($old['email'] === '') { $errors['email'] = 'Vui lòng nhập địa chỉ email.'; } elseif (!filter_var($old['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = 'Địa chỉ email không đúng định dạng.'; } else { $chk = $pdo->prepare("SELECT COUNT(*) FROM `students` WHERE `email` = :email"); $chk->execute([':email' => $old['email']]); if ((int) $chk->fetchColumn() > 0) { $errors['email'] = 'Email này đã tồn tại trong hệ thống.'; } } if ($old['age'] === '' || !ctype_digit($old['age'])) { $errors['age'] = 'Tuổi phải là một số nguyên hợp lệ.'; } elseif ((int) $old['age'] < 15 || (int) $old['age'] > 100) { $errors['age'] = 'Tuổi sinh viên phải nằm trong khoảng từ 15 đến 100.'; } if (!in_array($old['gender'], ['male', 'female'], true)) { $errors['gender'] = 'Vui lòng chọn giới tính hợp lệ.'; } if (empty($errors)) { $ins = $pdo->prepare(" INSERT INTO `students` (`name`, `email`, `age`, `gender`, `class_name`, `created_at`, `updated_at`) VALUES (:name, :email, :age, :gender, :class_name, NOW(), NOW()) "); $ins->execute([ ':name' => $old['name'], ':email' => $old['email'], ':age' => (int) $old['age'], ':gender' => $old['gender'], ':class_name' => $old['class_name'] !== '' ? $old['class_name'] : 'CNTT-K18A', ]); $success = 'Đã thêm sinh viên "' . $old['name'] . '" vào bảng students thành công!'; $old = ['name' => '', 'email' => '', 'age' => '20', 'gender' => 'male', 'class_name' => 'CNTT-K18A']; } } $students = $pdo->query("SELECT * FROM `students` ORDER BY `id` DESC LIMIT 8")->fetchAll(); } catch (Throwable $e) { $dbError = $e->getMessage(); } $createViewCode = is_file(__DIR__ . '/../resources/views/students/create.blade.php') ? file_get_contents(__DIR__ . '/../resources/views/students/create.blade.php') : ''; $controllerCode = is_file(__DIR__ . '/../app/Http/Controllers/StudentController.php') ? file_get_contents(__DIR__ . '/../app/Http/Controllers/StudentController.php') : ''; ?> Bài 08 - Form thêm Sinh viên mới (@csrf & Validation) | Lab 06
BÀI TẬP 08

Form thêm Sinh viên mới có bảo vệ CSRF (@csrf) & Validate dữ liệu

Thực hành tạo Route GET /students/create và POST /students, kiểm tra token @csrf chống tấn công giả mạo truy vấn và validate dữ liệu với $request->validate() trước khi gọi Student::create($validated).

Thêm Sinh viên mới (POST /students)
@csrf token: ...
Các bản ghi mới nhất trong bảng students
#ID Họ và tên Email Tuổi Giới tính
#
1. View resources/views/students/create.blade.php
2. Controller app/Http/Controllers/StudentController.php