prepare("SELECT * FROM users WHERE username = ? AND is_active = 1"); $stmt->execute([$username]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password'])) { // สร้าง Session $_SESSION['user_id'] = $user['id']; $_SESSION['role_id'] = $user['role_id']; $_SESSION['user_name'] = $user['name']; // ค้นหา teacher_id สำหรับทุกคนที่เป็นบุคลากร (Admin, ครู, ผู้บริหาร) if (in_array($user['role_id'], [1, 2, 3])) { $t_stmt = $pdo->prepare("SELECT id FROM teachers WHERE user_id = ?"); $t_stmt->execute([$user['id']]); $teacher = $t_stmt->fetch(); $_SESSION['teacher_id'] = $teacher['id'] ?? null; } header('Location: index.php'); exit; } else { $error = "ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง!"; } } // ========================================== // 3. แสดงหน้าจอ Login (ถ้ายังไม่ได้เข้าระบบ) // ========================================== if (!isset($_SESSION['user_id'])) { ?> เข้าสู่ระบบ - SMILE BKP1School อนุบาล-ประถมศึกษา
query("SELECT COUNT(*) FROM students WHERE is_active = 1")->fetchColumn(); $total_classrooms = $pdo->query("SELECT COUNT(*) FROM classrooms c JOIN academic_years ay ON c.academic_year_id = ay.id WHERE ay.is_current = 1")->fetchColumn(); $total_subjects = $pdo->query("SELECT COUNT(*) FROM subjects")->fetchColumn(); // ----------------------------------------------------- // QUERY ข้อมูลสำหรับ Chart.js // ----------------------------------------------------- // 1. ข้อมูลนักเรียนที่มาเรียน แยกตามเพศ $sql_gender = " SELECT SUM(CASE WHEN TRIM(s.prefix) IN ('ด.ช.', 'ด.ช', 'ดช.', 'ดช', 'นาย', 'เด็กชาย') THEN 1 ELSE 0 END) as m_present, SUM(CASE WHEN TRIM(s.prefix) IN ('ด.ญ.', 'ด.ญ', 'ดญ.', 'ดญ', 'นางสาว', 'น.ส.', 'น.ส', 'เด็กหญิง', 'นาง') THEN 1 ELSE 0 END) as f_present FROM attendance a JOIN students s ON a.student_id = s.id JOIN classrooms c ON a.classroom_id = c.id JOIN academic_years ay ON c.academic_year_id = ay.id AND ay.is_current = 1 WHERE a.attendance_date = ? AND a.status_id IN ('P', 'T', 'C') AND s.is_active = 1 "; $stmt_gender = $pdo->prepare($sql_gender); $stmt_gender->execute([$today]); $gender_data = $stmt_gender->fetch(); $present_male = $gender_data['m_present'] ?: 0; $present_female = $gender_data['f_present'] ?: 0; // 2. ข้อมูลความคืบหน้าการเช็คชื่อ (นับจากจำนวนนักเรียน) // 2.1 นักเรียนทั้งหมดในเทอมปัจจุบันที่อยู่ในห้องเรียน $total_active_st = $pdo->query("SELECT COUNT(sc.student_id) FROM student_classrooms sc JOIN classrooms c ON sc.classroom_id = c.id JOIN academic_years ay ON c.academic_year_id = ay.id AND ay.is_current = 1 JOIN students s ON sc.student_id = s.id AND s.is_active = 1")->fetchColumn() ?: 0; // 2.2 นักเรียนที่ถูกเช็คชื่อไปแล้ว (ไม่ว่าจะมา ขาด ลา สาย) $stmt_checked = $pdo->prepare("SELECT COUNT(a.id) FROM attendance a JOIN classrooms c ON a.classroom_id = c.id JOIN academic_years ay ON c.academic_year_id = ay.id AND ay.is_current = 1 WHERE a.attendance_date = ?"); $stmt_checked->execute([$today]); $total_checked = $stmt_checked->fetchColumn() ?: 0; $total_unchecked = max(0, $total_active_st - $total_checked); $checked_percent = ($total_active_st > 0) ? round(($total_checked / $total_active_st) * 100, 1) : 0; $unchecked_percent = ($total_active_st > 0) ? round(($total_unchecked / $total_active_st) * 100, 1) : 0; // 3. ข้อมูลกราฟแท่ง เปรียบเทียบร้อยละการมาเรียนแต่ละห้อง // ✅ แก้ไข MAMP STRICT MODE (เพิ่ม GROUP BY ให้ครบ) $sql_room_bar = " SELECT c.id, c.grade_level, c.room_number, COUNT(s.id) as total_students, SUM(CASE WHEN a.status_id IN ('P', 'T', 'C') THEN 1 ELSE 0 END) as p_total FROM classrooms c JOIN academic_years ay ON c.academic_year_id = ay.id AND ay.is_current = 1 LEFT JOIN student_classrooms sc ON c.id = sc.classroom_id LEFT JOIN students s ON sc.student_id = s.id AND s.is_active = 1 LEFT JOIN attendance a ON s.id = a.student_id AND a.classroom_id = c.id AND a.attendance_date = ? GROUP BY c.id, c.grade_level, c.room_number HAVING total_students > 0 ORDER BY c.grade_level ASC, c.room_number ASC "; $stmt_room_bar = $pdo->prepare($sql_room_bar); $stmt_room_bar->execute([$today]); $room_bar_data = $stmt_room_bar->fetchAll(); $labels_bar = []; $data_bar_percent = []; foreach($room_bar_data as $rc) { $labels_bar[] = $rc['grade_level'].'/'.$rc['room_number']; // คำนวณร้อยละการมาเรียน $pct = ($rc['total_students'] > 0) ? round(($rc['p_total'] / $rc['total_students']) * 100, 2) : 0; $data_bar_percent[] = $pct; } // ----------------------------------------------------- // QUERY หาห้องที่ยังไม่เช็คชื่อ // ----------------------------------------------------- $sql_missing = " SELECT c.id as classroom_id, c.grade_level, c.room_number, t.first_name, t.last_name, (SELECT COUNT(*) FROM student_classrooms sc WHERE sc.classroom_id = c.id) as std_count FROM classrooms c JOIN academic_years ay ON c.academic_year_id = ay.id AND ay.is_current = 1 LEFT JOIN teachers t ON c.teacher_id = t.id WHERE c.id NOT IN ( SELECT DISTINCT classroom_id FROM attendance WHERE attendance_date = ? ) HAVING std_count > 0 ORDER BY c.grade_level ASC, c.room_number ASC "; $stmt_missing = $pdo->prepare($sql_missing); $stmt_missing->execute([$today]); $missing_rooms = $stmt_missing->fetchAll(); // ----------------------------------------------------- // QUERY ประวัติการให้คะแนนความประพฤติ (ล่าสุด 16 รายการ) // ----------------------------------------------------- // ✅ แก้ไข MAMP STRICT MODE (เพิ่ม GROUP BY ให้ครบถ้วนทุกคอลัมน์ที่ SELECT) $sql_recent_points = " SELECT pt.*, s.student_code, s.prefix, s.first_name, s.last_name, c.grade_level, c.room_number, i.name as item_name, i.action_type as item_action, u.name as teacher_name FROM point_transactions pt JOIN students s ON pt.student_id = s.id LEFT JOIN student_classrooms sc ON s.id = sc.student_id LEFT JOIN classrooms c ON sc.classroom_id = c.id JOIN point_items i ON pt.item_id = i.id LEFT JOIN users u ON pt.recorded_by = u.id GROUP BY pt.id, s.student_code, s.prefix, s.first_name, s.last_name, c.grade_level, c.room_number, i.name, i.action_type, u.name ORDER BY pt.created_at DESC LIMIT 16 "; $stmt_recent = $pdo->prepare($sql_recent_points); $stmt_recent->execute(); $recent_points = $stmt_recent->fetchAll(); // นำเข้า Chart.js echo ''; ?>

ภาพรวมระบบ (Dashboard)

วันที่

ยินดีต้อนรับ, คุณ

สิทธิ์การใช้งาน: 'ผู้ดูแลระบบ (Admin)', 2 => 'ครูประจำชั้น (Teacher)', 3 => 'ผู้บริหาร (Director)']; echo $roles[$_SESSION['role_id']] ?? 'ไม่ระบุ'; ?>

