Semester 3 · 4 SKS · 200 menit

Input, Process, Output

Data dari form sudah sampai ke PHP. Sekarang kita tentukan langkah yang harus dikerjakan server: urutkan prosesnya, buat keputusan dengan kondisi, ulangi pekerjaan dengan perulangan, lalu tampilkan hasilnya.

Konsep → Kasus NyataPrediksi → CodingJalankan → Analisis

Target Pertemuan

Di akhir kelas, Anda mampu mengubah kebutuhan sederhana menjadi langkah program PHP yang dapat dijalankan di XAMPP.

Input → Process → Output
Menentukan data masuk, pengolahan, dan hasil yang harus terlihat.
Sequence & Condition
Menyusun urutan instruksi dan memilih tindakan berdasarkan kondisi.
Repetition
Mengulang proses untuk beberapa data tanpa menyalin baris kode berkali-kali.
Aturan kelas tetap sama: AI boleh membantu membuat contoh, mencari dokumentasi, debugging, dan merapikan kode. Anda tetap harus mampu menjelaskan alur, data, kondisi, hasil, dan alasan keputusan program.

Kode boleh di-copy–paste. Yang tidak boleh di-copy–paste adalah pemahaman.

Pertanyaan Pembuka

Kasir memasukkan 2 barang dengan harga Rp60.000 per barang. Jika total belanja minimal Rp100.000 mendapat diskon 10%, berapa yang dibayar pelanggan? Tuliskan langkahnya dahulu—belum perlu membuka editor.

1. Dari Pertemuan 2 ke Pertemuan 3

Pada pertemuan sebelumnya, kita mengirim form menggunakan POST. PHP menerima request itu; sekarang kita bahas logika yang berjalan setelahnya.

User mengisi form
→
HTTP POST
→
PHP memproses
→
HTML hasil
Ingat: data dari browser harus dianggap belum tepercaya. Validasi lagi di PHP; atribut HTML seperti required dan min membantu pengguna, tetapi bukan pengganti validasi server.

2. Input, Process, Output (IPO)

Hampir semua fitur dapat dipahami dengan tiga pertanyaan: data apa yang diterima, aturan apa yang dijalankan, dan hasil apa yang dikembalikan?

Input

Data yang diterima program. Contoh kasir: nama barang, jumlah, dan harga satuan.

Process

Langkah atau aturan bisnis. Contoh: hitung subtotal, cek syarat diskon, hitung total.

Output

Hasil yang disampaikan kepada pengguna. Contoh: rincian barang, diskon, dan total bayar.

Input
nama, jumlah, harga
→
Process
hitung + aturan
→
Output
total belanja

Latihan lisan: Pada fitur login, apa input-nya? Apa yang harus diproses server? Seperti apa output jika password benar dan jika salah?

3. Sequence — Instruksi Dieksekusi Berurutan

Sequence berarti urutan instruksi. Urutan yang keliru dapat menghasilkan angka atau keputusan yang salah, meskipun setiap baris tampak benar.

Algoritma (bahasa manusia)

  1. Baca jumlah barang dan harga satuan.
  2. Hitung subtotal = jumlah × harga.
  3. Jika subtotal mencapai Rp100.000, hitung diskon 10%.
  4. Kurangi subtotal dengan diskon.
  5. Tampilkan subtotal, diskon, dan total.

Versi langkah PHP

Urutan instruksi
<?php
$jumlah = 2;
$harga = 60000;
$subtotal = $jumlah * $harga;
$diskon = 0;
$totalBayar = $subtotal - $diskon;
echo $totalBayar;
?>

Contoh ini belum menerapkan syarat diskon. Kita tambahkan kondisi pada bagian berikutnya.

Prediksi: Jika baris $subtotal = $jumlah * $harga; dipindahkan setelah perhitungan $totalBayar, apa yang berubah? Jalankan atau hitung manual untuk membuktikan.

4. Variabel, Tipe Data, dan Operator

Variabel menyimpan nilai yang dipakai dalam proses. Dalam PHP, nama variabel diawali tanda $.

