PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } catch (PDOException $e) { // If database request is AJAX, send JSON error if (isset($_GET['action']) || isset($_POST['action'])) { header('Content-Type: application/json'); echo json_encode(['status' => 'error', 'message' => 'Koneksi database gagal. Periksa setting $db_user dan $db_pass di index.php']); exit; } // Render error view on regular load $db_error_message = "Gagal terhubung ke MySQL Database ($db_name). Silahkan sesuaikan variabel \$db_user, \$db_pass, dan \$db_name di bagian atas file index.php ini."; } if (isset($_REQUEST['action'])) { header('Content-Type: application/json'); $action = $_REQUEST['action']; if (!isset($pdo)) { echo json_encode(['status' => 'error', 'message' => $db_error_message ?? 'Database Offline']); exit; } try { switch ($action) { case 'login': $username = trim($_POST['username'] ?? ''); $password = trim($_POST['password'] ?? ''); $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password'])) { $_SESSION['sisiswa_user'] = [ 'username' => $user['username'], 'role' => $user['role'] ]; echo json_encode(['status' => 'success', 'user' => $_SESSION['sisiswa_user']]); } else { echo json_encode(['status' => 'error', 'message' => 'Username atau kata sandi tidak valid!']); } exit; case 'logout': unset($_SESSION['sisiswa_user']); session_destroy(); echo json_encode(['status' => 'success']); exit; case 'check_session': if (isset($_SESSION['sisiswa_user'])) { echo json_encode(['status' => 'success', 'user' => $_SESSION['sisiswa_user']]); } else { echo json_encode(['status' => 'unauthenticated']); } exit; case 'change_password': if (!isset($_SESSION['sisiswa_user'])) { echo json_encode(['status' => 'error', 'message' => 'Akses ditolak']); exit; } $new_pass = trim($_POST['password'] ?? ''); if (strlen($new_pass) < 4) { echo json_encode(['status' => 'error', 'message' => 'Password minimal 4 karakter']); exit; } $hashed = password_hash($new_pass, PASSWORD_BCRYPT); $stmt = $pdo->prepare("UPDATE users SET password = ? WHERE username = ?"); $stmt->execute([$hashed, $_SESSION['sisiswa_user']['username']]); echo json_encode(['status' => 'success', 'message' => 'Kata sandi berhasil diperbarui!']); exit; case 'get_all_data': // Fetch Kelas $stmt = $pdo->query("SELECT * FROM kelas ORDER BY nama_kelas ASC"); $kelasRows = $stmt->fetchAll(); $kelas = array_column($kelasRows, 'nama_kelas'); $kelasWaliMap = []; foreach ($kelasRows as $k) { if (!empty($k['wali_kelas_nama'])) { $kelasWaliMap[$k['nama_kelas']] = $k['wali_kelas_nama']; } } // Fetch Guru $stmt = $pdo->query("SELECT id, nip, nama, jabatan, wali_kelas AS waliKelas, hp FROM guru ORDER BY nama ASC"); $guru = $stmt->fetchAll(); // Fetch Siswa $stmt = $pdo->query("SELECT id, nis, nisn, nama, jk, nik, kelas FROM siswa ORDER BY nama ASC"); $siswa = $stmt->fetchAll(); echo json_encode([ 'status' => 'success', 'kelas' => $kelas, 'kelasWaliMap' => $kelasWaliMap, 'guru' => $guru, 'siswa' => $siswa ]); exit; case 'save_siswa': $id = trim($_POST['id'] ?? ''); $nis = trim($_POST['nis'] ?? ''); $nisn = trim($_POST['nisn'] ?? ''); $nama = trim($_POST['nama'] ?? ''); $jk = trim($_POST['jk'] ?? 'L'); $nik = trim($_POST['nik'] ?? ''); $kelas = trim($_POST['kelas'] ?? ''); if (empty($id)) $id = 's_' . time() . '_' . rand(100, 999); $stmt = $pdo->prepare("INSERT INTO siswa (id, nis, nisn, nama, jk, nik, kelas) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE nis=VALUES(nis), nisn=VALUES(nisn), nama=VALUES(nama), jk=VALUES(jk), nik=VALUES(nik), kelas=VALUES(kelas)"); $stmt->execute([$id, $nis, $nisn, $nama, $jk, $nik, $kelas]); echo json_encode(['status' => 'success', 'id' => $id]); exit; case 'delete_siswa': $ids = json_decode($_POST['ids'] ?? '[]', true); if (is_array($ids) && count($ids) > 0) { $in = str_repeat('?,', count($ids) - 1) . '?'; $stmt = $pdo->prepare("DELETE FROM siswa WHERE id IN ($in)"); $stmt->execute($ids); } echo json_encode(['status' => 'success']); exit; case 'bulk_kenaikan': $ids = json_decode($_POST['ids'] ?? '[]', true); $targetKelas = trim($_POST['target_kelas'] ?? ''); if (is_array($ids) && count($ids) > 0 && !empty($targetKelas)) { $in = str_repeat('?,', count($ids) - 1) . '?'; $params = array_merge([$targetKelas], $ids); $stmt = $pdo->prepare("UPDATE siswa SET kelas = ? WHERE id IN ($in)"); $stmt->execute($params); } echo json_encode(['status' => 'success']); exit; case 'save_guru': $id = trim($_POST['id'] ?? ''); $nip = trim($_POST['nip'] ?? ''); $nama = trim($_POST['nama'] ?? ''); $jabatan = trim($_POST['jabatan'] ?? 'Guru Mapel'); $waliKelas = trim($_POST['wali_kelas'] ?? ''); $hp = trim($_POST['hp'] ?? ''); if (empty($id)) $id = 'g_' . time() . '_' . rand(100, 999); $stmt = $pdo->prepare("INSERT INTO guru (id, nip, nama, jabatan, wali_kelas, hp) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE nip=VALUES(nip), nama=VALUES(nama), jabatan=VALUES(jabatan), wali_kelas=VALUES(wali_kelas), hp=VALUES(hp)"); $stmt->execute([$id, $nip, $nama, $jabatan, $waliKelas, $hp]); if (!empty($waliKelas)) { $stmtWali = $pdo->prepare("UPDATE kelas SET wali_kelas_nama = ? WHERE nama_kelas = ?"); $stmtWali->execute([$nama, $waliKelas]); } echo json_encode(['status' => 'success', 'id' => $id]); exit; case 'delete_guru': $id = trim($_POST['id'] ?? ''); if (!empty($id)) { $stmt = $pdo->prepare("DELETE FROM guru WHERE id = ?"); $stmt->execute([$id]); } echo json_encode(['status' => 'success']); exit; case 'save_kelas': $namaKelas = trim($_POST['nama_kelas'] ?? ''); $waliKelasNama = trim($_POST['wali_kelas_nama'] ?? ''); if (!empty($namaKelas)) { $stmt = $pdo->prepare("INSERT INTO kelas (nama_kelas, wali_kelas_nama) VALUES (?, ?) ON DUPLICATE KEY UPDATE wali_kelas_nama = VALUES(wali_kelas_nama)"); $stmt->execute([$namaKelas, $waliKelasNama]); } echo json_encode(['status' => 'success']); exit; case 'delete_kelas': $namaKelas = trim($_POST['nama_kelas'] ?? ''); if (!empty($namaKelas)) { $stmt = $pdo->prepare("DELETE FROM kelas WHERE nama_kelas = ?"); $stmt->execute([$namaKelas]); } echo json_encode(['status' => 'success']); exit; case 'import_siswa_batch': $batch = json_decode($_POST['batch'] ?? '[]', true); if (is_array($batch) && count($batch) > 0) { $pdo->beginTransaction(); $stmtClass = $pdo->prepare("INSERT IGNORE INTO kelas (nama_kelas) VALUES (?)"); $stmtSiswa = $pdo->prepare("INSERT INTO siswa (id, nis, nisn, nama, jk, nik, kelas) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE nis=VALUES(nis), nisn=VALUES(nisn), nama=VALUES(nama), jk=VALUES(jk), nik=VALUES(nik), kelas=VALUES(kelas)"); foreach ($batch as $s) { if (!empty($s['kelas'])) { $stmtClass->execute([$s['kelas']]); } $stmtSiswa->execute([ $s['id'], $s['nis'], $s['nisn'], $s['nama'], $s['jk'], $s['nik'] ?? '', $s['kelas'] ]); } $pdo->commit(); } echo json_encode(['status' => 'success']); exit; case 'import_guru_batch': $batch = json_decode($_POST['batch'] ?? '[]', true); if (is_array($batch) && count($batch) > 0) { $pdo->beginTransaction(); $stmtGuru = $pdo->prepare("INSERT INTO guru (id, nip, nama, jabatan, wali_kelas, hp) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE nip=VALUES(nip), nama=VALUES(nama), jabatan=VALUES(jabatan), wali_kelas=VALUES(wali_kelas), hp=VALUES(hp)"); $stmtClassWali = $pdo->prepare("UPDATE kelas SET wali_kelas_nama = ? WHERE nama_kelas = ?"); foreach ($batch as $g) { $stmtGuru->execute([ $g['id'], $g['nip'] ?? '', $g['nama'], $g['jabatan'] ?? 'Guru Mapel', $g['waliKelas'] ?? '', $g['hp'] ?? '' ]); if (!empty($g['waliKelas'])) { $stmtClassWali->execute([$g['nama'], $g['waliKelas']]); } } $pdo->commit(); } echo json_encode(['status' => 'success']); exit; default: echo json_encode(['status' => 'error', 'message' => 'Action tidak dikenali']); exit; } } catch (Exception $e) { echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); exit; } } ?> SiSiswa - Database & Penilaian Siswa Realtime (PHP Server)

SiSiswa PHP Server

MI Al Khoiriyah Sawangan

Peringatan Database:

Demo Akun Cepat (Database SQL):