# SKKPd (Pemrograman Web & Perangkat Bergerak) XII RPL
# Mockup / Wireframe
```
---
Dibawah ini contoh 3 desain mockup dari program kakak kelas tahun lalu :
---
```



# XAMPP
## Cara Mengatasi Error: MySQL shutdown unexpectedly (XAMPP)
:::danger
Video Youtube : π https://www.youtube.com/watch?v=B6PVXmj_QLM
:::
## Berikut cara untuk merubah folder agar XAMPP tidak bermasalah.
1. Masuk ke file direktori mysql yang ada di dalam folder XAMPP **C:\xampp\mysql**

2. Kemudian **Rename** folder **data** menjadi **data_lama**.

3. Buat folder baru dan beri nama **data**.

4. Pada folder **backup**, copy seluruh file dan paste ke dalam folder data.

5. Selanjutnya, copy data **ibdata1** yang berada pada folder **data_lama**.

6. Lalu hasil copy data **ibdata1** dari folder **data_lama**, paste ke dalam folder **data** dan **replace** data lama dengan data **ibdata1** dari folder **data_lama**.

7. Lalu kembali ke folder **data_lama** dan copy **file database** dan paste kembali kedalam folder **data**, apabila muncul notifikasi replace, klik **replace file**.

## XAMPP untuk pengguna MacOS
:::info
Link Download : π https://sourceforge.net/projects/xampp/files/XAMPP%20Mac%20OS%20X/
:::
### Konfigurasi Untuk Menampilkan Error di MacOs
1. Buka Folder **/Applications/XAMPP/xamppfiles/etc** lalu buka file **php.ini** dengan aplikasi **text editor**, seperti gambar berikut :

2. Tekan di keyboard tombol command + f di keyboard untuk mencari kata : **display_errors** ubah dari display_errors=**Off** menjadi display_errors=**On** dan **save**.