Variabel & tipe data

  • $nama = 'Buku'; — teks / string
  • $jumlah = 2; — bilangan bulat / integer
  • $harga = 60000; — bilangan bulat rupiah
  • $tersedia = true; — benar atau salah / boolean

Operator yang dipakai hari ini

OperatorArtiContoh
+, -, *Tambah, kurang, kali$jumlah * $harga
>=, <Bandingkan nilai$subtotal >= 100000
===Sama nilai dan tipe$metode === 'POST'
&&Kedua syarat harus benar$nama !== '' && $jumlah > 0
Tips rupiah: untuk contoh dasar ini, simpan harga sebagai angka bulat tanpa titik atau simbol (misalnya 60000). Format menjadi Rp 60.000 hanya saat menampilkan output.

5. Condition — Program Membuat Keputusan

Condition menggunakan if, elseif, dan else. Kondisi harus menghasilkan benar (true) atau salah (false).

Subtotal
→
≥ Rp100.000?
→
Ya: diskon 10%
/
Tidak: diskon Rp0
if / else — aturan diskon
<?php
$subtotal = 120000;

if ($subtotal >= 100000) {
    $diskon = intdiv($subtotal, 10); // 10 persen, dibulatkan ke bawah ke rupiah utuh
} else {
    $diskon = 0;
}

$totalBayar = $subtotal - $diskon;
echo 'Total bayar: Rp ' . number_format($totalBayar, 0, ',', '.');
?>

Untuk subtotal Rp120.000, syarat bernilai benar, diskon Rp12.000, dan total bayar Rp108.000. Ubah subtotal menjadi 90000; cabang else yang dijalankan.

Kesalahan umum: = mengisi nilai, sedangkan === membandingkan. Untuk aturan “minimal 100.000”, gunakan >= 100000, bukan > 100000—karena nilai tepat 100.000 juga memenuhi syarat.

6. Repetition — Mengulang Proses

Repetition (perulangan) berguna saat langkah yang sama harus dilakukan pada beberapa data.

for — jumlah pengulangan diketahui

Contoh: ulangi tepat 3 kali untuk menampilkan tiga baris.

for.php
<?php
for ($i = 1; $i <= 3; $i++) {
    echo "<p>Baris ke-$i</p>";
}
?>

$i++ menambah nilai penghitung satu pada setiap putaran.

foreach — telusuri setiap item

Contoh: tambahkan harga setiap produk ke subtotal.

foreach.php
<?php
$daftarHarga = [12000, 25000, 50000];
$subtotal = 0;

foreach ($daftarHarga as $harga) {
    $subtotal += $harga;
}

echo $subtotal; // 87000
?>

Dalam praktik kasir, foreach akan menghitung setiap produk yang dikirim dari form.

Cek pemahaman: Jika daftar harga berisi 3 angka, berapa putaran loop-nya? Bagian kode mana yang mengubah subtotal?

7. Praktik Utama — Kalkulator Total Belanja

Kita gabungkan form POST, input, validasi, sequence, condition, repetition, dan output. Contoh menerima sampai 3 barang, memberi diskon 10% jika subtotal minimal Rp100.000, lalu menampilkan rincian.

Flowchart — Alur Kalkulator Belanja

Ikuti alur dari atas ke bawah. Baris kosong dilewati; baris yang tidak valid dicatat sebagai error. Proses dilanjutkan sampai tiga baris diperiksa, lalu diskon hanya dihitung jika input valid dan subtotal mencapai Rp100.000. Pada layar kecil, geser diagram ke samping bila perlu.

