MODUL PEMROGRAMAN WEBSITE 2
Mata Kuliah: Pemrograman Website 2
Kode MK: INF2419
SKS: 3 (Praktikum)
Semester: Genap 2025/2026
Program Studi: Informatika
Fakultas: FEBI / Saintek
Universitas: UIN K.H. Abdurrahman Wahid Pekalongan
Dosen Pengampu: Mohammad Reza Maulana, M.Kom
NIP: 199110082025051002
Pertemuan: 3 dari 16
Durasi: 150 menit (3 Ã 50 menit)
Studi Kasus Berkelanjutan: Sistem Manajemen Perpustakaan
PERTEMUAN 3
KONTROL ALUR PROGRAM PHP
A. INFORMASI PERTEMUAN
| Aspek | Keterangan |
|---|---|
| Capaian Pembelajaran Lulusan (CPL) | CPL04: Menguasai konsep teoretis bidang ilmu komputer/informatika dan mampu memformulasikan penyelesaian masalah prosedural. |
| Capaian Pembelajaran Mata Kuliah (CPMK) | CPMK04.1: Memahami konsep dasar pengembangan web backend menggunakan PHP dan database |
| Sub-CPMK | Sub-CPMK04.1.2: Menjelaskan dan menggunakan sintaks dasar PHP untuk menghasilkan output dinamis (lanjutan - kontrol alur) |
| Indikator Pencapaian | Mahasiswa mampu: 1. Menjelaskan dan menggunakan struktur percabangan (if, else, elseif, switch) 2. Menjelaskan dan menggunakan struktur perulangan (for, while, foreach) 3. Menggunakan logical operators dalam kondisi 4. Membuat nested conditions untuk logika kompleks 5. Menerapkan kontrol alur dalam sistem cek ketersediaan buku |
| Alokasi Waktu | âĸ Teori: 60 menit âĸ Praktikum: 90 menit âĸ Total: 150 menit (3 Ã 50 menit) |
B. PENDAHULUAN
1. Deskripsi Singkat
Pertemuan ketiga ini membahas struktur kontrol alur program dalam PHP, yaitu percabangan (conditional statements) dan perulangan (looping). Mahasiswa akan mempelajari bagaimana membuat program yang dapat mengambil keputusan berdasarkan kondisi tertentu dan melakukan pengulangan proses. Semua konsep akan langsung diterapkan dalam studi kasus sistem perpustakaan, khususnya untuk logika ketersediaan buku dan validasi data.
2. Keterkaitan dengan Pertemuan Lain
Pertemuan ini merupakan kelanjutan langsung dari pertemuan sebelumnya:
- Pertemuan 2: Menggunakan variabel dan operator yang telah dipelajari
- Pertemuan 4: Kontrol alur akan dikombinasikan dengan array dan function
- Pertemuan 5-7: Digunakan untuk validasi form dan logika CRUD
- Pertemuan 9-16: Konsep yang sama diterapkan dalam Laravel
3. Manfaat Pembelajaran
- Mampu membuat program yang dapat mengambil keputusan
- Dapat mengotomasi proses berulang
- Memahami logika bisnis dalam sistem perpustakaan
- Siap membuat validasi dan business rules yang kompleks
4. Relevansi dengan Studi Kasus
Dalam sistem perpustakaan, kontrol alur digunakan untuk:
- Mengecek ketersediaan buku (stok > 0)
- Menentukan status buku (tersedia/dipinjam)
- Mengkategorikan buku berdasarkan kriteria
- Menampilkan daftar buku dengan perulangan
- Validasi input data buku dan anggota
C. MATERI TEORI
1. Percabangan (Conditional Statements)
a. Konsep Percabangan
Percabangan adalah struktur kontrol yang memungkinkan program mengambil keputusan berdasarkan kondisi tertentu. Program dapat menjalankan code yang berbeda tergantung apakah kondisi bernilai true atau false.
Analogi: Seperti persimpangan jalan - jika lampu hijau, jalan terus; jika merah, berhenti.
b. Statement IF
Sintaks dasar:
if (kondisi) {
// Code dijalankan jika kondisi true
}Contoh dalam Perpustakaan:
<?php
$stok = 5;
if ($stok > 0) {
echo "Buku tersedia untuk dipinjam";
}
?>Flowchart IF:
[Mulai] â [Cek kondisi] â (true) â [Jalankan code] â [Selesai]
â (false)
â [Selesai]c. Statement IF-ELSE
Sintaks:
if (kondisi) {
// Code jika kondisi true
} else {
// Code jika kondisi false
}Contoh:
<?php
$stok = 0;
if ($stok > 0) {
echo "Buku tersedia";
} else {
echo "Buku tidak tersedia";
}
?>d. Statement IF-ELSEIF-ELSE
Untuk multiple kondisi:
if (kondisi1) {
// Code jika kondisi1 true
} elseif (kondisi2) {
// Code jika kondisi2 true
} elseif (kondisi3) {
// Code jika kondisi3 true
} else {
// Code jika semua kondisi false
}Contoh Kategori Stok:
<?php
$stok = 15;
if ($stok == 0) {
$status = "Habis";
$badge = "danger";
} elseif ($stok < 5) {
$status = "Stok Menipis";
$badge = "warning";
} elseif ($stok < 10) {
$status = "Stok Sedang";
$badge = "info";
} else {
$status = "Stok Aman";
$badge = "success";
}
echo "<span class='badge bg-$badge'>$status</span>";
?>e. Nested IF (IF Bersarang)
IF di dalam IF untuk logika lebih kompleks:
<?php
$stok = 5;
$is_member = true;
$jumlah_pinjam = 2;
if ($stok > 0) {
if ($is_member) {
if ($jumlah_pinjam <= 3) {
echo "Peminjaman disetujui";
} else {
echo "Maksimal pinjam 3 buku";
}
} else {
echo "Harus menjadi member terlebih dahulu";
}
} else {
echo "Buku tidak tersedia";
}
?>f. Statement SWITCH
Alternatif untuk multiple IF-ELSEIF, lebih efisien untuk mengecek satu variabel dengan banyak nilai:
switch (variabel) {
case nilai1:
// Code untuk nilai1
break;
case nilai2:
// Code untuk nilai2
break;
default:
// Code jika tidak ada yang match
}Contoh Kategori Buku:
<?php
$kategori = "Programming";
switch ($kategori) {
case "Programming":
$warna = "primary";
$icon = "code";
break;
case "Database":
$warna = "success";
$icon = "database";
break;
case "Web Design":
$warna = "info";
$icon = "palette";
break;
case "Networking":
$warna = "warning";
$icon = "wifi";
break;
default:
$warna = "secondary";
$icon = "book";
}
echo "<span class='badge bg-$warna'><i class='bi bi-$icon'></i> $kategori</span>";
?>Kapan Menggunakan SWITCH:
- Saat mengecek satu variabel dengan banyak nilai yang mungkin
- Lebih readable untuk banyak kondisi
- Lebih efisien daripada banyak IF-ELSEIF
Kapan Menggunakan IF:
- Kondisi kompleks dengan operator berbeda
- Mengecek multiple variabel
- Kondisi dengan range nilai
2. Logical Operators
Untuk membuat kondisi yang lebih kompleks:
| Operator | Nama | Contoh | Keterangan |
|---|---|---|---|
| && atau and | AND | $a && $b | True jika kedua kondisi true |
| || atau or | OR | $a || $b | True jika salah satu true |
| ! | NOT | !$a | Membalik nilai boolean |
| xor | XOR | $a xor $b | True jika salah satu true (bukan keduanya) |
Contoh:
<?php
// AND: Kedua kondisi harus true
$stok = 10;
$harga = 50000;
if ($stok > 0 && $harga < 100000) {
echo "Buku tersedia dan terjangkau";
}
// OR: Salah satu kondisi true
$kategori = "Programming";
$bahasa = "Indonesia";
if ($kategori == "Programming" || $kategori == "Database") {
echo "Buku teknis";
}
// NOT: Membalik kondisi
$is_dipinjam = false;
if (!$is_dipinjam) {
echo "Buku tersedia";
}
// Kombinasi kompleks
$stok = 5;
$is_member = true;
$total_pinjaman = 2;
if ($stok > 0 && ($is_member || $total_pinjaman == 0)) {
echo "Boleh pinjam";
}
?>Operator Precedence (Prioritas):
!(NOT)&&(AND)||(OR)
Tip: Gunakan tanda kurung () untuk memperjelas urutan evaluasi.
3. Perulangan (Looping)
a. Konsep Perulangan
Perulangan memungkinkan menjalankan code yang sama berkali-kali tanpa harus menulis ulang.
Manfaat:
- Menghindari code repetition
- Memproses data dalam jumlah banyak
- Mengotomasi tugas berulang
b. FOR Loop
Digunakan ketika tahu berapa kali akan mengulang.
Sintaks:
for (inisialisasi; kondisi; increment) {
// Code yang diulang
}Komponen:
- Inisialisasi: Dilakukan sekali di awal
- Kondisi: Dicek setiap iterasi, jika true lanjut
- Increment: Dijalankan setiap akhir iterasi
Contoh Sederhana:
<?php
// Menampilkan nomor 1-5
for ($i = 1; $i <= 5; $i++) {
echo "Nomor: $i<br />";
}
// Output:
// Nomor: 1
// Nomor: 2
// Nomor: 3
// Nomor: 4
// Nomor: 5
?>Contoh dalam Perpustakaan:
<?php
// Generate kode buku otomatis
for ($i = 1; $i <= 10; $i++) {
$kode = "BK-" . str_pad($i, 4, "0", STR_PAD_LEFT);
echo "$kode<br />";
}
// Output:
// BK-0001
// BK-0002
// ...
// BK-0010
?>For Loop dengan Step Berbeda:
<?php
// Increment 2
for ($i = 0; $i <= 10; $i += 2) {
echo "$i "; // 0 2 4 6 8 10
}
// Decrement
for ($i = 10; $i >= 1; $i--) {
echo "$i "; // 10 9 8 7 6 5 4 3 2 1
}
?>c. WHILE Loop
Digunakan ketika tidak tahu pasti berapa kali akan mengulang, tergantung kondisi.
Sintaks:
while (kondisi) {
// Code yang diulang
}Contoh:
<?php
$stok = 10;
$terjual = 0;
while ($stok > 0) {
$stok--;
$terjual++;
echo "Buku terjual: $terjual, Sisa stok: $stok<br />";
}
?>Hati-hati: Pastikan kondisi suatu saat akan menjadi false, jika tidak akan terjadi infinite loop!
Contoh Infinite Loop (HINDARI!):
<?php
$i = 1;
while ($i > 0) { // Selalu true!
echo $i;
$i++; // $i makin besar, kondisi tetap true
}
// Program tidak akan berhenti!
?>d. DO-WHILE Loop
Mirip while, tapi dijamin minimal 1x eksekusi (kondisi dicek di akhir).
Sintaks:
do {
// Code yang diulang
} while (kondisi);Contoh:
<?php
$stok = 0;
do {
echo "Cek stok: $stok<br />";
$stok++;
} while ($stok < 3);
// Output:
// Cek stok: 0
// Cek stok: 1
// Cek stok: 2
?>Perbedaan WHILE vs DO-WHILE:
<?php
// WHILE - tidak akan jalan jika kondisi awal false
$i = 10;
while ($i < 5) {
echo "Tidak tampil";
}
// DO-WHILE - minimal 1x jalan
$i = 10;
do {
echo "Tampil sekali";
} while ($i < 5);
?>e. FOREACH Loop
Khusus untuk mengiterasi array (akan dipelajari lebih detail di pertemuan 4).
Sintaks:
foreach ($array as $value) {
// Code menggunakan $value
}
// Atau dengan key
foreach ($array as $key => $value) {
// Code menggunakan $key dan $value
}Preview Contoh:
<?php
$buku = ["PHP", "MySQL", "Laravel", "JavaScript"];
foreach ($buku as $judul) {
echo "- $judul<br />";
}
// Output:
// - PHP
// - MySQL
// - Laravel
// - JavaScript
?>4. Break dan Continue
a. BREAK
Menghentikan loop sepenuhnya.
<?php
// Cari buku, berhenti jika ketemu
$buku_list = ["HTML", "CSS", "PHP", "MySQL"];
$cari = "PHP";
foreach ($buku_list as $buku) {
if ($buku == $cari) {
echo "Buku ditemukan: $buku";
break; // Stop loop
}
}
?>b. CONTINUE
Skip iterasi saat ini, lanjut ke iterasi berikutnya.
<?php
// Tampilkan hanya buku dengan stok > 0
for ($i = 1; $i <= 5; $i++) {
$stok = rand(0, 10);
if ($stok == 0) {
continue; // Skip buku ini
}
echo "Buku $i: Stok $stok<br />";
}
?>Perbandingan:
<?php
// Tanpa continue
for ($i = 1; $i <= 5; $i++) {
if ($i % 2 == 0) {
echo "$i genap<br />";
}
}
// Dengan continue (skip ganjil)
for ($i = 1; $i <= 5; $i++) {
if ($i % 2 != 0) {
continue;
}
echo "$i genap<br />";
}
?>5. Nested Loops (Loop Bersarang)
Loop di dalam loop untuk struktur data 2 dimensi atau lebih.
<?php
// Menampilkan rak dan buku
for ($rak = 1; $rak <= 3; $rak++) {
echo "Rak $rak:<br />";
for ($buku = 1; $buku <= 4; $buku++) {
echo " - Buku $buku<br />";
}
echo "<br />";
}
// Output:
// Rak 1:
// - Buku 1
// - Buku 2
// - Buku 3
// - Buku 4
//
// Rak 2:
// - Buku 1
// ...
?>6. Ternary Operator
Shorthand untuk IF-ELSE sederhana.
Sintaks:
$variabel = (kondisi) ? nilai_jika_true : nilai_jika_false;Contoh:
<?php
$stok = 5;
// Cara biasa
if ($stok > 0) {
$status = "Tersedia";
} else {
$status = "Habis";
}
// Dengan ternary
$status = ($stok > 0) ? "Tersedia" : "Habis";
// Langsung di echo
echo ($stok > 0) ? "Tersedia" : "Habis";
?>Nested Ternary (Hindari jika terlalu kompleks):
<?php
$stok = 3;
$status = ($stok > 10) ? "Aman" :
($stok > 5) ? "Sedang" :
($stok > 0) ? "Menipis" : "Habis";
echo $status; // Menipis
?>D. PRAKTIKUM
1. Tujuan Praktikum
- Mengimplementasikan percabangan untuk cek ketersediaan buku
- Menggunakan switch untuk kategori buku
- Menerapkan perulangan untuk menampilkan multiple buku
- Membuat validasi input sederhana
- Membuat sistem cek ketersediaan buku lengkap
2. PRAKTIKUM 1: Logika Ketersediaan Buku
Tujuan
Membuat halaman yang mengecek ketersediaan buku berdasarkan stok.
Langkah-langkah
Buat file cek_ketersediaan.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cek Ketersediaan Buku</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4"><i class="bi bi-search"></i> Cek Ketersediaan Buku</h1>
<?php
// Data buku 1
$judul1 = "Pemrograman PHP untuk Pemula";
$stok1 = 5;
$harga1 = 75000;
// Data buku 2
$judul2 = "Mastering MySQL Database";
$stok2 = 0;
$harga2 = 95000;
// Data buku 3
$judul3 = "Laravel Framework Advanced";
$stok3 = 2;
$harga3 = 125000;
?>
<!-- Buku 1 -->
<div class="card mb-3">
<div class="card-header bg-primary text-white">
<h5 class="mb-0"><?php echo $judul1; ?></h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-8">
<p><strong>Harga:</strong> Rp <?php echo number_format($harga1, 0, ',', '.'); ?></p>
<p><strong>Stok:</strong> <?php echo $stok1; ?> buku</p>
<?php
// Logika ketersediaan
if ($stok1 > 0) {
$status1 = "Tersedia";
$badge1 = "success";
$icon1 = "check-circle";
$pesan1 = "Buku dapat dipinjam";
} else {
$status1 = "Tidak Tersedia";
$badge1 = "danger";
$icon1 = "x-circle";
$pesan1 = "Mohon maaf, buku sedang dipinjam semua";
}
?>
<p>
<strong>Status:</strong>
<span class="badge bg-<?php echo $badge1; ?>">
<i class="bi bi-<?php echo $icon1; ?>"></i> <?php echo $status1; ?>
</span>
</p>
<p class="text-muted"><em><?php echo $pesan1; ?></em></p>
</div>
<div class="col-md-4 text-end">
<?php if ($stok1 > 0): ?>
<button class="btn btn-success">
<i class="bi bi-cart-plus"></i> Pinjam
</button>
<?php else: ?>
<button class="btn btn-secondary" disabled>
<i class="bi bi-lock"></i> Tidak Tersedia
</button>
<?php endif; ?>
</div>
</div>
</div>
</div>
<!-- Buku 2 -->
<div class="card mb-3">
<div class="card-header bg-primary text-white">
<h5 class="mb-0"><?php echo $judul2; ?></h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-8">
<p><strong>Harga:</strong> Rp <?php echo number_format($harga2, 0, ',', '.'); ?></p>
<p><strong>Stok:</strong> <?php echo $stok2; ?> buku</p>
<?php
if ($stok2 > 0) {
$status2 = "Tersedia";
$badge2 = "success";
$icon2 = "check-circle";
$pesan2 = "Buku dapat dipinjam";
} else {
$status2 = "Tidak Tersedia";
$badge2 = "danger";
$icon2 = "x-circle";
$pesan2 = "Mohon maaf, buku sedang dipinjam semua";
}
?>
<p>
<strong>Status:</strong>
<span class="badge bg-<?php echo $badge2; ?>">
<i class="bi bi-<?php echo $icon2; ?>"></i> <?php echo $status2; ?>
</span>
</p>
<p class="text-muted"><em><?php echo $pesan2; ?></em></p>
</div>
<div class="col-md-4 text-end">
<?php if ($stok2 > 0): ?>
<button class="btn btn-success">
<i class="bi bi-cart-plus"></i> Pinjam
</button>
<?php else: ?>
<button class="btn btn-secondary" disabled>
<i class="bi bi-lock"></i> Tidak Tersedia
</button>
<?php endif; ?>
</div>
</div>
</div>
</div>
<!-- Buku 3 dengan logika stok menipis -->
<div class="card mb-3">
<div class="card-header bg-primary text-white">
<h5 class="mb-0"><?php echo $judul3; ?></h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-8">
<p><strong>Harga:</strong> Rp <?php echo number_format($harga3, 0, ',', '.'); ?></p>
<p><strong>Stok:</strong> <?php echo $stok3; ?> buku</p>
<?php
// Logika lebih detail
if ($stok3 == 0) {
$status3 = "Tidak Tersedia";
$badge3 = "danger";
$icon3 = "x-circle";
$pesan3 = "Buku sedang dipinjam semua";
} elseif ($stok3 < 3) {
$status3 = "Stok Menipis";
$badge3 = "warning";
$icon3 = "exclamation-triangle";
$pesan3 = "Segera pinjam, hanya tersisa $stok3 buku";
} elseif ($stok3 < 10) {
$status3 = "Tersedia";
$badge3 = "info";
$icon3 = "info-circle";
$pesan3 = "Stok terbatas, tersedia $stok3 buku";
} else {
$status3 = "Tersedia";
$badge3 = "success";
$icon3 = "check-circle";
$pesan3 = "Stok buku mencukupi";
}
?>
<p>
<strong>Status:</strong>
<span class="badge bg-<?php echo $badge3; ?>">
<i class="bi bi-<?php echo $icon3; ?>"></i> <?php echo $status3; ?>
</span>
</p>
<p class="text-muted"><em><?php echo $pesan3; ?></em></p>
</div>
<div class="col-md-4 text-end">
<?php if ($stok3 > 0): ?>
<button class="btn btn-success">
<i class="bi bi-cart-plus"></i> Pinjam
</button>
<?php else: ?>
<button class="btn btn-secondary" disabled>
<i class="bi bi-lock"></i> Tidak Tersedia
</button>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Testing:
- Akses:
http://localhost/perpustakaan/cek_ketersediaan.php - Perhatikan perbedaan status untuk setiap stok
- Coba ubah nilai stok dan lihat perubahannya
3. PRAKTIKUM 2: Switch untuk Kategori Buku
Tujuan
Menggunakan switch statement untuk mengkategorikan buku.
Langkah-langkah
Buat file kategori_buku.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kategori Buku</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4"><i class="bi bi-bookmark"></i> Kategori Buku Perpustakaan</h1>
<div class="row">
<?php
// Array data buku (preview, akan dipelajari detail di pertemuan 4)
$buku_list = [
["judul" => "PHP Programming", "kategori" => "Programming"],
["judul" => "MySQL Database", "kategori" => "Database"],
["judul" => "Web Design Principles", "kategori" => "Web Design"],
["judul" => "Network Security", "kategori" => "Networking"],
["judul" => "Digital Marketing", "kategori" => "Marketing"],
["judul" => "Data Science with Python", "kategori" => "Programming"]
];
// Loop setiap buku
foreach ($buku_list as $buku):
// Switch untuk menentukan warna, icon, dan deskripsi
switch ($buku["kategori"]) {
case "Programming":
$warna = "primary";
$icon = "code-slash";
$deskripsi = "Buku tentang bahasa pemrograman dan pengembangan software";
break;
case "Database":
$warna = "success";
$icon = "database";
$deskripsi = "Buku tentang manajemen dan desain database";
break;
case "Web Design":
$warna = "info";
$icon = "palette";
$deskripsi = "Buku tentang desain antarmuka dan pengalaman pengguna";
break;
case "Networking":
$warna = "warning";
$icon = "wifi";
$deskripsi = "Buku tentang jaringan komputer dan keamanan";
break;
case "Marketing":
$warna = "danger";
$icon = "megaphone";
$deskripsi = "Buku tentang strategi pemasaran digital";
break;
default:
$warna = "secondary";
$icon = "book";
$deskripsi = "Kategori umum";
}
?>
<div class="col-md-6 mb-3">
<div class="card border-<?php echo $warna; ?>">
<div class="card-header bg-<?php echo $warna; ?> text-white">
<h5 class="mb-0">
<i class="bi bi-<?php echo $icon; ?>"></i>
<?php echo $buku["judul"]; ?>
</h5>
</div>
<div class="card-body">
<p>
<span class="badge bg-<?php echo $warna; ?>">
<?php echo $buku["kategori"]; ?>
</span>
</p>
<p class="text-muted"><small><?php echo $deskripsi; ?></small></p>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<!-- Statistik Kategori -->
<div class="card mt-4">
<div class="card-header bg-dark text-white">
<h5 class="mb-0">Statistik Kategori</h5>
</div>
<div class="card-body">
<?php
// Contoh penggunaan switch untuk statistik
$total_programming = 0;
$total_database = 0;
$total_web_design = 0;
$total_networking = 0;
$total_marketing = 0;
$total_lainnya = 0;
foreach ($buku_list as $buku) {
switch ($buku["kategori"]) {
case "Programming":
$total_programming++;
break;
case "Database":
$total_database++;
break;
case "Web Design":
$total_web_design++;
break;
case "Networking":
$total_networking++;
break;
case "Marketing":
$total_marketing++;
break;
default:
$total_lainnya++;
}
}
?>
<div class="row">
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between">
<span><i class="bi bi-code-slash text-primary"></i> Programming</span>
<span class="badge bg-primary"><?php echo $total_programming; ?></span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="bi bi-database text-success"></i> Database</span>
<span class="badge bg-success"><?php echo $total_database; ?></span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="bi bi-palette text-info"></i> Web Design</span>
<span class="badge bg-info"><?php echo $total_web_design; ?></span>
</li>
</ul>
</div>
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between">
<span><i class="bi bi-wifi text-warning"></i> Networking</span>
<span class="badge bg-warning"><?php echo $total_networking; ?></span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="bi bi-megaphone text-danger"></i> Marketing</span>
<span class="badge bg-danger"><?php echo $total_marketing; ?></span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="bi bi-book text-secondary"></i> Lainnya</span>
<span class="badge bg-secondary"><?php echo $total_lainnya; ?></span>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Testing:
- Akses:
http://localhost/perpustakaan/kategori_buku.php - Perhatikan warna dan icon yang berbeda untuk setiap kategori
- Lihat statistik kategori di bagian bawah
4. PRAKTIKUM 3: Loop Menampilkan Multiple Buku
Tujuan
Menggunakan perulangan untuk menampilkan daftar buku secara dinamis.
Langkah-langkah
Buat file daftar_buku.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Daftar Buku</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4"><i class="bi bi-book"></i> Daftar Buku Perpustakaan</h1>
<!-- Contoh 1: FOR Loop -->
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h5 class="mb-0">Metode 1: Menggunakan FOR Loop</h5>
</div>
<div class="card-body">
<table class="table table-striped table-hover">
<thead>
<tr>
<th width="50">No</th>
<th>Kode Buku</th>
<th>Judul</th>
<th>Stok</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?php
// Simulasi data dengan FOR loop
for ($i = 1; $i <= 10; $i++) {
// Generate data dinamis
$kode = "BK-" . str_pad($i, 4, "0", STR_PAD_LEFT);
$judul = "Buku Pemrograman Vol. $i";
$stok = rand(0, 15); // Random stok 0-15
// Tentukan status berdasarkan stok
if ($stok == 0) {
$status = "Habis";
$badge = "danger";
} elseif ($stok < 5) {
$status = "Menipis";
$badge = "warning";
} else {
$status = "Tersedia";
$badge = "success";
}
?>
<tr>
<td><?php echo $i; ?></td>
<td><code><?php echo $kode; ?></code></td>
<td><?php echo $judul; ?></td>
<td><?php echo $stok; ?></td>
<td>
<span class="badge bg-<?php echo $badge; ?>">
<?php echo $status; ?>
</span>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
<!-- Contoh 2: WHILE Loop -->
<div class="card mb-4">
<div class="card-header bg-success text-white">
<h5 class="mb-0">Metode 2: Menggunakan WHILE Loop</h5>
</div>
<div class="card-body">
<div class="row">
<?php
$counter = 1;
while ($counter <= 6) {
$judul = "Buku Teknologi #$counter";
$harga = 50000 + ($counter * 10000);
$stok = rand(0, 20);
?>
<div class="col-md-4 mb-3">
<div class="card">
<div class="card-body">
<h6 class="card-title"><?php echo $judul; ?></h6>
<p class="card-text">
<strong>Harga:</strong> Rp <?php echo number_format($harga, 0, ',', '.'); ?><br />
<strong>Stok:</strong> <?php echo $stok; ?>
</p>
<?php if ($stok > 0): ?>
<button class="btn btn-sm btn-primary">Pinjam</button>
<?php else: ?>
<button class="btn btn-sm btn-secondary" disabled>Habis</button>
<?php endif; ?>
</div>
</div>
</div>
<?php
$counter++;
}
?>
</div>
</div>
</div>
<!-- Contoh 3: Nested Loop -->
<div class="card mb-4">
<div class="card-header bg-info text-white">
<h5 class="mb-0">Metode 3: Nested Loop (Rak Perpustakaan)</h5>
</div>
<div class="card-body">
<?php
// Loop untuk rak
for ($rak = 1; $rak <= 3; $rak++) {
echo "<div class='mb-4'>";
echo "<h5><i class='bi bi-bookshelf'></i> Rak $rak</h5>";
echo "<div class='row'>";
// Loop untuk buku di setiap rak
for ($buku = 1; $buku <= 4; $buku++) {
$nomor = ($rak - 1) * 4 + $buku;
$kode = "R$rak-B$buku";
$stok = rand(0, 10);
// Warna berdasarkan rak
switch ($rak) {
case 1:
$warna_rak = "primary";
break;
case 2:
$warna_rak = "success";
break;
case 3:
$warna_rak = "warning";
break;
}
?>
<div class="col-md-3 mb-2">
<div class="card border-<?php echo $warna_rak; ?>">
<div class="card-body text-center p-2">
<small><strong><?php echo $kode; ?></strong></small><br />
<small>Stok: <?php echo $stok; ?></small>
</div>
</div>
</div>
<?php
}
echo "</div></div>";
}
?>
</div>
</div>
<!-- Contoh 4: Loop dengan Skip (Continue) -->
<div class="card mb-4">
<div class="card-header bg-warning">
<h5 class="mb-0">Metode 4: Hanya Tampilkan Buku Tersedia (Continue)</h5>
</div>
<div class="card-body">
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> Menampilkan hanya buku dengan stok > 0
</div>
<div class="row">
<?php
for ($i = 1; $i <= 12; $i++) {
$stok = rand(0, 10);
// Skip jika stok habis
if ($stok == 0) {
continue;
}
$judul = "Buku Digital #$i";
?>
<div class="col-md-3 mb-3">
<div class="card border-success">
<div class="card-body">
<h6><?php echo $judul; ?></h6>
<p class="mb-0">
<span class="badge bg-success">Stok: <?php echo $stok; ?></span>
</p>
</div>
</div>
</div>
<?php } ?>
</div>
</div>
</div>
<!-- Contoh 5: Loop dengan Break -->
<div class="card">
<div class="card-header bg-danger text-white">
<h5 class="mb-0">Metode 5: Tampilkan Maksimal 5 Buku (Break)</h5>
</div>
<div class="card-body">
<div class="alert alert-warning">
<i class="bi bi-info-circle"></i> Loop akan berhenti setelah menampilkan 5 buku
</div>
<ul class="list-group">
<?php
$counter = 1;
$max_display = 5;
while ($counter <= 20) {
echo "<li class='list-group-item'>";
echo "Buku ke-$counter: Panduan Lengkap Vol. $counter";
echo "</li>";
if ($counter >= $max_display) {
break; // Stop di buku ke-5
}
$counter++;
}
?>
</ul>
<div class="alert alert-info mt-3 mb-0">
Loop berhenti di counter: <?php echo $counter; ?>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Testing:
- Akses:
http://localhost/perpustakaan/daftar_buku.php - Perhatikan perbedaan setiap metode loop
- Refresh halaman untuk melihat data random berubah
- Pahami konsep nested loop, continue, dan break
5. PRAKTIKUM 4: Validasi Input Sederhana
Tujuan
Membuat validasi data buku menggunakan percabangan.
Langkah-langkah
Buat file validasi_buku.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Validasi Data Buku</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4"><i class="bi bi-shield-check"></i> Validasi Data Buku</h1>
<?php
// Simulasi data input (nanti akan dari form)
$judul = "PHP Programming";
$pengarang = "John Doe";
$penerbit = ""; // Kosong - error
$tahun = 2025;
$harga = -50000; // Negatif - error
$stok = 5;
$isbn = "978-0-123"; // Kurang panjang - error
// Array untuk menyimpan error
$errors = [];
$valid = true;
// Validasi Judul
if (empty($judul)) {
$errors[] = "Judul buku harus diisi";
$valid = false;
} elseif (strlen($judul) < 3) {
$errors[] = "Judul buku minimal 3 karakter";
$valid = false;
}
// Validasi Pengarang
if (empty($pengarang)) {
$errors[] = "Pengarang harus diisi";
$valid = false;
}
// Validasi Penerbit
if (empty($penerbit)) {
$errors[] = "Penerbit harus diisi";
$valid = false;
}
// Validasi Tahun
$tahun_sekarang = date("Y");
if (empty($tahun)) {
$errors[] = "Tahun terbit harus diisi";
$valid = false;
} elseif ($tahun < 1900) {
$errors[] = "Tahun terbit tidak valid (minimal 1900)";
$valid = false;
} elseif ($tahun > $tahun_sekarang) {
$errors[] = "Tahun terbit tidak boleh lebih dari tahun sekarang ($tahun_sekarang)";
$valid = false;
}
// Validasi Harga
if (empty($harga)) {
$errors[] = "Harga harus diisi";
$valid = false;
} elseif ($harga < 0) {
$errors[] = "Harga tidak boleh negatif";
$valid = false;
} elseif ($harga < 10000) {
$errors[] = "Harga terlalu murah (minimal Rp 10.000)";
$valid = false;
}
// Validasi Stok
if (!isset($stok)) {
$errors[] = "Stok harus diisi";
$valid = false;
} elseif ($stok < 0) {
$errors[] = "Stok tidak boleh negatif";
$valid = false;
}
// Validasi ISBN
if (empty($isbn)) {
$errors[] = "ISBN harus diisi";
$valid = false;
} elseif (strlen($isbn) < 10) {
$errors[] = "ISBN minimal 10 karakter";
$valid = false;
}
?>
<!-- Tampilkan Data Input -->
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h5 class="mb-0">Data Input</h5>
</div>
<div class="card-body">
<table class="table table-bordered">
<tr>
<th width="200">Judul</th>
<td><?php echo !empty($judul) ? $judul : '<em class="text-muted">Kosong</em>'; ?></td>
</tr>
<tr>
<th>Pengarang</th>
<td><?php echo !empty($pengarang) ? $pengarang : '<em class="text-muted">Kosong</em>'; ?></td>
</tr>
<tr>
<th>Penerbit</th>
<td><?php echo !empty($penerbit) ? $penerbit : '<em class="text-muted">Kosong</em>'; ?></td>
</tr>
<tr>
<th>Tahun Terbit</th>
<td><?php echo $tahun; ?></td>
</tr>
<tr>
<th>Harga</th>
<td>Rp <?php echo number_format($harga, 0, ',', '.'); ?></td>
</tr>
<tr>
<th>Stok</th>
<td><?php echo $stok; ?></td>
</tr>
<tr>
<th>ISBN</th>
<td><?php echo !empty($isbn) ? $isbn : '<em class="text-muted">Kosong</em>'; ?></td>
</tr>
</table>
</div>
</div>
<!-- Hasil Validasi -->
<?php if ($valid): ?>
<div class="alert alert-success">
<h5><i class="bi bi-check-circle"></i> Validasi Berhasil!</h5>
<p class="mb-0">Semua data valid dan siap disimpan ke database.</p>
</div>
<?php else: ?>
<div class="alert alert-danger">
<h5><i class="bi bi-x-circle"></i> Validasi Gagal!</h5>
<p>Ditemukan <?php echo count($errors); ?> kesalahan:</p>
<ul class="mb-0">
<?php foreach ($errors as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<!-- Detail Validasi per Field -->
<div class="card">
<div class="card-header bg-info text-white">
<h5 class="mb-0">Detail Validasi per Field</h5>
</div>
<div class="card-body">
<div class="row">
<!-- Validasi Judul -->
<div class="col-md-6 mb-3">
<div class="card">
<div class="card-header">
Validasi Judul
</div>
<div class="card-body">
<?php
if (empty($judul)) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> Judul kosong';
echo '</div>';
} elseif (strlen($judul) < 3) {
echo '<div class="alert alert-warning mb-0">';
echo '<i class="bi bi-exclamation-triangle"></i> Judul terlalu pendek (' . strlen($judul) . ' karakter)';
echo '</div>';
} else {
echo '<div class="alert alert-success mb-0">';
echo '<i class="bi bi-check-circle"></i> Judul valid (' . strlen($judul) . ' karakter)';
echo '</div>';
}
?>
</div>
</div>
</div>
<!-- Validasi Tahun -->
<div class="col-md-6 mb-3">
<div class="card">
<div class="card-header">
Validasi Tahun Terbit
</div>
<div class="card-body">
<?php
if (empty($tahun)) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> Tahun kosong';
echo '</div>';
} elseif ($tahun < 1900) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> Tahun terlalu lama';
echo '</div>';
} elseif ($tahun > $tahun_sekarang) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> Tahun melebihi tahun sekarang';
echo '</div>';
} else {
echo '<div class="alert alert-success mb-0">';
echo '<i class="bi bi-check-circle"></i> Tahun valid';
echo '</div>';
}
?>
</div>
</div>
</div>
<!-- Validasi Harga -->
<div class="col-md-6 mb-3">
<div class="card">
<div class="card-header">
Validasi Harga
</div>
<div class="card-body">
<?php
if (empty($harga)) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> Harga kosong';
echo '</div>';
} elseif ($harga < 0) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> Harga negatif';
echo '</div>';
} elseif ($harga < 10000) {
echo '<div class="alert alert-warning mb-0">';
echo '<i class="bi bi-exclamation-triangle"></i> Harga terlalu murah';
echo '</div>';
} else {
echo '<div class="alert alert-success mb-0">';
echo '<i class="bi bi-check-circle"></i> Harga valid';
echo '</div>';
}
?>
</div>
</div>
</div>
<!-- Validasi ISBN -->
<div class="col-md-6 mb-3">
<div class="card">
<div class="card-header">
Validasi ISBN
</div>
<div class="card-body">
<?php
if (empty($isbn)) {
echo '<div class="alert alert-danger mb-0">';
echo '<i class="bi bi-x-circle"></i> ISBN kosong';
echo '</div>';
} elseif (strlen($isbn) < 10) {
echo '<div class="alert alert-warning mb-0">';
echo '<i class="bi bi-exclamation-triangle"></i> ISBN terlalu pendek (' . strlen($isbn) . ' karakter, minimal 10)';
echo '</div>';
} else {
echo '<div class="alert alert-success mb-0">';
echo '<i class="bi bi-check-circle"></i> ISBN valid';
echo '</div>';
}
?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Testing:
- Akses:
http://localhost/perpustakaan/validasi_buku.php - Perhatikan error yang muncul
- Coba ubah nilai variabel menjadi valid
- Pahami logika setiap validasi
6. PRAKTIKUM 5: Sistem Cek Ketersediaan Lengkap
Tujuan
Mengintegrasikan semua konsep kontrol alur dalam satu sistem lengkap.
Langkah-langkah
Buat file sistem_ketersediaan.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sistem Ketersediaan Buku</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container-fluid">
<a class="navbar-brand" href="#">
<i class="bi bi-book"></i> Sistem Perpustakaan
</a>
</div>
</nav>
<div class="container mt-4">
<h1 class="mb-4"><i class="bi bi-search"></i> Sistem Cek Ketersediaan Buku</h1>
<?php
// Data Buku dalam Array
$buku_list = [
[
"kode" => "BK-001",
"judul" => "Pemrograman PHP untuk Pemula",
"kategori" => "Programming",
"pengarang" => "Budi Raharjo",
"tahun" => 2023,
"harga" => 75000,
"stok" => 8
],
[
"kode" => "BK-002",
"judul" => "Mastering MySQL Database",
"kategori" => "Database",
"pengarang" => "Andi Nugroho",
"tahun" => 2022,
"harga" => 95000,
"stok" => 0
],
[
"kode" => "BK-003",
"judul" => "Laravel Framework Advanced",
"kategori" => "Programming",
"pengarang" => "Siti Aminah",
"tahun" => 2024,
"harga" => 125000,
"stok" => 2
],
[
"kode" => "BK-004",
"judul" => "Web Design Principles",
"kategori" => "Web Design",
"pengarang" => "Dedi Santoso",
"tahun" => 2023,
"harga" => 85000,
"stok" => 15
],
[
"kode" => "BK-005",
"judul" => "Network Security Fundamentals",
"kategori" => "Networking",
"pengarang" => "Rina Wijaya",
"tahun" => 2023,
"harga" => 110000,
"stok" => 5
]
];
// Hitung statistik
$total_buku = count($buku_list);
$total_stok = 0;
$buku_tersedia = 0;
$buku_habis = 0;
foreach ($buku_list as $buku) {
$total_stok += $buku["stok"];
if ($buku["stok"] > 0) {
$buku_tersedia++;
} else {
$buku_habis++;
}
}
?>
<!-- Dashboard Statistik -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card border-primary">
<div class="card-body text-center">
<h3 class="text-primary"><?php echo $total_buku; ?></h3>
<p class="mb-0">Total Judul Buku</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card border-success">
<div class="card-body text-center">
<h3 class="text-success"><?php echo $buku_tersedia; ?></h3>
<p class="mb-0">Buku Tersedia</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card border-danger">
<div class="card-body text-center">
<h3 class="text-danger"><?php echo $buku_habis; ?></h3>
<p class="mb-0">Buku Habis</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card border-info">
<div class="card-body text-center">
<h3 class="text-info"><?php echo $total_stok; ?></h3>
<p class="mb-0">Total Eksemplar</p>
</div>
</div>
</div>
</div>
<!-- Filter Kategori -->
<div class="card mb-4">
<div class="card-header bg-secondary text-white">
<h5 class="mb-0">Filter Berdasarkan Kategori</h5>
</div>
<div class="card-body">
<div class="btn-group" role="group">
<button class="btn btn-outline-primary active">Semua</button>
<button class="btn btn-outline-primary">Programming</button>
<button class="btn btn-outline-success">Database</button>
<button class="btn btn-outline-info">Web Design</button>
<button class="btn btn-outline-warning">Networking</button>
</div>
<p class="text-muted mt-2 mb-0">
<small><em>Note: Filter akan diimplementasikan dengan JavaScript (tidak termasuk scope pertemuan ini)</em></small>
</p>
</div>
</div>
<!-- Daftar Buku -->
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="mb-0">Daftar Buku Perpustakaan</h5>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead class="table-light">
<tr>
<th width="50">No</th>
<th width="100">Kode</th>
<th>Judul Buku</th>
<th>Kategori</th>
<th>Pengarang</th>
<th width="80">Tahun</th>
<th width="120">Harga</th>
<th width="80">Stok</th>
<th width="150">Status</th>
<th width="100">Aksi</th>
</tr>
</thead>
<tbody>
<?php
$no = 1;
foreach ($buku_list as $buku) {
// Tentukan warna kategori dengan switch
switch ($buku["kategori"]) {
case "Programming":
$warna_kategori = "primary";
$icon_kategori = "code-slash";
break;
case "Database":
$warna_kategori = "success";
$icon_kategori = "database";
break;
case "Web Design":
$warna_kategori = "info";
$icon_kategori = "palette";
break;
case "Networking":
$warna_kategori = "warning";
$icon_kategori = "wifi";
break;
default:
$warna_kategori = "secondary";
$icon_kategori = "book";
}
// Tentukan status dengan if-elseif-else
if ($buku["stok"] == 0) {
$status = "Habis";
$warna_status = "danger";
$icon_status = "x-circle";
$dapat_pinjam = false;
} elseif ($buku["stok"] < 3) {
$status = "Stok Menipis";
$warna_status = "warning";
$icon_status = "exclamation-triangle";
$dapat_pinjam = true;
} elseif ($buku["stok"] < 10) {
$status = "Tersedia";
$warna_status = "info";
$icon_status = "info-circle";
$dapat_pinjam = true;
} else {
$status = "Stok Aman";
$warna_status = "success";
$icon_status = "check-circle";
$dapat_pinjam = true;
}
// Cek tahun untuk menandai buku baru
$tahun_sekarang = date("Y");
$is_buku_baru = ($buku["tahun"] >= ($tahun_sekarang - 1));
?>
<tr>
<td><?php echo $no++; ?></td>
<td><code><?php echo $buku["kode"]; ?></code></td>
<td>
<strong><?php echo $buku["judul"]; ?></strong>
<?php if ($is_buku_baru): ?>
<span class="badge bg-danger ms-1">NEW</span>
<?php endif; ?>
</td>
<td>
<span class="badge bg-<?php echo $warna_kategori; ?>">
<i class="bi bi-<?php echo $icon_kategori; ?>"></i>
<?php echo $buku["kategori"]; ?>
</span>
</td>
<td><?php echo $buku["pengarang"]; ?></td>
<td><?php echo $buku["tahun"]; ?></td>
<td>Rp <?php echo number_format($buku["harga"], 0, ',', '.'); ?></td>
<td class="text-center">
<strong><?php echo $buku["stok"]; ?></strong>
</td>
<td>
<span class="badge bg-<?php echo $warna_status; ?>">
<i class="bi bi-<?php echo $icon_status; ?>"></i>
<?php echo $status; ?>
</span>
</td>
<td>
<?php if ($dapat_pinjam): ?>
<button class="btn btn-sm btn-success">
<i class="bi bi-cart-plus"></i> Pinjam
</button>
<?php else: ?>
<button class="btn btn-sm btn-secondary" disabled>
<i class="bi bi-lock"></i> Habis
</button>
<?php endif; ?>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
</div>
<!-- Analisis Detail -->
<div class="row mt-4">
<div class="col-md-6">
<div class="card">
<div class="card-header bg-info text-white">
<h5 class="mb-0">Analisis Stok</h5>
</div>
<div class="card-body">
<?php
// Kategorikan buku berdasarkan stok
$stok_aman = 0;
$stok_menipis = 0;
$stok_habis = 0;
foreach ($buku_list as $buku) {
if ($buku["stok"] == 0) {
$stok_habis++;
} elseif ($buku["stok"] < 5) {
$stok_menipis++;
} else {
$stok_aman++;
}
}
$persentase_aman = ($stok_aman / $total_buku) * 100;
$persentase_menipis = ($stok_menipis / $total_buku) * 100;
$persentase_habis = ($stok_habis / $total_buku) * 100;
?>
<div class="mb-3">
<div class="d-flex justify-content-between mb-1">
<span>Stok Aman (âĨ5)</span>
<span><strong><?php echo $stok_aman; ?> judul</strong></span>
</div>
<div class="progress">
<div class="progress-bar bg-success" style="width: <?php echo $persentase_aman; ?>%">
<?php echo number_format($persentase_aman, 1); ?>%
</div>
</div>
</div>
<div class="mb-3">
<div class="d-flex justify-content-between mb-1">
<span>Stok Menipis (1-4)</span>
<span><strong><?php echo $stok_menipis; ?> judul</strong></span>
</div>
<div class="progress">
<div class="progress-bar bg-warning" style="width: <?php echo $persentase_menipis; ?>%">
<?php echo number_format($persentase_menipis, 1); ?>%
</div>
</div>
</div>
<div class="mb-0">
<div class="d-flex justify-content-between mb-1">
<span>Stok Habis (0)</span>
<span><strong><?php echo $stok_habis; ?> judul</strong></span>
</div>
<div class="progress">
<div class="progress-bar bg-danger" style="width: <?php echo $persentase_habis; ?>%">
<?php echo number_format($persentase_habis, 1); ?>%
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header bg-warning">
<h5 class="mb-0">Rekomendasi Restocking</h5>
</div>
<div class="card-body">
<p><strong>Buku yang perlu restocking:</strong></p>
<ul class="list-group">
<?php
$perlu_restock = false;
foreach ($buku_list as $buku) {
if ($buku["stok"] < 5) {
$perlu_restock = true;
$jumlah_order = 10 - $buku["stok"]; // Target stok 10
?>
<li class="list-group-item d-flex justify-content-between align-items-center">
<div>
<strong><?php echo $buku["judul"]; ?></strong><br />
<small class="text-muted">
Stok: <?php echo $buku["stok"]; ?> |
Kode: <?php echo $buku["kode"]; ?>
</small>
</div>
<span class="badge bg-warning rounded-pill">
Order: <?php echo $jumlah_order; ?> buku
</span>
</li>
<?php
}
}
if (!$perlu_restock) {
echo '<li class="list-group-item text-center text-success">';
echo '<i class="bi bi-check-circle"></i> Semua stok aman, tidak perlu restocking';
echo '</li>';
}
?>
</ul>
</div>
</div>
</div>
</div>
</div>
<footer class="bg-dark text-white text-center py-3 mt-5">
<p class="mb-0">© <?php echo date('Y'); ?> Sistem Perpustakaan</p>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Testing:
- Akses:
http://localhost/perpustakaan/sistem_ketersediaan.php - Perhatikan semua fitur yang terintegrasi
- Lihat bagaimana percabangan dan perulangan bekerja bersama
- Pahami logika analisis stok dan rekomendasi
E. TUGAS
Tugas 1: Sistem Status Peminjaman (40%)
Instruksi:
Buat file status_peminjaman.php yang menampilkan status peminjaman anggota perpustakaan.
Spesifikasi:
- Data Anggota:
$nama_anggota = "Budi Santoso";
$total_pinjaman = 2;
$buku_terlambat = 1;
$hari_keterlambatan = 5; // hari-
Aturan Business Logic:
- Member boleh pinjam maksimal 3 buku
- Denda keterlambatan: Rp 1.000/hari/buku
- Maksimal denda: Rp 50.000
- Jika ada buku terlambat, tidak bisa pinjam lagi
- Jika pinjaman sudah 3, tidak bisa pinjam lagi
-
Output yang Harus Ditampilkan:
- Informasi anggota
- Status peminjaman saat ini
- Menggunakan IF-ELSEIF-ELSE:
- Cek apakah bisa pinjam lagi
- Hitung total denda jika ada
- Tampilkan peringatan jika ada keterlambatan
- Menggunakan SWITCH:
- Tentukan level member (Bronze/Silver/Gold) berdasarkan total_pinjaman
- Bronze: 0-5 peminjaman
- Silver: 6-15 peminjaman
- Gold: >15 peminjaman
Tugas 2: Loop Daftar Transaksi (60%)
Instruksi:
Buat file daftar_transaksi.php yang menampilkan riwayat transaksi peminjaman.
Spesifikasi:
- Buat 10 transaksi dengan FOR loop:
for ($i = 1; $i <= 10; $i++) {
// Generate data transaksi
$id_transaksi = "TRX-" . str_pad($i, 4, "0", STR_PAD_LEFT);
$nama_peminjam = "Anggota " . $i;
$judul_buku = "Buku Teknologi Vol. " . $i;
$tanggal_pinjam = date('Y-m-d', strtotime("-$i days"));
$tanggal_kembali = date('Y-m-d', strtotime("+7 days", strtotime($tanggal_pinjam)));
$status = ($i % 3 == 0) ? "Dikembalikan" : "Dipinjam";
// TODO: Tampilkan dalam tabel
}-
Fitur yang Harus Ada:
- Nomor urut transaksi
- ID Transaksi (format: TRX-0001)
- Nama peminjam
- Judul buku
- Tanggal pinjam
- Tanggal harus kembali
- Status (badge berbeda untuk setiap status)
- Hitung jumlah hari sejak pinjam
- Skip transaksi genap dengan CONTINUE
- Stop di transaksi ke-8 dengan BREAK
-
Tambahan:
- Tampilkan statistik di atas tabel:
- Total transaksi yang ditampilkan
- Jumlah yang masih dipinjam
- Jumlah yang sudah dikembalikan
- Gunakan warna berbeda untuk status
- Tampilkan statistik di atas tabel:
Template Code:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Daftar Transaksi</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4">Daftar Transaksi Peminjaman</h1>
<?php
// TODO: Hitung statistik dengan loop
$total_transaksi = 0;
$total_dipinjam = 0;
$total_dikembalikan = 0;
// TODO: Loop pertama untuk hitung statistik
for ($i = 1; $i <= 10; $i++) {
// Hitung statistik
}
?>
<!-- TODO: Tampilkan statistik dalam cards -->
<!-- TODO: Tampilkan tabel transaksi -->
<table class="table">
<thead>
<tr>
<th>No</th>
<th>ID Transaksi</th>
<th>Peminjam</th>
<th>Buku</th>
<th>Tgl Pinjam</th>
<th>Tgl Kembali</th>
<th>Hari</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?php
// TODO: Loop untuk tampilkan data
// Gunakan continue untuk skip genap
// Gunakan break untuk stop di transaksi 8
?>
</tbody>
</table>
</div>
</body>
</html>Submission:
- Format: Link repository GitHub
- Deadline: Pertemuan 4
- Upload ke: Ngaji UIN Gusdur (submit link repository GitHub)
F. EVALUASI
1. Kuis Singkat (Dikerjakan di Kelas)
Soal Pilihan Ganda:
-
Struktur percabangan yang paling tepat untuk mengecek satu variabel dengan banyak nilai adalah:
- A. IF
- B. WHILE
- C. SWITCH
- D. FOR
-
Operator logika AND dalam PHP adalah:
- A. &
- B. &&
- C. ||
- D. !
-
Loop yang paling tepat digunakan ketika sudah tahu berapa kali akan mengulang:
- A. WHILE
- B. DO-WHILE
- C. FOR
- D. FOREACH
-
Untuk menghentikan loop sepenuhnya digunakan:
- A. CONTINUE
- B. BREAK
- C. EXIT
- D. STOP
-
Perbedaan WHILE dan DO-WHILE adalah:
- A. Tidak ada perbedaan
- B. DO-WHILE minimal 1x eksekusi
- C. WHILE lebih cepat
- D. DO-WHILE tidak ada kondisi
-
Hasil dari
5 % 2adalah:- A. 0
- B. 1
- C. 2
- D. 2.5
-
Untuk skip iterasi saat ini dan lanjut ke berikutnya digunakan:
- A. BREAK
- B. CONTINUE
- C. EXIT
- D. NEXT
-
Ternary operator adalah shorthand dari:
- A. FOR
- B. WHILE
- C. IF-ELSE
- D. SWITCH
-
Operator NOT dalam PHP adalah:
- A. ~
- B. !
- C. ^
- D. -
-
Kondisi
($a > 5 && $b < 10)akan true jika:- A. Salah satu kondisi true
- B. Kedua kondisi true
- C. Kedua kondisi false
- D. Salah satu kondisi false
Soal Essay:
-
Jelaskan perbedaan IF-ELSEIF-ELSE dan SWITCH! Kapan sebaiknya menggunakan masing-masing? (Skor: 10)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Buatlah code PHP untuk mengecek ketersediaan buku dengan ketentuan:
-
Jika stok > 10: "Stok Aman"
-
Jika stok 5-10: "Stok Sedang"
-
Jika stok 1-4: "Stok Menipis"
-
Jika stok 0: "Habis" (Skor: 15)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
-
Buatlah FOR loop untuk menampilkan kode buku dari BK-0001 sampai BK-0010! (Skor: 15)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Jelaskan perbedaan BREAK dan CONTINUE dalam loop! Berikan contoh penggunaan masing-masing! (Skor: 15)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Apa yang dimaksud dengan nested loop? Berikan contoh kasus penggunaan dalam sistem perpustakaan! (Skor: 10)
Jawaban tersedia di dokumen kunci jawaban dosen.
2. Latihan Debugging
Temukan dan perbaiki error dalam code berikut:
<?php
// Code 1: Error
$stok = 5
if ($stok > 0)
echo "Tersedia"
else
echo "Habis"
?>Jawaban tersedia di dokumen kunci jawaban dosen.
3. Checklist Kompetensi
Self-Assessment:
| No | Kompetensi | Belum | Cukup | Mahir |
|---|---|---|---|---|
| 1 | Menggunakan IF-ELSE | â | â | â |
| 2 | Menggunakan IF-ELSEIF-ELSE | â | â | â |
| 3 | Menggunakan SWITCH | â | â | â |
| 4 | Menggunakan logical operators | â | â | â |
| 5 | Membuat nested conditions | â | â | â |
| 6 | Menggunakan FOR loop | â | â | â |
| 7 | Menggunakan WHILE loop | â | â | â |
| 8 | Menggunakan BREAK dan CONTINUE | â | â | â |
| 9 | Membuat nested loop | â | â | â |
| 10 | Menerapkan kontrol alur dalam kasus nyata | â | â | â |
Target: Minimal "Cukup" untuk semua poin sebelum lanjut ke pertemuan 4.
G. REFERENSI
1. Dokumentasi Resmi
- PHP Control Structures: https://www.php.net/manual/en/language.control-structures.php (opens in a new tab)
- PHP If Statement: https://www.php.net/manual/en/control (opens in a new tab)