0) { $stmt = $pdo->prepare("UPDATE students SET name = :name, email = :email, phone = :phone, birthday = :birthday WHERE id = :id"); $stmt->execute([ ':name' => $name, ':email' => $email, ':phone' => $phone !== '' ? $phone : null, ':birthday' => $birthday !== '' ? $birthday : null, ':id' => $id, ]); $msg = "Đã cập nhật sinh viên #{$id} ({$name}) thành công!"; } else { $stmt = $pdo->prepare("INSERT INTO students (name, email, phone, birthday) VALUES (:name, :email, :phone, :birthday)"); $stmt->execute([ ':name' => $name, ':email' => $email, ':phone' => $phone !== '' ? $phone : null, ':birthday' => $birthday !== '' ? $birthday : null, ]); $msg = "Đã thêm sinh viên mới \"{$name}\" thành công!"; } } elseif ($action === 'delete') { $delId = (int)($_POST['id'] ?? 0); if ($delId > 0) { $stmt = $pdo->prepare("DELETE FROM students WHERE id = :id"); $stmt->execute([':id' => $delId]); $msg = "Đã xóa sinh viên #{$delId} thành công!"; } } } // Nếu người dùng bấm nút Sửa if (isset($_GET['edit_id'])) { $editStmt = $pdo->prepare("SELECT * FROM students WHERE id = :id"); $editStmt->execute([':id' => (int)$_GET['edit_id']]); $editStudent = $editStmt->fetch() ?: null; } // 1. Đếm tổng số bản ghi khớp từ khóa tìm kiếm $whereSql = ''; $params = []; if ($keyword !== '') { $whereSql = 'WHERE name LIKE :kw'; $params[':kw'] = '%' . $keyword . '%'; } $countStmt = $pdo->prepare("SELECT COUNT(*) FROM students {$whereSql}"); $countStmt->execute($params); $totalRecords = (int)$countStmt->fetchColumn(); $totalPages = max(1, (int)ceil($totalRecords / $perPage)); if ($currentPage > $totalPages) { $currentPage = $totalPages; } $offset = ($currentPage - 1) * $perPage; // 2. Lấy dữ liệu phân trang bằng LIMIT & OFFSET $listSql = "SELECT id, name, email, phone, birthday, created_at FROM students {$whereSql} ORDER BY id ASC LIMIT :limit OFFSET :offset"; $listStmt = $pdo->prepare($listSql); if ($keyword !== '') { $listStmt->bindValue(':kw', '%' . $keyword . '%', PDO::PARAM_STR); } $listStmt->bindValue(':limit', $perPage, PDO::PARAM_INT); $listStmt->bindValue(':offset', $offset, PDO::PARAM_INT); $listStmt->execute(); $students = $listStmt->fetchAll(); } catch (Throwable $e) { $connectionError = $e; } function buildBai07PageUrl(int $page, string $keyword): string { $query = ['page' => $page]; if ($keyword !== '') { $query['q'] = $keyword; } return 'index.php?' . http_build_query($query); } ?> Bài 07 - Phân trang & Tìm kiếm Sinh viên (Bootstrap 5 + PDO)
✅
⚠️

Bài 07: Phân trang ( SV/trang) & Tìm kiếm

Hiển thị trang / (Tổng cộng sinh viên)
Xóa lọc
ID Họ và tên Email Điện thoại Ngày sinh Thao tác
Không tìm thấy sinh viên nào phù hợp.
# Sửa