Flowchart kalkulator total belanja PHP Form POST diterima, variabel diinisialisasi, lalu baris diperiksa berurutan hingga maksimal tiga baris. Baris kosong dilewati. Baris terisi divalidasi; data valid dihitung dan ditambahkan ke subtotal, sedangkan data tidak valid menghasilkan error. Setelah semua baris diperiksa, jika ada produk dan tidak ada error, subtotal diperiksa untuk diskon 10 persen mulai Rp100.000, total dihitung, dan rincian ditampilkan. Jika tidak, pesan validasi ditampilkan. Alur penghitungan berakhir. MULAI Form dikirim ke servermelalui HTTP POST Inisialisasi datasubtotal = 0 · diskon = 0 · daftar produk = [] Baca data padabaris berikutnya Baris inisemua kosong? Ya Tidak Lewati baris initanpa diproses Nama terisi?Jumlah ≥ 1, hargabilangan bulat ≥ 0? Ya Tidak Hitung total itemsimpan & tambah subtotal Catat pesanvalidasi Masih ada barisberikutnya? Ya — ulangi Tidak Ada produk dantidak ada error? Tidak Ya Tampilkan pesanvalidasi Subtotal≥ Rp100.000? Ya Tidak Terapkan diskonsebesar 10% Diskon = 0 Hitung total bayarsubtotal − diskon Tampilkan rinciandan total bayar SELESAI

Cabang Ya/Tidak menunjukkan hasil kondisi. Jika ada satu baris tidak valid, program menampilkan pesan dan tidak menampilkan total seolah-olah transaksi berhasil.

Siapkan di XAMPP

  1. Buka XAMPP Control Panel dan klik Start pada Apache. MySQL tidak perlu dinyalakan karena latihan ini belum memakai database.
  2. Buat folder C:\xampp\htdocs\web-lanjut\pertemuan-3\. Jika lokasi XAMPP Anda berbeda, buat folder web-lanjut\pertemuan-3 di dalam folder htdocs.
  3. Buat file index.php di folder tersebut, lalu salin seluruh kode di bawah ini.
  4. Buka http://localhost/web-lanjut/pertemuan-3/ melalui browser. Jangan membuka file dengan double-click; PHP perlu diproses oleh Apache.
Nama file harus index.php, bukan index.html atau index.php.txt. Simpan sebagai UTF-8 jika editor menanyakan encoding.
index.php — salin semua baris berikut
<?php
function e($nilai): string
{
    return htmlspecialchars((string) $nilai, ENT_QUOTES, 'UTF-8');
}

function rupiah(int $angka): string
{
    return 'Rp ' . number_format($angka, 0, ',', '.');
}

$namaInput = $_POST['nama'] ?? [];
$jumlahInput = $_POST['jumlah'] ?? [];
$hargaInput = $_POST['harga'] ?? [];

// Pastikan nilai dari form berbentuk array sebelum diproses.
if (!is_array($namaInput)) {
    $namaInput = [];
}
if (!is_array($jumlahInput)) {
    $jumlahInput = [];
}
if (!is_array($hargaInput)) {
    $hargaInput = [];
}

// Form latihan dibatasi tiga barang dan nilainya tetap terisi setelah submit.
$jumlahBaris = 3;
$produkForm = [];

for ($i = 0; $i < $jumlahBaris; $i++) {
    $nama = $namaInput[$i] ?? '';
    $jumlah = $jumlahInput[$i] ?? '';
    $harga = $hargaInput[$i] ?? '';

    $produkForm[] = [
        'nama' => is_scalar($nama) ? trim((string) $nama) : '',
        'jumlah' => is_scalar($jumlah) ? trim((string) $jumlah) : '',
        'harga' => is_scalar($harga) ? trim((string) $harga) : '',
    ];
}

$terkirim = $_SERVER['REQUEST_METHOD'] === 'POST';
$error = [];
$daftarProduk = [];
$subtotal = 0;
$diskon = 0;
$totalBayar = 0;

