đŸ’ģ Pemrograman Web 2
🎓 Pertemuan
Pertemuan 3: Kontrol Alur Program

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

AspekKeterangan
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-CPMKSub-CPMK04.1.2: Menjelaskan dan menggunakan sintaks dasar PHP untuk menghasilkan output dinamis (lanjutan - kontrol alur)
Indikator PencapaianMahasiswa 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

  1. Mampu membuat program yang dapat mengambil keputusan
  2. Dapat mengotomasi proses berulang
  3. Memahami logika bisnis dalam sistem perpustakaan
  4. 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:

OperatorNamaContohKeterangan
&& atau andAND$a && $bTrue jika kedua kondisi true
|| atau orOR$a || $bTrue jika salah satu true
!NOT!$aMembalik nilai boolean
xorXOR$a xor $bTrue 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):

  1. ! (NOT)
  2. && (AND)
  3. || (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

  1. Mengimplementasikan percabangan untuk cek ketersediaan buku
  2. Menggunakan switch untuk kategori buku
  3. Menerapkan perulangan untuk menampilkan multiple buku
  4. Membuat validasi input sederhana
  5. 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:

  1. Akses: http://localhost/perpustakaan/cek_ketersediaan.php
  2. Perhatikan perbedaan status untuk setiap stok
  3. 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:

  1. Akses: http://localhost/perpustakaan/kategori_buku.php
  2. Perhatikan warna dan icon yang berbeda untuk setiap kategori
  3. 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:

  1. Akses: http://localhost/perpustakaan/daftar_buku.php
  2. Perhatikan perbedaan setiap metode loop
  3. Refresh halaman untuk melihat data random berubah
  4. 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:

  1. Akses: http://localhost/perpustakaan/validasi_buku.php
  2. Perhatikan error yang muncul
  3. Coba ubah nilai variabel menjadi valid
  4. 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">&copy; <?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:

  1. Akses: http://localhost/perpustakaan/sistem_ketersediaan.php
  2. Perhatikan semua fitur yang terintegrasi
  3. Lihat bagaimana percabangan dan perulangan bekerja bersama
  4. 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:

  1. Data Anggota:
$nama_anggota = "Budi Santoso";
$total_pinjaman = 2;
$buku_terlambat = 1;
$hari_keterlambatan = 5; // hari
  1. 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
  2. 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:

  1. 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
}
  1. 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
  2. Tambahan:

    • Tampilkan statistik di atas tabel:
      • Total transaksi yang ditampilkan
      • Jumlah yang masih dipinjam
      • Jumlah yang sudah dikembalikan
    • Gunakan warna berbeda untuk status

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:

  1. Struktur percabangan yang paling tepat untuk mengecek satu variabel dengan banyak nilai adalah:

    • A. IF
    • B. WHILE
    • C. SWITCH
    • D. FOR
  2. Operator logika AND dalam PHP adalah:

    • A. &
    • B. &&
    • C. ||
    • D. !
  3. Loop yang paling tepat digunakan ketika sudah tahu berapa kali akan mengulang:

    • A. WHILE
    • B. DO-WHILE
    • C. FOR
    • D. FOREACH
  4. Untuk menghentikan loop sepenuhnya digunakan:

    • A. CONTINUE
    • B. BREAK
    • C. EXIT
    • D. STOP
  5. 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
  6. Hasil dari 5 % 2 adalah:

    • A. 0
    • B. 1
    • C. 2
    • D. 2.5
  7. Untuk skip iterasi saat ini dan lanjut ke berikutnya digunakan:

    • A. BREAK
    • B. CONTINUE
    • C. EXIT
    • D. NEXT
  8. Ternary operator adalah shorthand dari:

    • A. FOR
    • B. WHILE
    • C. IF-ELSE
    • D. SWITCH
  9. Operator NOT dalam PHP adalah:

    • A. ~
    • B. !
    • C. ^
    • D. -
  10. 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:

  1. Jelaskan perbedaan IF-ELSEIF-ELSE dan SWITCH! Kapan sebaiknya menggunakan masing-masing? (Skor: 10)

    Jawaban tersedia di dokumen kunci jawaban dosen.

  2. 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.

  3. Buatlah FOR loop untuk menampilkan kode buku dari BK-0001 sampai BK-0010! (Skor: 15)

    Jawaban tersedia di dokumen kunci jawaban dosen.

  4. Jelaskan perbedaan BREAK dan CONTINUE dalam loop! Berikan contoh penggunaan masing-masing! (Skor: 15)

    Jawaban tersedia di dokumen kunci jawaban dosen.

  5. 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:

NoKompetensiBelumCukupMahir
1Menggunakan IF-ELSE○○○
2Menggunakan IF-ELSEIF-ELSE○○○
3Menggunakan SWITCH○○○
4Menggunakan logical operators○○○
5Membuat nested conditions○○○
6Menggunakan FOR loop○○○
7Menggunakan WHILE loop○○○
8Menggunakan BREAK dan CONTINUE○○○
9Membuat nested loop○○○
10Menerapkan kontrol alur dalam kasus nyata○○○

Target: Minimal "Cukup" untuk semua poin sebelum lanjut ke pertemuan 4.


G. REFERENSI

1. Dokumentasi Resmi