Maklumat Sekolah
"Dalam rangka menumbuhkembangkan minat dan potensi peserta didik SMPS Buddhis Bodhicitta dalam bidang akademik dan non-akademik, maka sekolah menyelenggarakan kegiatan pengembangan diri / Ekstrakurikuler yang harus diikuti oleh peserta didik secara berkesinambungan sejak kelas tujuh sampai kelas sembilan. Pelaksanaan dimulai bulan Agustus 2026. Adapun jadwal dan pilihan sebagai berikut :"
Formulir Pendaftaran Ekstrakurikuler
Silakan lengkapi data identitas diri dan pilih maksimal 3 ekstrakurikuler yang Anda minati.
Login Administrator
Silakan masukkan kata sandi Anda untuk mengakses simulator sistem, code exporter, dan panduan.
Total Pendaftaran Sukses
0
Total Ekstrakurikuler Aktif
12
Pemisahan NIS & Kelas
Aktif & Tanpa Batas
📊 Rekapitulasi Peminat Ekstrakurikuler
Rekap akumulasi riil pilihan 1, 2, dan 3 dari formulir pendaftaran.
| No | Nama Ekstrakurikuler | Pilihan 1 | Pilihan 2 | Pilihan 3 | Total Peminat | Persentase Popularitas |
|---|
🏢 Rekapitulasi Pendaftaran Berdasarkan Kelas
Daftar siswa yang telah menyelesaikan proses pendaftaran, dikelompokkan per kelas.
👨🎓 Tambah Data Siswa Master Baru
Tambahkan data siswa master secara virtual di bawah agar siswa tersebut dapat login pada Portal Siswa.
Simulasi Backend MySQL & phpMyAdmin Live Console
Kueri relasional dan data tabel terpisah langsung di-update secara virtual di bawah.
| id (PK) | nis (Unique) | kelas | nama_siswa | Aksi |
|---|
| id_eskul (PK) | nama_eskul | guru_pembimbing | hari / waktu | jumlah_pendaftar |
|---|
| id_pendaftaran (PK) | nama_siswa | nis | kelas | pilihan_1 (FK) | pilihan_2 (FK) | pilihan_3 (FK) | created_at | Aksi |
|---|---|---|---|---|---|---|---|---|
| Belum ada transaksi pendaftaran yang disimpan. | ||||||||
Export File Kode Produksi
Silakan salin kode produksi di bawah untuk diletakkan pada folder server lokal Anda (misal: `/xampp/htdocs/pendaftaran-eskul/`).
-- -----------------------------------------------------------------------------
-- FILE: database_schema.sql
-- Database: u954166245_eskul_smp (T.P 2026/2027)
-- Solusi Anti-Error #1701: Menggunakan Drop Table Berurutan Sebelum Pembuatan Ulang
-- -----------------------------------------------------------------------------
CREATE DATABASE IF NOT EXISTS u954166245_eskul_smp;
USE u954166245_eskul_smp;
-- Menghilangkan dependensi foreign key sebelum memproses pembuatan ulang tabel
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS pendaftaran_eskul;
DROP TABLE IF EXISTS eskul_master;
DROP TABLE IF EXISTS siswa_master;
SET FOREIGN_KEY_CHECKS = 1;
-- 1. Tabel siswa_master (Pemisahan NIS dan Kelas secara eksplisit)
CREATE TABLE siswa_master (
id INT AUTO_INCREMENT PRIMARY KEY,
nis VARCHAR(20) UNIQUE NOT NULL,
kelas VARCHAR(10) NOT NULL,
nama_siswa VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. Tabel eskul_master (Tanpa batasan kuota / Unlimited slots)
CREATE TABLE eskul_master (
id_eskul INT AUTO_INCREMENT PRIMARY KEY,
nama_eskul VARCHAR(100) NOT NULL,
guru_pembimbing VARCHAR(100) NOT NULL,
hari VARCHAR(50) NOT NULL,
waktu VARCHAR(50) NOT NULL,
tempat VARCHAR(100) NOT NULL,
jumlah_pendaftar INT DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 3. Tabel pendaftaran_eskul (Data Transaksi Terpisah NIS dan Kelas)
CREATE TABLE pendaftaran_eskul (
id_pendaftaran INT AUTO_INCREMENT PRIMARY KEY,
nama_siswa VARCHAR(100) NOT NULL,
nis VARCHAR(20) NOT NULL,
kelas VARCHAR(10) NOT NULL,
no_hp_siswa VARCHAR(20) NOT NULL,
no_hp_orangtua VARCHAR(20) NOT NULL,
pilihan_eskul_1 INT NOT NULL,
pilihan_eskul_2 INT DEFAULT NULL,
pilihan_eskul_3 INT DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pilihan_eskul_1) REFERENCES eskul_master(id_eskul) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY (pilihan_eskul_2) REFERENCES eskul_master(id_eskul) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY (pilihan_eskul_3) REFERENCES eskul_master(id_eskul) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- -----------------------------------------------------------------------------
-- SEED DATA AWAL (BERDASARKAN DATA PRD)
-- -----------------------------------------------------------------------------
INSERT INTO eskul_master (nama_eskul, guru_pembimbing, hari, waktu, tempat, jumlah_pendaftar) VALUES
('Basket', 'Samuel', 'Selasa & Sabtu', '16.00 – 18.00 / 10.00 – 12.00', 'Lapangan Basket', 0),
('Futsal', 'David H.', 'Sabtu', '08.00 – 10.00', 'Lapangan', 0),
('Seni Tari', 'Sofyan', 'Selasa & Sabtu', '15.00 – 17.00 / 09.30 – 12.00', 'Ruang Tari', 0),
('Paduan Suara', 'T. Freddy A.', 'Sabtu', '08.00 – 10.00', 'Ruang 313', 0),
('Sains Club', 'Moita A.AS.', 'Sabtu', '10.30 – 11.50', 'Laboratorium IPA', 0),
('Komputer Club', 'Suwanto', 'Sabtu', '09.00 – 10.30', 'Laboratorium Komputer', 0),
('Angklung', 'Samuel N.', 'Sabtu', '09.00 – 10.30', 'Ruang 403', 0),
('Mandarin Club', 'Kenny C.W.', 'Sabtu', '07.30 – 08.50', 'Ruang 313', 0),
('English Club', 'Dewi H.', 'Sabtu', '07.30 – 08.50', 'Laboratorium Bahasa', 0),
('Robotik', 'Suwanto', 'Sabtu', '07.30 – 09.00', 'Laboratorium IPA', 0),
('Wushu', 'Prajna / Wilbert K. (Ass.)', 'Sabtu', '10.00 – 12.00', 'Lapangan lantai II', 0),
('Gu Zheng (khusus)', 'Jolin Chuawanta', 'Sabtu', '07.30 – 08.30 / 08.30 – 09.30', 'Ruang Seni', 0);
<?php
/**
* FILE: submit.php
* Endpoint Backend API untuk pendaftaran Eskul (Validasi Terpisah NIS & Kelas)
* Menggunakan transaksi database yang bersih, aman dari crash, dan tanpa batasan kuota.
*/
header('Content-Type: application/json; charset=utf-8');
// Koneksi Database Produksi
$host = "localhost";
$username = "u954166245_admin";
$password = "BCselam3941";
$database = "u954166245_eskul_smp";
$conn = new mysqli($host, $username, $password, $database);
if ($conn->connect_error) {
echo json_encode(["status" => "error", "message" => "Koneksi database gagal: " . $conn->connect_error]);
exit();
}
// Hanya menerima request POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(["status" => "error", "message" => "Metode request tidak diizinkan."]);
exit();
}
// Mengambil Data Raw Post JSON
$inputRaw = file_get_contents("php://input");
$data = json_decode($inputRaw, true);
if (!$data) {
echo json_encode(["status" => "error", "message" => "Format data salah."]);
exit();
}
$nama_siswa = trim($data['nama_siswa'] ?? '');
$nis = trim($data['nis'] ?? '');
$kelas = trim($data['kelas'] ?? '');
$no_hp_siswa = trim($data['no_hp_siswa'] ?? '');
$no_hp_orangtua = trim($data['no_hp_orangtua'] ?? '');
$pilihan = $data['pilihan_eskul'] ?? []; // Array ID eskul
// Validasi Kelengkapan Isian Form
if (empty($nama_siswa) || empty($nis) || empty($kelas) || empty($no_hp_siswa) || empty($no_hp_orangtua)) {
echo json_encode(["status" => "error", "message" => "Seluruh kolom identitas wajib diisi!"]);
exit();
}
// Validasi Jumlah Pilihan Eskul (1 s.d. 3)
$total_pilihan = count($pilihan);
if ($total_pilihan < 1 || $total_pilihan > 3) {
echo json_encode(["status" => "error", "message" => "Siswa wajib memilih minimal 1 dan maksimal 3 kegiatan ekstrakurikuler."]);
exit();
}
// Siapkan parameter ID pilihan untuk dimasukkan ke tabel pendaftaran
$pilihan_1 = $pilihan[0];
$pilihan_2 = isset($pilihan[1]) ? $pilihan[1] : null;
$pilihan_3 = isset($pilihan[2]) ? $pilihan[2] : null;
// =================================----------------------------
// MULAI TRANSAKSI DATABASE (Pencegahan Race Condition)
// =================================----------------------------
$conn->begin_transaction();
try {
// 1. Validasi Autentikasi Siswa di siswa_master menggunakan NIS & Kelas Terpisah
$stmtSiswa = $conn->prepare("SELECT nama_siswa FROM siswa_master WHERE nis = ? AND kelas = ? LIMIT 1");
$stmtSiswa->bind_param("ss", $nis, $kelas);
$stmtSiswa->execute();
$resSiswa = $stmtSiswa->get_result();
if ($resSiswa->num_rows === 0) {
throw new Exception("Data Kombinasi NIS ($nis) & Kelas ($kelas) tidak terdaftar pada Master Data sekolah.");
}
$rowSiswa = $resSiswa->fetch_assoc();
$nama_siswa = $rowSiswa['nama_siswa']; // Konsistensi database master
// 2. Cek apakah Siswa dengan NIS tersebut sudah pernah melakukan pendaftaran sebelumnya
$stmtCekDaftar = $conn->prepare("SELECT id_pendaftaran FROM pendaftaran_eskul WHERE nis = ? LIMIT 1");
$stmtCekDaftar->bind_param("s", $nis);
$stmtCekDaftar->execute();
if ($stmtCekDaftar->get_result()->num_rows > 0) {
throw new Exception("Siswa dengan NIS ($nis) sudah terdaftar dalam sistem sebelumnya.");
}
$semua_pilihan = array_filter([$pilihan_1, $pilihan_2, $pilihan_3]);
// 3. Update data penambahan kuota terisi di eskul_master (Tanpa batasan limit kuota)
foreach ($semua_pilihan as $id_eskul) {
$stmtUpdateKuota = $conn->prepare("UPDATE eskul_master SET jumlah_pendaftar = jumlah_pendaftar + 1 WHERE id_eskul = ?");
$stmtUpdateKuota->bind_param("i", $id_eskul);
$stmtUpdateKuota->execute();
}
// 4. Masukkan data pendaftaran ke tabel transaksi pendaftaran_eskul
$stmtInsert = $conn->prepare("INSERT INTO pendaftaran_eskul (nama_siswa, nis, kelas, no_hp_siswa, no_hp_orangtua, pilihan_eskul_1, pilihan_eskul_2, pilihan_eskul_3) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmtInsert->bind_param("sssssiii", $nama_siswa, $nis, $kelas, $no_hp_siswa, $no_hp_orangtua, $pilihan_1, $pilihan_2, $pilihan_3);
$stmtInsert->execute();
// Commit transaksi jika seluruh tahapan di atas berhasil tanpa error
$conn->commit();
echo json_encode([
"status" => "success",
"message" => "Selamat! Pendaftaran atas nama $nama_siswa berhasil disimpan."
]);
} catch (Exception $e) {
// Batalkan seluruh perubahan jika terjadi kesalahan di tengah jalan
$conn->rollback();
echo json_encode([
"status" => "error",
"message" => "Gagal menyimpan pendaftaran: " . $e->getMessage()
]);
}
$conn->close();
?>
Panduan Instalasi & Deploy Website
Ikuti instruksi langkah-demi-langkah berikut untuk mengaktifkan sistem pendaftaran di server lokal sekolah Anda.
Persiapkan Local Server
Unduh dan pasang aplikasi XAMPP. Aktifkan modul Apache Web Server dan MySQL di XAMPP Control Panel Anda.
Buat Folder Proyek di htdocs
Akses folder instalasi xampp Anda di `C:/xampp/htdocs/`, lalu buat sebuah folder baru bernama pendaftaran-eskul.
Import Database di phpMyAdmin
Buka peramban browser dan akses http://localhost/phpmyadmin/. Buat database baru bernama u954166245_eskul_smp. Pilih database tersebut, buka tab SQL, salin seluruh isi kode SQL dari tab Code Exporter di atas, tempel, lalu klik Go.
Buat File PHP dan Hubungkan Frontend
Salin file backend submit.php dan simpan di dalam folder tersebut. Untuk frontend, buat file bernama index.html di folder yang sama, lalu sesuaikan pemanggilan API dari input NIS dan Kelas yang terpisah ini.
Penanganan Relasi SQL & Sistem Tanpa Batas
Mengapa Drop Berurutan Itu Penting?
Perintah TRUNCATE tidak diperbolehkan pada tabel induk yang dirujuk oleh foreign key tabel anak, bahkan dengan status FOREIGN_KEY_CHECKS = 0 dalam beberapa sesi query sql majemuk. Skema di atas menggunakan `DROP TABLE IF EXISTS` berurutan sehingga 100% lancar saat import ulang.
Sistem Pendaftaran Tanpa Batas
Sesuai instruksi pemutakhiran, batasan kapasitas kuota maksimal telah ditiadakan. Setiap siswa dapat mendaftar dengan bebas di eskul mana pun. Jumlah pendaftar diringkas dalam diagram statistik real-time sehingga admin dapat memantau eskul paling populer secara instan.