if ($terkirim) {
    
    foreach ($produkForm as $index => $produk) {
        // Abaikan baris yang memang dibiarkan kosong.
        if ($produk['nama'] === '' && $produk['jumlah'] === '' && $produk['harga'] === '') {
            continue;
        }

        $jumlah = filter_var($produk['jumlah'], FILTER_VALIDATE_INT);
        $harga = filter_var($produk['harga'], FILTER_VALIDATE_INT);

        // Validasi server tetap diperlukan meskipun form memakai type="number".
        if ($produk['nama'] === '' || $jumlah === false || $jumlah < 1 || $harga === false || $harga < 0) {
            $error[] = 'Baris ' . ($index + 1) . ': isi nama, jumlah minimal 1, dan harga 0 atau lebih (angka bulat).';
            continue;
        }

        $totalItem = $jumlah * $harga;
        $daftarProduk[] = [
            'nama' => $produk['nama'],
            'jumlah' => $jumlah,
            'harga' => $harga,
            'total' => $totalItem,
        ];
        $subtotal += $totalItem;
    }

    if (empty($daftarProduk) && empty($error)) {
        $error[] = 'Isi setidaknya satu produk sebelum menghitung.';
    }

    
    if (empty($error)) {
        if ($subtotal >= 100000) {
            $diskon = intdiv($subtotal, 10); // Diskon 10%, rupiah dibulatkan ke bawah.
        }
        $totalBayar = $subtotal - $diskon;
    }
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kalkulator Belanja</title>
    <style>
        * { box-sizing: border-box; }
        body { margin: 0; padding: 24px; background: #f4f6fb; color: #172033; font: 16px/1.6 Arial, sans-serif; }
        main { max-width: 850px; margin: 0 auto; padding: 24px; background: #fff; border: 1px solid #e5e9f2; border-radius: 16px; }
        h1, h2 { line-height: 1.25; }
        .baris { display: grid; grid-template-columns: 2fr 1fr 1.4fr; gap: 12px; padding: 14px 0; border-bottom: 1px solid #e5e9f2; }
        label { display: block; font-weight: 700; }
        input { display: block; width: 100%; margin-top: 5px; padding: 10px; border: 1px solid #cfd5e2; border-radius: 8px; font: inherit; }
        button { margin-top: 18px; padding: 11px 18px; border: 0; border-radius: 9px; background: #405cf5; color: white; font: inherit; font-weight: 700; cursor: pointer; }
        table { width: 100%; border-collapse: collapse; margin-top: 12px; }
        th, td { padding: 10px; border-bottom: 1px solid #e5e9f2; text-align: left; }
        th { background: #f8f9fc; }
        .angka { text-align: right; white-space: nowrap; }
        .alert { padding: 12px 16px; border-left: 4px solid #b42318; border-radius: 6px; background: #fef3f2; color: #7a271a; }
        .ringkasan { max-width: 370px; margin: 16px 0 0 auto; }
        .ringkasan p { display: flex; justify-content: space-between; gap: 16px; margin: 7px 0; }
        .total { padding-top: 10px; border-top: 2px solid #172033; font-size: 1.15rem; font-weight: 800; }
        .catatan { color: #667085; font-size: .92rem; }
        @media (max-width: 600px) { body { padding: 12px; } main { padding: 16px; } .baris { grid-template-columns: 1fr; gap: 8px; } table { display: block; overflow-x: auto; } }
    </style>
</head>
<body>
<main>
    <h1>Kalkulator Total Belanja</h1>
    <p>Masukkan maksimal tiga produk. Diskon 10% berlaku jika subtotal minimal Rp100.000.</p>

    <form method="POST" action="">
        <?php foreach ($produkForm as $index => $produk): ?>
            <div class="baris">
                <label>
                    Nama produk
                    
                    <input type="text" name="nama[]" maxlength="80" placeholder="Contoh: Buku" value="<?= e($produk['nama']) ?>">
                </label>
                <label>
                    Jumlah
                    <input type="number" name="jumlah[]" min="1" step="1" inputmode="numeric" placeholder="1" value="<?= e($produk['jumlah']) ?>">
                </label>
                <label>
                    Harga satuan (Rp)
                    <input type="number" name="harga[]" min="0" step="1" inputmode="numeric" placeholder="25000" value="<?= e($produk['harga']) ?>">
                </label>
            </div>
        <?php endforeach; ?>
        
        <button type="submit">Hitung Total</button>
    </form>

    <?php if ($terkirim): ?>
        <section aria-live="polite">
            
            <?php if (!empty($error)): ?>
                
                <div class="alert">
                    <strong>Periksa kembali input:</strong>
                    <ul>
                        <?php foreach ($error as $pesan): ?>
                            <li><?= e($pesan) ?></li>
                        <?php endforeach; ?>
                    </ul>
                </div>
            <?php else: ?>
                <h2>Rincian Belanja</h2>
                
                <table>
                    <thead>
                        <tr><th>Produk</th><th class="angka">Jumlah</th><th class="angka">Harga</th><th class="angka">Total</th></tr>
                    </thead>
                    <tbody>
                        <?php foreach ($daftarProduk as $produk): ?>
                            <tr>
                                <td><?= e($produk['nama']) ?></td>
                                <td class="angka"><?= e($produk['jumlah']) ?></td>
                                <td class="angka"><?= e(rupiah($produk['harga'])) ?></td>
                                <td class="angka"><?= e(rupiah($produk['total'])) ?></td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
                
                <div class="ringkasan">
                    <p><span>Subtotal</span><strong><?= e(rupiah($subtotal)) ?></strong></p>
                    <p><span>Diskon</span><strong><?= e(rupiah($diskon)) ?></strong></p>
                    <p class="total"><span>Total bayar</span><span><?= e(rupiah($totalBayar)) ?></span></p>
                </div>
            <?php endif; ?>
        </section>
    <?php endif; ?>
    <p class="catatan">Latihan ini hanya menghitung di server, belum menyimpan transaksi ke database.</p>
</main>
</body>
</html>

Alur program pada kode

Input
Array $_POST['nama'], $_POST['jumlah'], $_POST['harga'].
Process
foreach tiap baris, validasi angka, hitung subtotal, lalu if untuk diskon.
Output
Tampilkan error yang ramah atau tabel rincian dan total bayar.

8. Jalankan, Uji, dan Amati

Uji beberapa keadaan, bukan hanya satu contoh. Catat hasil yang Anda prediksi sebelum klik tombol.

Kasus ujiInput contohHasil yang seharusnya
Di bawah batas diskon1 barang, jumlah 2, harga 25.000Subtotal Rp50.000, diskon Rp0, total Rp50.000.
Tepat pada batas1 barang, jumlah 2, harga 50.000Subtotal Rp100.000, diskon Rp10.000, total Rp90.000.
Beberapa barangBuku 2 × 60.000 dan Pulpen 1 × 5.000Loop menghitung dua baris, subtotal Rp125.000, total Rp112.500.
Input tidak lengkapNama diisi, jumlah atau harga dikosongkanServer menampilkan pesan validasi, bukan menghitung diam-diam.
Baris kosongSatu produk diisi, baris lain dibiarkan kosongBaris kosong dilewati oleh program.

Periksa request di browser

  1. Tekan F12, pilih tab Network, lalu kirim form.
  2. Pilih request ke halaman yang sama dan periksa Request Method: POST.
  3. Lihat parameter form, status response, dan hasil HTML yang dikembalikan server.
  4. Ingat: kode PHP diproses di server; browser menerima HTML hasilnya, bukan kode PHP mentah.
Jika halaman kosong / error: pastikan Apache berjalan, URL memakai localhost, ekstensi file .php, dan foldernya berada di htdocs. Periksa ejaan nama variabel dan tanda kurung. Jangan mengunggah password atau data pribadi ke contoh latihan.

9. Mini Challenge

Ubah program kasir dan jelaskan keputusan yang Anda ambil:

  1. Ubah batas diskon menjadi Rp150.000. Baris kondisi mana yang harus disesuaikan?
  2. Buat diskon 5% untuk subtotal Rp50.000 sampai kurang dari Rp150.000, dan 10% untuk subtotal minimal Rp150.000. Gunakan if / elseif / else.
  3. Tambahkan kolom kategori produk. Menurut Anda, apakah perlu validasi kategori di server? Mengapa?
  4. Temukan satu input yang sengaja salah dan amati bagaimana program menanganinya.
Challenge menjelaskan kode: tunjukkan satu putaran foreach, jelaskan nilai yang masuk ke $subtotal, lalu sebutkan kondisi yang membuat diskon diberikan.

10. Hubungkan dengan Project Semester

Ambil satu aktivitas utama dari sistem yang Anda pilih pada pertemuan pertama. Rancang dulu input, aturan proses, dan output—baru pikirkan tampilan.

Laundry
Input: berat, jenis layanan. Process: harga/kg dan estimasi selesai. Output: ringkasan biaya.
Booking lapangan
Input: tanggal, jam, lapangan. Process: periksa ketersediaan. Output: tersedia atau sudah dipesan.
Perpustakaan
Input: tanggal pinjam dan kembali. Process: hitung lama pinjam/denda. Output: tanggal atau total denda.

Jangan langsung menyalin contoh kasir ke semua project. Ganti data dan aturan dengan kebutuhan sistem pilihan Anda. Tulis kondisi bisnisnya dengan jelas; misalnya “jika jadwal sudah terisi, pemesanan ditolak”.

11. Tugas Project Book — Minggu 3

  1. Tetap gunakan sistem yang dipilih untuk project semester.
  2. Pilih satu fitur dan buat tabel IPO: data input, aturan proses, serta output yang diharapkan.
  3. Tulis urutan algoritma dalam bahasa sendiri, termasuk minimal satu kondisi dan satu proses yang berulang jika memang dibutuhkan.
  4. Buat satu contoh PHP yang menjalankan alur tersebut di XAMPP. Kode boleh dibantu AI, tetapi Anda harus dapat menjelaskan tiap bagian yang dipakai.
  5. Uji minimal dua skenario: satu kondisi terpenuhi dan satu kondisi tidak terpenuhi. Catat input dan hasilnya.
  6. Tulis analisis tangan di Project Book, lalu foto/scan dengan jelas dan unggah ke Google Drive sesuai arahan dosen. Simpan buku dan file kode untuk pertemuan selanjutnya.
Format analisis Project Book:
Nama fitur → Input → Langkah Process → Condition → Repetition (jika ada) → Output → Dua hasil uji → Penjelasan dengan bahasa sendiri.

12. Quis Pertemuan 3

Jawab dengan bahasa sendiri. Yang dinilai adalah pemahaman, bukan hafalan istilah.

  1. Jelaskan Input, Process, dan Output dengan contoh dari project pilihan Anda.
  2. Apa yang dimaksud sequence? Mengapa urutan menghitung subtotal dan diskon perlu diperhatikan?
  3. Apa perbedaan operator = dan === di PHP?
  4. Jika subtotal tepat Rp100.000 dan syaratnya $subtotal >= 100000, apakah diskon diberikan? Jelaskan.
  5. Untuk apa foreach digunakan pada contoh kasir?
  6. Mengapa validasi perlu dilakukan di PHP walaupun input HTML sudah memakai type="number"?
  7. Jelaskan alur satu request POST sejak form dikirim sampai output tampil di browser.

Quis/aktivitas mengikuti aturan kelas dan arahan dosen. Pastikan jawaban serta kode yang dikumpulkan dapat Anda jelaskan.

13. Ringkasan

Input
data dari form
→
Sequence
urutkan langkah
→
Condition
pilih aturan
→
Repetition
olah banyak data
→
Output
hasil untuk user

Request membawa data. Logika PHP menentukan proses. Response mengirim hasilnya kembali.

Pertemuan berikutnya dapat membangun project lebih jauh dari alur yang sudah Anda rancang. Pastikan Anda menyimpan Project Book, kode, dan hasil pengujian.

Glosarium

Istilah bergaris putus-putus dapat diarahkan kursor atau difokuskan untuk melihat arti singkat.

InputData yang diterima program dari pengguna atau sumber lain.
ProcessLangkah, perhitungan, atau aturan yang dijalankan program.
OutputHasil yang dihasilkan dan dikirimkan kembali kepada pengguna.
SequenceUrutan instruksi yang dieksekusi satu demi satu.
ConditionSyarat benar/salah yang menentukan cabang program.
Repetition / LoopPerulangan untuk menjalankan instruksi pada beberapa langkah atau data.
VariableNama untuk menyimpan nilai yang digunakan selama program berjalan.
ArrayKumpulan nilai yang dapat ditelusuri, misalnya daftar barang dari form.
ValidasiPemeriksaan apakah data sesuai aturan sebelum diproses.
RequestPermintaan yang dikirim client ke server, misalnya saat form dikirim dengan POST.
ResponseJawaban server setelah request diproses, biasanya berisi HTML yang ditampilkan browser.
XAMPPPaket server lokal yang menyediakan Apache dan PHP untuk latihan di komputer.