---
## Apache
**Apache** adalah perangkat lunak **web server** yang digunakan untuk meng-host dan menyajikan situs web di internet atau jaringan lokal. Nama lengkapnya adalah **Apache HTTP Server**, dan dikembangkan oleh **Apache Software Foundation (ASF)**.
Fungsi Apache
Apache berfungsi sebagai **perantara** antara pengguna (browser) dan server, dengan cara:
1. **Menerima permintaan HTTP** dari browser (misalnya: Chrome, Firefox).
1. **Memproses permintaan**, termasuk menjalankan skrip PHP atau membaca file HTML.
1. **Mengirimkan respons** kembali ke browser (misalnya: halaman web yang diminta).
----
## MySql
**MySQL** adalah **sistem manajemen basis data relasional (RDBMS)** yang menggunakan **Structured Query Language (SQL)** untuk mengelola dan menyimpan data.
**Fungsi MySQL**
MySQL digunakan untuk menyimpan, mengelola, dan mengambil data dalam aplikasi berbasis database. Beberapa fungsi utamanya:
1. **Menyimpan Data** β Digunakan untuk menyimpan berbagai jenis data, seperti data pengguna, produk, transaksi, dll.
2. **Mengelola Database** β Bisa membuat, menghapus, dan mengatur database secara efisien.
3. **Mendukung Query SQL** β Bisa menjalankan perintah SQL seperti SELECT, INSERT, UPDATE, dan DELETE.
4. **Terhubung dengan Berbagai Bahasa Pemrograman** β Bisa digunakan bersama PHP, Python, Java, dll.
Fitur Utama MySQL
β
**Cepat dan ringan** β Cocok untuk aplikasi kecil hingga besar.
β
**Open-source dan gratis** β Tersedia juga versi berbayar dengan fitur tambahan.
β
**Mendukung banyak pengguna sekaligus (multi-user)**.
β
**Dapat menangani database besar** dengan jutaan baris data.
β
**Terintegrasi dengan berbagai platform** seperti Windows, Linux, dan macOS.
---
**Contoh Penggunaan MySQL**
**1. Membuat Database**
```SQL=
CREATE DATABASE sekolah;
```
**2. Membuat Tabel Siswa**
```SQL=
CREATE TABLE siswa (
NIS VARCHAR(10) PRIMARY KEY,
Nama VARCHAR(50),
Kelas VARCHAR(10),
Email VARCHAR(50)
);
```
**3. Menambahkan Data ke Tabel**
```SQL=
INSERT INTO siswa (NIS, Nama, Kelas, Email)
VALUES ('12345', 'Budi Santoso', 'XII IPA 1', '
[email protected]');
```
**4. Menampilkan Data Siswa**
```SQL=
SELECT * FROM siswa;
```
---
# Bootstrap Online
:::info
π Link Dokumentasi Bootstrap: https://getbootstrap.com/docs/5.3/getting-started/introduction/
:::
```PHP=
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/
[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<h1>Hello, world!</h1>
<script src="https://cdn.jsdelivr.net/npm/
[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
```
# π Struktur Folder
```
SKKPd/ # Folder Utama.
|- bootstrap/ # Folder untuk menampung framework Bootstrap 5.3 offline.
|- sertifikat/ # Folder untuk menampung file sertifikat dengan format.pdf.
|- tambah/ # Folder untuk menampung file create/tambah data dari database.
|- tampilan/ # Folder untuk menampung file read/tampil data dari database.
|- ubah/ # Folder untuk menampung file update/ubah datai dari database.
- koneksi.php # File koneksi ke database MySql.
- login.php # File login user operator dan siswa.
- logout.php # File logout semua user.
```
# Halaman Utama / Dashboard
## π Struktur Folder
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
|- tampilan/
- halaman_utama.php # File dashboard dengan menampilkan konten dinamis.
|- ubah/
- koneksi.php
- login.php
- logout.php
```
## Code (`halaman_utama.php`)

> [color=#37AFE1]
> Kode ini merupakan halaman utama (dashboard) dari sebuah sistem berbasis web. Fungsinya adalah:
>β
Menampilkan **navbar** navigasi.
>β
Menampilkan **halaman** berdasarkan parameter **page**.
>β
Menggunakan **Bootstrap** untuk tampilan yang responsif.
>β
Mengelola sesi pengguna dengan πͺ `$_COOKIE['nama_lengkap']`.
## 1οΈβ£ Menghubungkan ke Database
```PHP=
<?php
include "../koneksi.php";
?>
```
> [color=#37AFE1]
> Kode ini mengimpor π **file koneksi.php** yang berisi koneksi ke **database**. Ini memungkinkan **halaman utama** mengambil dan menampilkan data dari database.
## 2οΈβ£ Navbar Navigasi, Menampilkan menu βSiswaβ
```PHP=26
<?php if($_GET['page']=='siswa'){ echo "active";} else{ echo "";} ?>
```
## 3οΈβ£ Menampilkan Halaman Berdasarkan βpageβ
```PHP=26
switch($_GET['page']){
case "siswa":
include "siswa.php";
break;
}
```
> [color=#37AFE1]
> Menggunakan **switch($_GET['page'])** untuk memuat halaman yang sesuai.
>> Jika `page=siswa`, maka akan memuat π siswa.php.
>> contoh : localhost/SKKPd/tampilan/halaman_utama.php`?page=siswa`
>> Jika `page=jurusan`, maka akan memuat π jurusan.php.
>> contoh : localhost/SKKPd/tampilan/halaman_utama.php`?page=jurusan`
>> Dst.
# CRUD Siswa
::: info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=siswa
:::
## PhpMyAdmin (struktur tabel siswa)

## PhpMyAdmin (Isi data tabel siswa)
| NIS | No_Absen | Nama_Siswa | No_Telp | Email | Id_Jurusan | Kelas | Angkatan |
|------|---------|--------------------------------|----------------|------------------------|------------|-------|----------|
| 7024 | 2 | Agus Satya Pardede | 62856555519 |
[email protected] | J1 | 2 | 2024 |
| 7025 | 2 | Pantai | 62878555382 |
[email protected] | J1 | 1 | 2024 |
| 7026 | 3 | Gede Ardi Dharma Putra | 62878555383 |
[email protected] | J1 | 1 | 2024 |
| 7027 | 4 | Gede Dhairya Aditama | 62878555384 |
[email protected] | J1 | 1 | 2024 |
| 7028 | 5 | Ghazy Maulana Pratama | 62878555385 |
[email protected] | J1 | 2 | 2024 |
| 7029 | 6 | Gusti Ngurah Agung Setiawan | 62878555386 |
[email protected]| J2 | 3 | 2024 |
| 7030 | 7 | I Gusti Ngurah Andhika Diputra| 62878555387 |
[email protected] | J2 | 3 | 2023 |
| 7031 | 8 | I Gusti Ngurah Arya Wiguna | 62878555388 |
[email protected] | J2 | 3 | 2023 |
| 7032 | 9 | I Kadek Abiyogi Mandala Satyaki | 62878555389 |
[email protected] | J4 | 2 | 2023 |
| 7033 | 10 | I Kadek Bayu Wiradinata | 62878555390 |
[email protected] | J4 | 2 | 2023 |
## Create Siswa (tambah_siswa.php)
### π Struktur Folder
Buat file dengan nama `tambah_siswa.php` di dalam π ==**folder tambah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_siswa.php # File insert data ke table siswa dan table pengguna sebagai operator.
|- tampilan/
- halaman_utama.php
|- ubah/
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`tambah_siswa.php`)

::: info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=tambah_siswa
:::
> [color=#77B254]
> Kode PHP tersebut digunakan untuk menangani proses penambahan data siswa ke dalam database ketika tombol **βTambahβ** ditekan dalam sebuah **form HTML**. Berikut adalah penjelasan kode secara rinci:
### 1οΈβ£ Mengecek Apakah Tombol βTambahβ Diklik
```PHP=2
if(isset($_POST['tombol_tambah'])){
```
> [color=#77B254]
> `isset($_POST['tombol_tambah'])` memeriksa apakah tombol dengan `name="tombol_tambah"` diklik. Jika iya, maka proses di dalam blok `if` akan dijalankan.
### 2οΈβ£ Mengambil Data Dari Form
```PHP=3
$nis = htmlspecialchars($_POST['nis']);
$no_absen = htmlspecialchars($_POST['no_absen']);
$nama_siswa = htmlspecialchars($_POST['nama_siswa']);
$no_telp = htmlspecialchars($_POST['no_telp']);
$email = htmlspecialchars($_POST['email']);
$id_jurusan = htmlspecialchars($_POST['jurusan']);
$kelas = htmlspecialchars($_POST['kelas']);
$angkatan = htmlspecialchars($_POST['angkatan']);
```
> [color=#77B254]
> Data yang dikirim melalui metode **POST** diambil dari **form input**.
>
> **htmlspecialchars()** digunakan untuk mencegah serangan XSS (Cross-Site Scripting) dengan mengubah karakter khusus menjadi entitas HTML.
### 3οΈβ£ Membuat Password Siswa Berdasarkan NIS
```PHP=12
$pass_siswa = "siswa".$nis;
```
> [color=#77B254]
> `$nis` adalah Nomor Induk Siswa yang diambil dari form input.
>
> **Password default** dibuat dengan format **βsiswaβ + NIS**.
>
> Misalnya, jika **NIS = 12345**, maka password = **βsiswa12345β**
>
> Password ini digunakan untuk login pertama kali sebelum siswa menggantinya.
### 4οΈβ£ Enkripsi Password Siswa
```PHP=13
$enkrip = password_hash($pass_siswa, PASSWORD_DEFAULT);
```
> [color=#77B254]
> Fungsi **password_hash()** digunakan untuk mengenkripsi password.
**PASSWORD_DEFAULT** akan menggunakan algoritma **bcrypt** secara otomatis.
Contoh hasil enkripsi (tabel **pengguna** di database):
```
$2y$10$E6hYJbN2Nc2OEh9zOllDQOrQuwQ1mj8jE3sXyLptF9aKmKopftXPC
```
> [color=#77B254]
> Password yang sudah **di-hash** tidak bisa dikembalikan ke bentuk asli(plaintext).
>
> Untuk mengecek login nanti, gunakan **password_verify(... , ...)**.
### 5οΈβ£ Memasukkan Data Siswa Ke Tabel Siswa dan Pengguna
```PHP=15
$hasil = mysqli_query($koneksi, "INSERT INTO siswa VALUES('$nis', '$no_absen', '$nama_siswa', '$no_telp', '$email', '$id_jurusan', '$kelas', '$angkatan')");
$hasil_pengguna = mysqli_query($koneksi, "INSERT INTO pengguna VALUES(NULL, NULL, '$nis', '$enkrip')");
```
> [color=#77B254]
> Query pertama **($hasil)**: Memasukkan data siswa ke dalam **tabel siswa** dengan **NIS** sebagai primary key.
>
> Query kedua (**$hasil_pengguna**): Memasukkan data login siswa ke dalam **tabel pengguna**, dengan **NIS** sebagai identitas pengguna dan **password default**.
### 6οΈβ£ Notifikasi Berhasil atau Gagal
```PHP=19
if(!$hasil){
echo "<script>alert('gagal memasukkan data');window.location.href='halaman_utama.php?page=tambah_siswa'</script>";
}else{
echo "<script>alert('Berhasil Menambahkan Data');window.location.href='halaman_utama.php?page=siswa'</script>";
}
```
> [color=#77B254]
> Jika penyimpanan data gagal **($hasil == false)**, akan muncul **alert βgagal memasukkan dataβ** dan halaman akan dialihkan ke **halaman tambah siswa**.
>
> Jika berhasil, muncul **alert βBerhasil Menambahkan Dataβ** dan halaman akan dialihkan ke **halaman daftar siswa**.
---
:::warning
Kode ini berfungsi untuk:
β
Menangani input data siswa dari form.
β
Memastikan data aman dari serangan XSS.
β
Menyimpan data siswa ke dalam database.
β
Menyimpan akun login siswa dengan password default sekaligus dienkripsi.
β
Menggunakan password hashing β Data lebih aman.
β
Memberikan alert apakah proses berhasil atau gagal.
:::
---
## Read dan Delete Siswa (`siswa.php`)
### π Struktur Folder
Buat file dengan nama `tambah_siswa.php` di dalam π ==**folder tampilan**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- siswa.php # File tampil data dari table siswa dan delete dari table sertifikat, pengguna, dan siswa sebagai operator.
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`siswa.php`)

::: info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=siswa
:::
> [color=red]
> Kode ini terdiri dari dua bagian utama:
>>**1οΈβ£ PHP (Proses Penghapusan Data Siswa)**
>>**2οΈβ£ HTML + Bootstrap (Menampilkan Data Siswa dalam Bentuk Kartu)**
---
### 1οΈβ£ PHP (Menghapus Data Siswa dari Database)
```PHP=2
if(isset($_GET['nis'])){
$nis = $_GET['nis'];
$delete_pengguna = mysqli_query($koneksi, "DELETE FROM pengguna WHERE NIS='$nis'");
$delete_sertifikat = mysqli_query($koneksi, "DELETE FROM sertifikat WHERE NIS='$nis'");
$delete_siswa = mysqli_query($koneksi, "DELETE FROM siswa WHERE NIS='$nis'");
if(!$delete_siswa){
echo "<script>alert('gagal menghapus data');window.location.href='halaman_utama.php?page=siswa'</script>";
}else{
echo "<script>alert('berhasil menghapus data');window.location.href='halaman_utama.php?page=siswa'</script>";
}
}
```
> [color=red]
> Mengecek apakah ada parameter nis yang dikirim melalui **URL (GET)**.
> [color=red]
> Jika ada, maka akan:
>> 1. Menghapus data siswa dari tabel pengguna.
>> 2. Menghapus data terkait dari tabel sertifikat.
>> 3. Menghapus data siswa dari tabel siswa.
> [color=red]
> Jika penghapusan gagal, muncul **alert gagal**.
> [color=red]
> Jika berhasil, muncul **alert sukses** dan pengguna diarahkan kembali ke halaman daftar siswa.
### 2οΈβ£ HTML + Bootstrap (Menampilkan Data Siswa dalam Kartu)
```PHP=17
<div class="container-fluid">
<div class="row">
<div class="col"></div>
<div class="col-10 mt-5">
<div class="row">
<a href="halaman_utama.php?page=tambah_siswa" class="btn btn-success float-end">+ Tambah siswa</a>
</div>
<div class="row row-cols-1 row-cols-md-3 g-4">
<?php
$data_siswa = mysqli_query($koneksi, "SELECT * FROM siswa INNER JOIN jurusan USING(Id_Jurusan)");
while($data = mysqli_fetch_assoc($data_siswa)){
?>
<div class="col">
<div class="card mb-3 mt-5" style="max-width: 540px;">
<div class="row g-0">
<div class="col-md-4">
<div class="card-body">
<div class="badge text-bg-primary mb-2 text-wrap" style="width: 4rem;">
<?=$data['NIS']?>
</div>
<p class="card-text">Absen : <?=$data['No_Absen']?></p>
<p class="card-text"><?=$data['Jurusan']?> <?=$data['Kelas']?></p>
<p class="card-text"><small class="text-body-secondary">Angkatan :
<?=$data['Angkatan']?></small>
</p>
</div>
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title"><?=$data['Nama_Siswa']?></h5>
<p class="card-text"><?=$data['Email']?></p>
<p class="card-text">+<?=$data['No_Telp']?></p>
<a href="halaman_utama.php?page=ubah_siswa&nis=<?=$data['NIS']?>"
class="btn btn-warning">update</a>
<a onclick="return confirm('Yakin mau hapus?');"
href="halaman_utama.php?page=siswa&nis=<?=$data['NIS']?>"
class="btn btn-danger">delete</a>
</div>
</div>
</div>
</div>
</div>
<?php
}
?>
</div>
</div>
<div class="col"></div>
</div>
</div>
```
> [color=#37AFE1]
> **1. Mengambil Data Siswa:**
```PHP=27
$data_siswa = mysqli_query($koneksi, "SELECT * FROM siswa INNER JOIN jurusan USING(Id_Jurusan)");
```
> [color=#37AFE1]
> Mengambil semua data siswa dari tabel siswa dan **menghubungkan ke tabel jurusan** menggunakan `INNER JOIN`.
> [color=#37AFE1]
> `USING(Id_Jurusan)` β Menyambungkan tabel siswa dengan jurusan berdasarkan Id_Jurusan.
> [color=#37AFE1]
> **2. Menampilkan Data dalam Card Bootstrap:**
> [color=#37AFE1]
> Setiap siswa ditampilkan dalam format kartu (card) dengan informasi:
----
## Update Siswa (`ubah_siswa.php`)
### π Struktur Folder
Buat file dengan nama `ubah_siswa.php` di dalam π ==**folder ubah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- siswa.php
|- ubah/
- siswa.php # File update data dari table siswa sebagai operator.
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`ubah_siswa.php`)

::: info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_siswa&nis=7028
:::
### 1οΈβ£ Mengambil Data Siswa Berdasarkan NIS
```PHP=2
$nis = $_GET['nis'];
$data_update = mysqli_fetch_assoc(mysqli_query($koneksi, "SELECT * FROM siswa WHERE NIS='$nis'"));
```
> [color=#FFD65A]
> Mengambil parameter nis dari URL (halaman_utama.php?page=ubah_siswa&nis=12345).
> [color=#FFD65A]
> Mengambil data siswa berdasarkan **NIS** dari tabel siswa.
### 2οΈβ£ Proses Update Data Siswa
```PHP=5
if(isset($_POST['tombol_update'])){
```
> [color=#FFD65A]
> Ketika tombol βUpdateβ ditekan:
> [color=#FFD65A]
> π Mengambil & Memfilter Input dari Form
```PHP=6
$no_absen = htmlspecialchars($_POST['no_absen']);
$nama_siswa = htmlspecialchars($_POST['nama_siswa']);
$no_telp = htmlspecialchars($_POST['no_telp']);
$email = htmlspecialchars($_POST['email']);
$password = htmlspecialchars($_POST['password']);
$konfirmasi_pass = htmlspecialchars($_POST['konfirmasi_pass']);
$id_jurusan = htmlspecialchars($_POST['jurusan']);
$kelas = htmlspecialchars($_POST['kelas']);
$angkatan = htmlspecialchars($_POST['angkatan']);
```
> [color=#FFD65A]
> **Mengamankan input** dengan `htmlspecialchars()` (mencegah XSS).
> [color=#FFD65A]
> $_POST mengambil data dari formulir.
### 3οΈβ£ **Update Data Siswa (Tanpa Mengubah Password)**
```PHP=16
if($password == NULL){
if($password !== $konfirmasi_pass){
echo "<script>alert('password dengan konfirmasi password tidak sama');window.location.href='halaman_utama.php?page=ubah_siswa&nis=".$nis."'</script>";
}else{
$hasil = mysqli_query($koneksi, "UPDATE siswa SET No_Absen = '$no_absen', Nama_Siswa = '$nama_siswa', No_Telp = '$no_telp', Email = '$email', Id_Jurusan = '$id_jurusan', Kelas = '$kelas', Angkatan = $angkatan WHERE NIS = '$nis'");
if(!$hasil){
echo "<script>alert('Gagal update data siswa');window.location.href='halaman_utama.php?page=ubah_siswa&nis=$nis'</script>";
}else{
echo "<script>alert('Berhasil update data siswa');window.location.href='halaman_utama.php?page=siswa'</script>";
}
}
}
```
> [color=#FFD65A]
> πΉ Jika password tidak diisi, maka hanya data siswa yang diperbarui.
### 4οΈβ£ **Update Data Siswa (Dengan Password Baru)**
```PHP=28
}else{
if($password !== $konfirmasi_pass){
echo "<script>alert('password dengan konfirmasi password tidak sama');window.location.href='halaman_utama.php?page=ubah_siswa&nis=".$nis."'</script>";
}else{
$hasil = mysqli_query($koneksi, "UPDATE siswa SET No_Absen = '$no_absen', Nama_Siswa = '$nama_siswa', No_Telp = '$no_telp', Email = '$email', Id_Jurusan = '$id_jurusan ', Kelas = '$kelas', Angkatan = $angkatan WHERE NIS = '$nis'");
$enkrip = password_hash($password, PASSWORD_DEFAULT);
$hasil_pengguna = mysqli_query($koneksi, "UPDATE pengguna SET Password = '$enkrip' WHERE NIS = '$nis'");
if(!$hasil){
echo "<script>alert('Gagal update data siswa');window.location.href='halaman_utama.php?page=ubah_siswa&nis=$nis'</script>";
}else{
echo "<script>alert('Berhasil update data siswa');window.location.href='halaman_utama.php?page=siswa'</script>";
}
}
}
```
> [color=#FFD65A]
> πΉ Jika password diisi, sistem akan:
> [color=#FFD65A]
>> 1. Memeriksa kesesuaian password & konfirmasi password.
>> 1. Mengupdate data siswa.
>> 1. Mengupdate password di tabel pengguna (pengguna menyimpan login siswa).
>> 1. Password di-hash dengan password_hash() sebelum disimpan.
### 5οΈβ£ **Formulir Input Data**
> [color=#FFD65A]
> π Menampilkan data siswa yang sudah ada dan menyediakan kolom edit.
```PHP
<input type="number" class="form-control" name="nis" value="<?=$data_update['NIS']?>" required>
<input type="number" class="form-control" name="no_absen" value="<?=$data_update['No_Absen']?>" required>
<input type="text" class="form-control" name="nama_siswa" value="<?=$data_update['Nama_Siswa']?>" required>
<input type="text" class="form-control" name="no_telp" value="<?=$data_update['No_Telp']?>" required>
<input type="email" class="form-control" name="email" value="<?=$data_update['Email']?>" required>
```
### 6οΈβ£ **Update Password (Opsional)**
```PHP
<input type="text" name="password" class="form-control">
<input type="text" name="konfirmasi_pass" class="form-control">
```
> [color=#FFD65A]
> **Opsional**, jika user ingin mengganti password.
### 7οΈβ£ **Menampilkan Jurusan dalam Dropdown**
```PHP=93
<select name="jurusan" class="form-select">
<?php
$list = mysqli_query($koneksi, "SELECT * FROM jurusan");
while($data = mysqli_fetch_assoc($list)){
?>
<option value="<?=$data['Id_Jurusan']?>" <?php if($data['Id_Jurusan']==$data_update['Id_Jurusan']){echo "selected";} ?>>
<?=$data['Jurusan']?>
</option>
<?php } ?>
</select>
```
> [color=#FFD65A]
> **Menampilkan daftar jurusan** dari tabel jurusan.
> [color=#FFD65A]
> Jika `Id_Jurusan` siswa cocok dengan jurusan, maka dipilih otomatis.
----
:::warning
π‘ **Kesimpulan**
β
Mengambil data siswa berdasarkan NIS.
β
Memeriksa apakah password ingin diubah.
β
Jika hanya data siswa diubah β update data di tabel siswa.
β
Jika password juga diubah β update password di tabel pengguna dengan hashing.
β
Menggunakan alert JavaScript untuk memberi notifikasi keberhasilan/gagal.
β
Form menampilkan data yang sudah ada untuk diedit.
:::
----
# CRUD Jurusan
:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=jurusan
:::
## PhpMyAdmin (struktur tabel jurusan)

## PhpMyAdmin (Isi data tabel jurusan)
| Id_Jurusan | Jurusan |
|------------|---------|
| J1 | RPL |
| J2 | TKJ |
| J3 | AN |
| J4 | DKV |
| J5 | BD |
## Create Jurusan (`tambah_jurusan.php`)
### π Struktur Folder
Buat file dengan nama `tambah_jurusan.php` di dalam π ==**folder tambah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php # File insert data dari table jurusan sebagai operator.
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- siswa.php
|- ubah/
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`tambah_jurusan.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=tambah_jurusan
:::
### 1οΈβ£ Mengecek Apakah Tombol βTambahβ Diklik
```PHP=2
if(isset($_POST['tombol_tambah'])){
```
> [color=#77B254]
> Kode ini memeriksa apakah tombol **βTambahβ** (`name="tombol_tambah"`) telah diklik oleh pengguna.
>
> Jika tombol diklik, maka proses insert data ke database akan berjalan.
### 2οΈβ£ Mengambil ID Jurusan Terakhir
```PHP=4
$id_jurusan = mysqli_fetch_assoc(mysqli_query($koneksi, "SELECT Id_Jurusan FROM jurusan ORDER BY Id_Jurusan DESC LIMIT 1"));
```
> [color=#77B254]
> Query ini mengambil **ID Jurusan terakhir** dari tabel jurusan, dengan mengurutkan berdasarkan **`Id_Jurusan`** dari yang terbesar **(`DESC`)**.
>
> `LIMIT 1` memastikan hanya **satu data** terakhir yang diambil.
### 3οΈβ£ Menentukan ID Jurusan Baru
```PHP=6
if ($id_jurusan) {
$angkaTerakhir = intval(substr($id_jurusan['Id_Jurusan'], 1));
$noUrut = $angkaTerakhir + 1;
} else {
$noUrut = 1;
}
$Id = "J".$noUrut;
```
> [color=#77B254]
> **Jika ada data jurusan sebelumnya**, maka ID terakhir diproses:
>`substr($id_jurusan['Id_Jurusan'], 1)` β Mengambil angka dari `ID` terakhir (mengabaikan huruf βJβ).
>
>`intval(...)` β Mengubah string angka menjadi integer.
>
>`+1` β Menambahkan angka 1 agar `ID` berikutnya meningkat.
>
>**Jika tidak ada data jurusan**, maka `ID` pertama adalah "J1".
| ID Terakhir | ID Baru |
| -------- | -------- |
| J1 | J2 |
| J9 | J10 |
| J20 | J21 |
### 4οΈβ£ Menyimpan Data Jurusan Baru ke Database
```PHP=13
$jurusan = $_POST['jurusan'];
$hasil = mysqli_query($koneksi, "INSERT INTO jurusan VALUES('$Id', '$jurusan')");
```
> [color=#77B254]
>Membaca input dari form β `$jurusan` = `$_POST['jurusan']`;
>
>Memasukkan data ke database β `INSERT INTO jurusan VALUES('$Id', '$jurusan')`
>
>`$Id` = ID jurusan yang baru dibuat (J1, J2, dst.)
>
>`$jurusan` = Nama jurusan yang dimasukkan dari form.
### 5οΈβ£ Notifikasi Berhasil atau Gagal
```PHP=17
if(!$hasil){
echo "<script>alert('gagal memasukkan data');window.location.href='halaman_utama.php?page=tambah_jurusan'</script>";
}else{
echo "<script>alert('Berhasil Menambahkan Data');window.location.href='halaman_utama.php?page=jurusan'</script>";
}
```
> [color=#77B254]
>Jika **insert gagal**, tampilkan **alert βgagal memasukkan dataβ** dan kembali ke halaman tambah jurusan.
>
>Jika **insert sukses**, tampilkan **alert βBerhasil Menambahkan Dataβ** dan pindah ke halaman daftar jurusan.
### 6οΈβ£ Form Input Data Jurusan
```HTML=25
<form action="" method="post">
```
> [color=#77B254]
> Form ini digunakan untuk memasukkan data jurusan.
>
> **`method="post"`** β Data akan dikirim ke halaman yang sama.
```HTML=32
<input type="text" class="form-control" name="jurusan" required>
<label for="floatingInput">Nama Jurusan</label>
```
> [color=#77B254]
> Input **Nama Jurusan** (wajib diisi, karena required).
```HTML=37
<input type="submit" name="tombol_tambah" class="btn btn-success float-end" value="kirim">
```
> [color=#77B254]
> Tombol untuk mengirim data.
---
:::warning
π‘ **Kesimpulan**
β
Kode ini **menambahkan jurusan baru** dengan ID otomatis (J1, J2, J3, ...).
β
ID jurusan dibuat **secara berurutan** berdasarkan ID terakhir di database.
β
Jika **insert berhasil**, pengguna dialihkan ke halaman daftar jurusan.
β
Jika **insert gagal**, muncul peringatan dan tetap di halaman tambah jurusan.
:::
---
## Read Jurusan dan Delete Jurusan (`jurusan.php`)
### π Struktur Folder
Buat file dengan nama `jurusan.php` di dalam π ==**folder tampilan**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php # File delete dan tampilkan data dari table jurusan sebagai operator.
- siswa.php
|- ubah/
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`jurusan.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=jurusan
:::
### 1οΈβ£ Menghapus Jurusan dari Database
```PHP=2
if(isset($_GET['id'])){
$id_jurusan = $_GET['id'];
$hasil_jurusan = mysqli_query($koneksi, "DELETE FROM jurusan WHERE Id_Jurusan='$id_jurusan'");
if(!$hasil_jurusan){
echo "<script>alert('gagal menghapus data');window.location.href='halaman_utama.php?page=jurusan'</script>";
}else{
echo "<script>alert('berhasil menghapus data');window.location.href='halaman_utama.php?page=jurusan'</script>";
}
}
```
> [color=red]
> `isset($_GET['id'])` β Mengecek apakah parameter id dikirim melalui URL.
>
> `$id_jurusan = $_GET['id'];` β Mengambil ID jurusan dari URL.
>
> `mysqli_query($koneksi, "DELETE FROM jurusan WHERE Id_Jurusan='$id_jurusan'");` β Menghapus data jurusan berdasarkan ID.
>
> **Jika query gagal**, muncul peringatan "gagal menghapus data", dan pengguna tetap di halaman jurusan.
>
> **Jika query berhasil**, muncul peringatan "berhasil menghapus data", lalu pengguna diarahkan ke halaman daftar jurusan.
### 2οΈβ£ Tabel Menampilkan Daftar Jurusan
```PHP=33
$data_jurusan = mysqli_query($koneksi, "SELECT * FROM jurusan");
while($data = mysqli_fetch_assoc($data_jurusan)){
....
}
```
> [color=#37AFE1]
> Mengambil semua data jurusan
>
> Menggunakan **while** untuk menampilkan **semua jurusan** dalam bentuk **tabel**.
>
> Kolom **βAksiβ** berisi **tombol update** dan **delete** untuk setiap jurusan.
### 3οΈβ£ Mencegah Penghapusan Jika Data Jurusan Masih Digunakan di Tabel Siswa
```PHP=43
$id_cek = $data['Id_Jurusan'];
$cek_data = mysqli_query($koneksi, "SELECT Id_Jurusan FROM siswa WHERE Id_Jurusan='$id_cek'");
if(mysqli_num_rows($cek_data) > 0){
echo "";
}else{
?>
<a onclick="return confirm('Yakin mau hapus?');"
href="halaman_utama.php?page=jurusan&id=<?=$data['Id_Jurusan']?>"
class="btn btn-danger">delete</a>
<?php
}
?>
```
> [color=#37AFE1]
> Kode berikut mengecek apakah ada siswa yang masih terhubung dengan jurusan tersebut.
>
> Jika jurusan sudah digunakan oleh siswa, maka tombol **βdeleteβ tidak ditampilkan**.
>
> Jika jurusan belum digunakan, maka tombol **βdeleteβ ditampilkan**.
---
:::warning
π‘ **Kesimpulan**
β
Menampilkan daftar jurusan dalam tabel.
β
Memastikan jurusan tidak bisa dihapus jika masih digunakan oleh siswa.
β
Memungkinkan pengguna mengupdate atau menghapus jurusan dengan tombol aksi.
β
Menampilkan tombol tambah jurusan untuk menambahkan data baru.
:::
---
## Update Jurusan (`ubah_jurusan.php`)
### π Struktur Folder
Buat file dengan nama `ubah_jurusan.php` di dalam π ==**folder ubah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php
- siswa.php
|- ubah/
- ubah_jurusan.php # File update data dari table jurusan sebagai operator.
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`ubah_jurusan.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_jurusan&id=J3
:::
### 1οΈβ£ Mengambil Data Jurusan yang Akan Diubah
```PHP=2
$id = $_GET['id'];
$data_update = mysqli_fetch_assoc(mysqli_query($koneksi, "SELECT * FROM jurusan WHERE Id_Jurusan='$id'"));
```
> [color=#FFD65A]
> Komputer akan melihat **ID jurusan** yang dikirim melalui alamat web (URL).
>
> Lalu, komputer mencari jurusan tersebut di dalam database dan menyimpannya dalam `$data_update`.
>
> **Misalnya:** Jika kita ingin mengubah jurusan βMatematikaβ, komputer akan mencari jurusan βMatematikaβ berdasarkan ID-nya.
### 2οΈβ£ Jika Tombol βUpdateβ Ditekan
```PHP=5
if(isset($_POST['tombol_update'])){
$jurusan = $_POST['jurusan'];
$hasil = mysqli_query($koneksi, "UPDATE jurusan SET Jurusan = '$jurusan' WHERE Id_Jurusan='$id'");
```
> [color=#FFD65A]
> Jika tombol update ditekan, komputer akan mengambil **nama jurusan baru** yang ditulis pengguna.
>
> Lalu, komputer akan mengganti **nama jurusan lama** dengan **nama jurusan baru** di dalam database.
>
> **Misalnya:** Jika sebelumnya βMatematikaβ, lalu kita ganti jadi βFisikaβ, maka di dalam database, βMatematikaβ akan berubah menjadi βFisikaβ.
### 3οΈβ£ Menampilkan Notifikasi Berhasil atau Gagal
```PHP=10
if(!$hasil){
echo "<script>alert('Gagal update data jurusan');window.location.href='halaman_utama.php?page=ubah_jurusan&nis=$nis'</script>";
}else{
echo "<script>alert('Berhasil update data jurusan');window.location.href='halaman_utama.php?page=jurusan'</script>";
}
```
> [color=#FFD65A]
> Jika berhasil, akan muncul pesan **βBerhasil update data jurusanβ**.
>
> Jika gagal, akan muncul pesan **βGagal update data jurusanβ**.
### 4οΈβ£ Menampilkan Form untuk Mengubah Jurusan
```PHP=18
<form action="" method="post">
<div class="container">
<div class="row">
<div class="col"></div>
<div class="col-6 mt-5">
<div class="form-floating mb-3">
<input type="text" class="form-control" id="floatingInput" placeholder="
[email protected]"
name="jurusan" value="<?=$data_update['Jurusan']?>" required>
<label for="floatingInput">Nama Jurusan</label>
</div>
<input type="submit" name="tombol_update" class="btn btn-success float-end" id="" value="kirim">
</div>
<div class="col"></div>
</div>
</div>
</form>
```
> [color=#FFD65A]
> Tampilan ini memungkinkan pengguna untuk **mengubah nama jurusan**.
>
> **Nama jurusan lama akan langsung muncul di kotak isia** (agar lebih mudah diedit).
>
> Setelah diubah, pengguna bisa **menekan tombol βKirimβ** untuk menyimpan perubahan.
---
:::warning
π‘ **Kesimpulan**
β
Kode ini digunakan untuk mengedit nama jurusan di database.
β
Data jurusan lama diambil dan ditampilkan di form.
β
Setelah diedit, data disimpan ke dalam database.
β
Jika berhasil, muncul pesan sukses. Jika gagal, muncul pesan error.
:::
---
# CRUD Pegawai
:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=pegawai
:::
::: info
[π₯ Alur CRUD Pegwai > Tonton Video](https://drive.google.com/file/d/17nDCR7FN-8dXGcTs3lA2BZYHBXhiDvot/view?usp=drive_link)
:::
## PhpMyAdmin (struktur tabel pegawai)

## PhpMyAdmin (Isi data tabel pegawai)
| Nama_Lengkap | Username |
|------------------------------|----------|
| Putu Yenni Suryantari, S.Pd | yenny |
## Create Pegawai (`tambah_pegawai.php`)
### π Struktur Folder
Buat file dengan nama `tambah_pegawai.php` di dalam π ==**folder tambah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_pegawai.php # File tambah data ke table pegawai dan table pengguna sebagai operator.
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`tambah_pegawai.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=tambah_pegawai
:::
## Read Pegawai dan Delete Pegawai (`pegawai.php`)
### Code (`halaman_utama.php`)
Modifikasi file`halaman_utama.php` di dalam **Navbar** ==**folder tampilan**==


:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_pegawai&username=yenny
:::
## Update Pegawai (`ubah_pegawai.php`)
### π Struktur Folder
Buat file dengan nama `ubah_pegawai.php` di dalam π ==**folder ubah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_pegawai.php
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_pegawai.php # File tampilkan, update, delete data dari table pegawai dan table pengguna sebagai operator.
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`ubah_pegawai.php`)

:::info
>login sebagai pegawai/operator dengan akun :
username = yenny
password = admin12345
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_pegawai
:::
---
# CRUD Kategori Kegiatan
:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=kategori_kegiatan
:::
## PhpMyAdmin (struktur tabel kategori)

## PhpMyAdmin (Isi data tabel kategori)
| Id_Kategori | Kategori | Sub_Kategori |
|------------|----------|--------------------------------------------|
| KTG01 | Wajib | Kurikulum Merdeka Project P5 |
| KTG02 | Opsional | Perlombaan / Kejuaraan / Kompetisi |
| KTG03 | Opsional | Komunitas Kreatif Siswa |
| KTG04 | Wajib | Ekstra Kurikuler |
| KTG05 | Opsional | TEFA (Teaching Factory) |
| KTG06 | Opsional | Penalaran / Karya Ilmiah / Akademik |
| KTG07 | Opsional | Lainnya |
| KTG08 | Opsional | Penalaran / Organisasi Sekolah |
## PhpMyAdmin (struktur tabel kegiatan)

## PhpMyAdmin (Isi data tabel kegiatan)
| Id_Kegiatan | Jenis_Kegiatan | Angka_Kredit | Id_Kategori |
|------------|----------------------------------|--------------|------------|
| 1 | Project Gaya Hidup Berkelanjutan | 1 | KTG01 |
| 2 | Project Kebekerjaan | 1 | KTG01 |
| 3 | Project Bhinneka Tunggal Ika | 1 | KTG01 |
| 4 | Juara 1 Internasional | 7 | KTG02 |
| 5 | Harapan 2 Nasional | 5 | KTG02 |
| 6 | Juara 1 Internal Sekolah | 3 | KTG02 |
| 7 | Wakil Ketua Rohis | 5 | KTG03 |
| 8 | Sekretaris Osis | 7 | KTG03 |
| 10 | Project Baru | 1 | KTG01 |
| 11 | Ketua Rohis | 3 | KTG03 |
| 13 | Project Bersama | 4 | KTG03 |
| 24 | Bendahara Rohis | 3 | KTG03 |
| 25 | Bendahara Sehati | 5 | KTG08 |
## Create Kategori Kegiatan (`tambah_kategori_kegiatan.php`)
### π Struktur Folder
Buat file dengan nama `tambah_kategori_kegiatan.php` di dalam π ==**folder tambah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php # File insert data kategori dan data kegiatan ke dalam table kategori dan table kegiatan sekaligus.
- tambah_pegawai.php
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`tambah_kategori_kegiatan.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=tambah_kegiatan
:::
## Read Kategori Kegiatan dan Delete Kategori Kegiatan (`kategori_kegiatan.php`)
### π Struktur Folder
Buat file dengan nama `kategori_kegiatan.php` di dalam π ==**folder tampilan**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php
- kategori_kegiatan.php # File tampil & delete data kategori kegiatan dari table kategori dan table kegiatan dikelompokkan berdasarkan id_kategori.
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`halaman_utama.php`)

### Code (`kategori_kegiatan.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=kategori_kegiatan
:::
Kode di atas terdiri dari dua bagian utama:
1οΈβ£ Proses Penghapusan Data (DELETE SQL)
2οΈβ£ Tampilan Data dalam Tabel
### 1οΈβ£ Proses Penghapusan Data (DELETE SQL)
```PHP=
<?php
if(isset($_GET['Id_Kegiatan'])){ // Cek apakah parameter Id_Kegiatan ada di URL
$Id_Kegiatan = $_GET['Id_Kegiatan']; // Ambil nilai Id_Kegiatan dari URL
$hasil_kegiatan = mysqli_query($koneksi, "DELETE FROM kegiatan WHERE Id_Kegiatan='$Id_Kegiatan'");
if(!$hasil_kegiatan){
echo "<script>alert('gagal menghapus data');window.location.href='halaman_utama.php?page=kategori_kegiatan'</script>";
}else{
echo "<script>alert('berhasil menghapus data');window.location.href='halaman_utama.php?page=kategori_kegiatan'</script>";
}
}
?>
```
> [color=red]
> `isset($_GET['Id_Kegiatan'])` β Mengecek apakah ada parameter Id_Kegiatan dalam URL.
>
> `$Id_Kegiatan = $_GET['Id_Kegiatan'];` β Mengambil nilai Id_Kegiatan dari URL.
>
> `mysqli_query($koneksi, "DELETE FROM kegiatan WHERE Id_Kegiatan='$Id_Kegiatan'")` β Menjalankan query SQL untuk menghapus data kegiatan berdasarkan Id_Kegiatan.
>
> Jika query gagal `(!$hasil_kegiatan)`, tampilkan alert βgagal menghapus dataβ, lalu kembali ke halaman utama.
>
> Jika berhasil, tampilkan alert βberhasil menghapus dataβ, lalu kembali ke halaman utama.
### 2οΈβ£ Tampilan Data dalam Tabel
```PHP=35
$query = mysqli_query($koneksi, "SELECT * FROM kategori INNER JOIN kegiatan ON kategori.Id_Kategori = kegiatan.Id_Kategori ORDER BY kategori.Sub_Kategori");
$last_kategori_id = null; // Menyimpan ID kategori sebelumnya
$no = 1; // Nomor urut kegiatan
while ($baris = mysqli_fetch_assoc($query)) {
```
> [color=#37AFE1]
> Mengambil data dari tabel kategori dan kegiatan menggunakan **INNER JOIN**.
>
> Mengurutkan data berdasarkan Sub_Kategori.
>
> Menyimpan ID kategori sebelumnya di $last_kategori_id untuk mengelompokkan data berdasarkan kategori.
### 3οΈβ£ Menampilkan Header Kategori
```PHP=41
if ($last_kategori_id !== $baris['Id_Kategori']) {
if ($last_kategori_id !== null) {
echo "<tr><td colspan='7'> </td></tr>"; // Baris kosong untuk pemisah antar kategori
}
echo "
<tr class='table-active'>
<td colspan='7' class='fw-bold text-start'>Kategori: " . htmlspecialchars($baris['Sub_Kategori']) . "</td>
</tr>
";
$no = 1; // Reset nomor kegiatan jika kategori berubah
}
```
> [color=#37AFE1]
> Menampilkan kategori hanya sekali per kelompok data.
>
> Menggunakan table-active untuk menyoroti kategori.
>
> Menambahkan baris kosong untuk memisahkan antar kategori.
### 4οΈβ£ Menampilkan Data Kegiatan
```PHP=59
<tr class="text-center">
<td><?=$no++?></td>
<td align="left"><?=htmlspecialchars($baris['Jenis_Kegiatan'])?></td>
<td><?=htmlspecialchars($baris['Angka_Kredit'])?></td>
<td>
<a href="halaman_utama.php?page=ubah_kegiatan.php&Id_Kegiatan=<?=htmlspecialchars($baris['Id_Kegiatan'])?>"
class="btn btn-warning">Edit</a>
</td>
<td>
<a href="halaman_utama.php?page=kategori_kegiatan&Id_Kegiatan=<?=htmlspecialchars($baris['Id_Kegiatan'])?>"
class="btn btn-danger"
onclick="return confirm('Yakin ingin menghapus kegiatan ini?');">Hapus</a>
</td>
</tr>
```
### 5οΈβ£ Memperbarui ID Kategori Terakhir
```PHP=78
$last_kategori_id = $baris['Id_Kategori'];
```
> [color=#37AFE1]
> Menjaga agar kategori tidak ditampilkan berulang.
---
:::warning
π‘ **Kesimpulan**
β
Menghapus Kegiatan dari Database (berdasarkan Id_Kegiatan yang dikirim via URL).
β
Menampilkan Daftar Kegiatan dengan kategori yang dikelompokkan.
β
Memisahkan Data Berdasarkan Kategori dengan menampilkan header kategori.
β
Memiliki Tombol Edit dan Hapus untuk mengelola data kegiatan.
:::
---
## Update Kategori_kegiatan (`ubah_kategori_kegiatan.php`)
### π Struktur Folder
Buat file dengan nama `ubah_kategori_kegiatan.php` di dalam π ==**folder ubah**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
|- tampilan/
- halaman_utama.php
- jurusan.php
- kategori_kegiatan.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_kategori_kegaitan.php # File update data sub_kategori dan kegiatan dari table kategori dan table kegiatan.
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
### Code (`ubah_kategori_kegiatan.php`)

:::info
π Mengubah Sub Kategori :
https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_kategori_kegiatan&Id_Kegiatan=24
π Mengubah Jenis Kegiatan & Point :
https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_kategori_kegiatan&Id_Kategori=KTG03
:::
---
# Generate Sertifikat & Laporan
:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=sertifikat
:::
## PhpMyAdmin (struktur tabel sertifikat)

## PhpMyAdmin (Isi data tabel sertifikat)
| Id_Sertifikat | Tanggal_Upload | Catatan | Sertifikat | Status | Tanggal_Status_Berubah | NIS | Id_Kegiatan |
|--------------|---------------|-------------------|--------------------------------|---------------------|-----------------------|------|-------------|
| 1 | 2024-12-22 | NULL | sertif1.pdf | Valid | 2025-01-11 | 7024 | 1 |
| 7 | 2024-12-25 | NULL | sertif7.pdf | Valid | 2025-01-14 | 7027 | 1 |
| 11 | 2024-12-24 | salah file | sertif1.pdf | Tidak Valid | 2025-02-27 | 7029 | 1 |
| 21 | 2025-03-01 | NULL | 7024y3h85.pdf | Menunggu Validasi | NULL | 7024 | 1 |
| 22 | 2025-03-01 | NULL | 7024c9y1k.pdf | Menunggu Validasi | NULL | 7024 | 1 |
| 2 | 2024-12-22 | NULL | sertif2.pdf | Valid | 2025-01-11 | 7024 | 2 |
| 4 | 2024-12-23 | NULL | sertif4.pdf | Valid | 2025-01-12 | 7025 | 2 |
| 5 | 2024-12-24 | NULL | sertif5.pdf | Valid | 2025-01-13 | 7025 | 2 |
| 9 | 2024-12-25 | salah file, silahkan upload ualng | sertif9.pdf | Tidak Valid | 2025-02-28 | 7027 | 2 |
| 10 | 2024-12-26 | NULL | sertif10.pdf | Valid | 2025-02-27 | 7028 | 2 |
| 12 | 2024-12-25 | NULL | sertif2.pdf | Menunggu Validasi | 2025-02-24 | 7029 | 2 |
| 20 | 2025-03-01 | NULL | sertif3.pdf | Menunggu Validasi | NULL | 7024 | 2 |
| 3 | 2024-12-22 | NULL | sertif3.pdf | Valid | 2025-01-11 | 7024 | 3 |
| 6 | 2024-12-24 | NULL | sertif6.pdf | Valid | 2025-01-13 | 7026 | 3 |
| 8 | 2024-12-25 | NULL | sertif8.pdf | Valid | 2025-01-14 | 7027 | 3 |
| 13 | 2024-12-27 | NULL | sertif3.pdf | Valid | 2025-01-16 | 7029 | 4 |
| 19 | 2025-02-28 | salah file | sertif10.pdf | Menunggu Validasi | 2025-02-28 | 7024 | 5 |
| 14 | 2024-12-28 | NULL | sertif4.pdf | Valid | 2025-01-17 | 7030 | 5 |
| 15 | 2024-12-29 | Perbaiki dokumen | sertif5.pdf | Tidak Valid | 2025-01-18 | 7031 | 6 |
| 16 | 2024-12-30 | NULL | sertif6.pdf | Valid | 2025-01-19 | 7032 | 7 |
| 17 | 2024-12-31 | NULL | sertif7.pdf | Valid | 2025-01-20 | 7033 | 8 |
## Read Sertifikat (`Sertifikat.php`)
### π Struktur Folder
Buat file dengan nama `upload_sertifikat.php` di dalam π ==**folder tambah**==
Buat file dengan nama `cek_sertifikat_siswa.php` di dalam π ==**folder tampilan**==
Buat file dengan nama `sertifikat_siswa.php` di dalam π ==**folder tampilan**==
Buat file dengan nama `sertifikat_siswa.php` di dalam π ==**folder tampilan**==
Buat file dengan nama `sertifikat.php` di dalam π ==**folder tampilan**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
- upload_sertifikat.php # File upload sertifikat ==> login sebagai level_user siswa.
|- tampilan/
- cek_sertifikat_siswa.php # File cek sertifikat apakah valid atau tidak valid ==> login sebagai level_user siswa.
- cek_sertifikat.php # File cek sertifikat sekaligus mengubah status sertifikat menjadi valid atau tidak valid ==> login sebagai level_user operator.
- halaman_utama.php
- jurusan.php
- kategori_kegiatan.php
- sertifikat_siswa.php # File menampilkan list sertifikat berdasarkan status sertifikat dan nis siswa ==> login sebagai level_user siswa.
- sertifikat.php # File menampilkan list sertifikat berdasarkan status sertifikat dan jenis kegiatan ==> login sebagai level_user operator.
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_kategori_kegaitan.php
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
modifikasi file `halaman_utama.php` di dalam π ==**folder tampilan**==
### Code (`halaman_utama.php`)

Buat file dengan nama `sertifikat.php` di dalam π ==**folder tampilan**==
### Code (`sertifikat.php`)

Buat file dengan nama `cek_sertifikat.php` di dalam π ==**folder tampilan**==
### Code (`cek_sertifikat.php`)

Buat file dengan nama `sertifikat_siswa.php` di dalam π ==**folder tampilan**==
### Code (`sertifikat_siswa.php`)

Buat file dengan nama `cek_sertifikat_siswa.php` di dalam π ==**folder tampilan**==
### Code (`cek_sertifikat_siswa.php`)

Buat file dengan nama `upload_sertifikat.php` di dalam π ==**folder tambah**==
### Code (`upload_sertifikat.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=sertifikat
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=sertifikat_siswa
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=upload_sertifikat
:::
## Cetak Laporan/Generate Laporan (`laporan.php`)
:::info
β¬οΈ link download FPDF : http://www.fpdf.org/en/dl.php?v=186&f=zip
β¬οΈ link download logo TI : https://drive.google.com/file/d/1HUYBBvv6R1MTsPb0mQ5S_bMfpY20jIA2/view?usp=sharing
:::
setelah download lalu extract menjadi π ==**fpdf186**== lalu rename folder tersebut menjadi π ==**fpdf**== dan pindahkan ke dalam project dalam π ==**folder cetak**== seperti di gambar berikut:

### π Struktur Folder
Buat folder dengan nama π `cetak`
Buat folder dengan nama π `laporan` π di dalam folder `cetak`
```
SKKPd/
|- bootstrap/
|- cetak/ # folder menampung file cetak laporan dan cetak sertifikat
|- fpdf/ # Menampung file library FPDF
|- laporan/
- laporan.php # file generate laporan ==> login sebagai level_user operator.
|- gambar/
- logoti.png # file logo TI untuk kop surat generate laporan
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
- upload_sertifikat.php
|- tampilan/
- cek_sertifikat_siswa.php
- cek_sertifikat.php
- halaman_utama.php # Modifikasi file, case baru
- jurusan.php
- kategori_kegiatan.php
- sertifikat_siswa.php
- sertifikat.php # Modifikasi file, arahkan tombol cetak laporan ke file laporan.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_kategori_kegaitan.php
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
Modifikasi file `halaman_utama.php` di dalam π ==**folder tampilan**==
### Code (`halaman_utama.php`)

Modifikasi file `sertifikat.php` di dalam π ==**folder tampilan**==
### Code (`sertifikat.php`)

Buat file dengan nama `laporan.php` di dalam π ==**folder laporan**==
### Code (`laporan.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=sertifikat
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/cetak/laporan/laporan.php
:::
## Cetak Sertifikat Siswa/Generate Sertifikat (`generate_sertifikat.php`)
### π Struktur Folder
Buat folder dengan nama π `sertifikat_skkpd` π di dalam folder `cetak`
```
SKKPd/
|- bootstrap/
|- cetak/
|- fpdf/ # Menampung file library FPDF
|- laporan/
- laporan.php
|- sertifikat_skkpd/
- background-sertif.jpeg # file gambar untuk sertifikat
- generate_sertifikat.php # file untuk generate sertifikat ==> login sebagai level_user siswa apabila 30 point atau lebih.
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
- upload_sertifikat.php
|- tampilan/
- cek_sertifikat_siswa.php
- cek_sertifikat.php
- halaman_utama.php
- jurusan.php
- kategori_kegiatan.php
- sertifikat_siswa.php # modifikasi file, tambahkan tampilan informasi data sertifikat berdasarkan status dan tombol cetak sertifikat akan tampil apabila sudah 30 point atau lebih
- sertifikat.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_kategori_kegaitan.php
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
Modifikasi file `sertifikat_siswa.php` di dalam π ==**folder tampilan**==
### Code (`sertifikat_siswa.php`)

:::info
link download contoh background sertifikat : https://drive.google.com/file/d/19AnliGR9cv5JqCal0v6lHpxJLhn0I0v8/view?usp=sharing
:::
Buat file dengan nama `generate_sertifikat.php` di dalam π ==**folder sertifikat_skkpd**==
### Code (`generate_sertifikat.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=sertifikat_siswa
:::
# Halaman Utama untuk Operator dan Siswa
## Cetak Sertifikat Siswa/Generate Sertifikat (`generate_sertifikat.php`)
### π Struktur Folder
Buat folder dengan nama π `sertifikat_skkpd` π di dalam folder `cetak`
```
SKKPd/
|- bootstrap/
|- cetak/
|- fpdf/
|- laporan/
- laporan.php
|- sertifikat_skkpd/
- background-sertif.jpeg
- generate_sertifikat.php
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
- upload_sertifikat.php
|- tampilan/
- cek_sertifikat_siswa.php
- cek_sertifikat.php
- halaman_utama.php # modifikasi file, membagi tampilan setelah login antara operator dan siswa
- jurusan.php
- kategori_kegiatan.php
- sertifikat_siswa.php
- sertifikat.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_kategori_kegaitan.php
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
Modifikasi file `halaman_utama.php` di dalam π ==**folder tampilan**==
### Code (`halaman_utama.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php
:::
# Ganti Password Siswa
## Ubah Password (`ubah_pass_siswa.php`)
### π Struktur Folder
Buat folder dengan nama π `sertifikat_skkpd` π di dalam folder `cetak`
```
SKKPd/
|- bootstrap/
|- cetak/
|- fpdf/
|- laporan/
- laporan.php
|- sertifikat_skkpd/
- background-sertif.jpeg
- generate_sertifikat.php
|- sertifikat/
|- tambah/
- tambah_jurusan.php
- tambah_kategori_kegiatan.php
- tambah_pegawai.php
- tambah_siswa.php
- upload_sertifikat.php
|- tampilan/
- cek_sertifikat_siswa.php
- cek_sertifikat.php
- halaman_utama.php # modifikasi file, ke halaman ubah password siswa
- jurusan.php
- kategori_kegiatan.php
- sertifikat_siswa.php
- sertifikat.php
- siswa.php
|- ubah/
- ubah_jurusan.php
- ubah_kategori_kegaitan.php
- ubah_pass_siswa.php # file ubah password siswa
- ubah_pegawai.php
- siswa.php
- koneksi.php
- login.php
- logout.php
```
Modifikasi file `halaman_utama.php` di dalam π ==**folder tampilan**==
### Code (`halaman_utama.php`)

### Code (`ubah_pass_siswa.php`)

:::info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/tampilan/halaman_utama.php?page=ubah_pass
:::
# Login & Logout
# π Struktur Folder
Buat file dengan nama `login.php` di dalam π ==**folder root SKKPd/**==
```
SKKPd/
|- bootstrap/
|- sertifikat/
|- tambah/
|- tampilan/
|- ubah/
- koneksi.php
- login.php # File login sebagai operator dan siswa dengan password yang sudah dienkripsi.
- logout.php # File logout semua user.
```
### PhpMyAdmin (struktur tabel pengguna)

### PhpMyAdmin (Isi data tabel pengguna)
| Id_Pengguna | Username | NIS | Password |
|------------|----------|------|----------------------------------------------|
| 1 | yenny | NULL | $2y$10$OK2BhpKRsHihc3HUAdeeyO.RV5I/YvPZnFSUz/... |
| 2 | NULL | 7024 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 3 | NULL | 7025 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 4 | NULL | 7026 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 5 | NULL | 7027 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 6 | NULL | 7028 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 7 | NULL | 7029 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 8 | NULL | 7030 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 9 | NULL | 7031 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 10 | NULL | 7032 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 11 | NULL | 7033 | $2y$10$mTBdwX2uxzv3On78pKZCs.i5pGioLnWeDAhntA/... |
| 14 | ariewira | NULL | $2y$10$URGp92DP6ZFZISd7yl5EQO3m1dlvN/LozA5lEiosV... |
## Login (`login.php`)

::: info
https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/login.php
:::
## Video Alur Login
::: info
[π₯ Tonton Video](https://drive.google.com/file/d/17R1ESxutr02nJtbnYslRnlzFnT6yTOCT/view?usp=drive_link)
:::
> [color=#B771E5]
> Kode PHP ini adalah skrip autentikasi login yang memeriksa apakah pengguna adalah operator atau siswa, lalu melakukan validasi dengan password yang tersimpan dalam database.
### 1οΈβ£ Menghubungkan ke Database
```PHP=2
include "koneksi.php";
```
### 2οΈβ£ Mengecek Apakah Tombol Login Ditekan
```PHP=3
if(isset($_POST['tombol_login'])){
```
> [color=#B771E5]
> **isset($_POST['tombol_login'])** memastikan bahwa form login dikirim (tombol **βLoginβ** ditekan).
### 3οΈβ£ Mengambil Data dari Form Input
```PHP=4
$user = $_POST['username'];
$pass = $_POST['password'];
```
> [color=#B771E5]
> Mengambil username/NIS dan password yang dikirim dari form login melalui metode **POST**.
### 4οΈβ£ Mengecek Apakah Pengguna Adalah Operator
```PHP=7
$cek_operator = mysqli_query($koneksi, "SELECT Username, Password FROM pengguna WHERE Username='$user'");
$data_operator = mysqli_fetch_assoc($cek_operator);
```
> [color=#B771E5]
> Query ini mencari **operator** berdasarkan **Username** di tabel pengguna.
> [color=#B771E5]
> Jika ditemukan, hasilnya disimpan dalam array $data_operator.
### 5οΈβ£ Mengecek Apakah Pengguna Adalah Siswa
```PHP=10
$cek_siswa = mysqli_query($koneksi, "SELECT NIS, Password FROM pengguna WHERE NIS='$user'");
$data_siswa = mysqli_fetch_assoc($cek_siswa);
```
> [color=#B771E5]
> Query ini mencari **siswa** berdasarkan **NIS** di tabel pengguna.
> [color=#B771E5]
> Jika ditemukan, hasilnya disimpan dalam array $data_siswa.
### 6οΈβ£ Proses Login untuk Operator
```PHP=15
if(mysqli_num_rows($cek_operator) > 0){
if(password_verify($pass, $data_operator['Password'])){
```
> [color=#B771E5]
> Jika operator ditemukan, maka sistem akan:
>> 1. Memverifikasi password dengan **password_verify()**.
>> 2. Jika cocok, mengambil Nama Operator dari tabel pegawai:
```PHP=18
$nama_operator = mysqli_fetch_assoc(mysqli_query($koneksi, "SELECT Nama_Lengkap FROM pegawai WHERE Username = '$user_operator'"));
```
> [color=#B771E5]
>> 3. Menyimpan data dalam πͺ cookie selama 7 hari:
```PHP=19
setcookie('username', $data_operator['Username'], time() + (60 * 60 * 24 * 7), '/');
setcookie('nama_lengkap', $nama_operator['Nama_Lengkap'], time() + (60 * 60 * 24 * 7), '/');
setcookie('level_user', 'operator', time() + (60 * 60 * 24 * 7), '/');
```
> [color=#B771E5]
>> 4. Jika login berhasil, pengguna diarahkan ke halaman utama:
```PHP=22
echo "<script>alert('Berhasil Login');window.location.href='tampilan/halaman_utama.php?page=siswa'</script>";
```
> [color=#B771E5]
>> 5. Jika password salah, muncul **alert** dan halaman tetap di login.php.
### 7οΈβ£ Proses Login untuk Siswa
```PHP=27
}elseif(mysqli_num_rows($cek_siswa) > 0){
if(password_verify($pass, $data_siswa['Password'])){
```
> [color=#B771E5]
> Jika siswa ditemukan, maka sistem akan:
>> 1. **Memverifikasi password** dengan **password_verify()**.
>> 2. Jika cocok, mengambil Nama Siswa dari tabel siswa:
```PHP=30
$nama_siswa = mysqli_fetch_assoc(mysqli_query($koneksi, "SELECT Nama_Siswa FROM siswa WHERE NIS = '$user_siswa'"));
```
> [color=#B771E5]
>> 3. Menyimpan data dalam πͺ **cookie** selama **7 hari**:
```PHP=31
setcookie('nis', $data_siswa['NIS'], time() + (60 * 60 * 24 * 7), '/');
setcookie('level_user', 'siswa', time() + (60 * 60 * 24 * 7), '/');
setcookie('nama_lengkap', $nama_siswa['Nama_Siswa'], time() + (60 * 60 * 24 * 7), '/');
```
> [color=#B771E5]
>> 4. Jika login berhasil, pengguna diarahkan ke halaman utama.
>> 5. Jika password salah, muncul **alert** dan halaman tetap di login.php.
### 8οΈβ£ Jika Username Tidak Ditemukan
```PHP=36
else{
echo "<script>alert('Gagal Login, username atau password salah');window.location.href='login.php'</script>";
}
```
> [color=#B771E5]
> Jika tidak ditemukan dalam kedua tabel (pengguna untuk operator dan siswa), maka muncul alert error.
---
:::warning
π‘ **Kesimpulan**
β
Kode ini menangani login untuk operator dan siswa dengan sistem role-based.
β
Menggunakan password_verify() untuk memeriksa password yang dienkripsi dengan password_hash().
β
Pastikan password dalam database sudah menggunakan password_hash().
:::
---
## Logout (`logout.php`)

::: info
π https://web.nas-kusuma-my.cloud/SKKPd_XIIRPL2/logout.php
:::
```PHP=2
setcookie('username', '', time(), '/');
setcookie('level_user', '', time(), '/');
setcookie('nama_lengkap', '', time(), '/');
setcookie('nis', '', time(), '/');
setcookie('angkatan', '', time(), '/');
setcookie('status', '', time(), '/');
session_start();
session_destroy();
```
> [color=red]
> πͺ setcookie() adalah fungsi untuk mengatur cookie di browser.
> [color=red]
> Dengan memberikan nilai '' (kosong) dan π waktu kedaluwarsa = time() (saat ini), πͺ cookie akan langsung dihapus.
> [color=red]
> πͺ Cookie yang dihapus:
>> **username** β Menyimpan username/NIS dari pengguna yang login.
>> **level_user** β Menyimpan peran pengguna (operator atau siswa).
>> **nama_lengkap** β Menyimpan nama lengkap pengguna.