'', '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).