นักเรียนที่มาเรียน (ชาย/หญิง)
ชาย: คน หญิง: คน
ความคืบหน้าการเช็คชื่อวันนี้
เช็คแล้ว % ยังไม่เช็ค %
ร้อยละการมาเรียนแยกตามห้อง
นักเรียนในระบบทั้งหมด
คน
ห้องเรียน (เทอมปัจจุบัน)
ห้อง
รายวิชาทั้งหมด
วิชา
สถานะการเช็คชื่อวันนี้ (ห้องที่ยังไม่ได้เช็ค)
0): ?>

ชั้น

ขาดการเช็คชื่อ

ครูประจำชั้น:

จำนวนนักเรียน: คน

ไปหน้าเช็คชื่อ รอครูประจำชั้นดำเนินการ
ความเคลื่อนไหวพฤติกรรม (ล่าสุด)
ดูประวัติทั้งหมด
ยังไม่มีประวัติการบันทึกคะแนนความประพฤติ

รายการบันทึกพฤติกรรมและความดีล่าสุดจะแสดงที่นี่แบบเรียลไทม์

$rp): $is_add = ($rp['item_action'] == 'add'); $color = $is_add ? 'success' : 'danger'; $icon = $is_add ? 'fa-plus' : 'fa-minus'; $bg_light = $is_add ? 'bg-success-subtle' : 'bg-danger-subtle'; ?>
ชั้น
น.