Lompat ke konten utama

Kompetisi Ajak Teman: hadiah total Rp1.000.000 tunai untuk 3 pengajak terbanyak. Berakhir 29 November 2026. Ikut kompetisi

←

PHP Dasar

Pelajaran 15 dari 15

PHP di web: formulir, basis data, dan galat

Misi: formulir pesanan katering

Setelah pelajaran ini kamu bisa menelusuri program web 35 baris yang membaca $_POST, melempar exception, menyimpan lewat prepared statement, dan mencetak dengan htmlspecialchars.

±17 menitDiperiksa 5 Okt 2026

Materi

Dapur Bu Ratna di Semarang menerima pesanan katering lewat formulir. Program di bawah membaca nama dan jumlah porsi dari $_POST, menolak pesanan di bawah 10 porsi, memberi harga Rp23.000 per porsi untuk 50 porsi ke atas dan Rp25.000 untuk sisanya, menyimpan pesanan ke basis data dengan prepared statement, lalu menghitung jumlah pesanan tersimpan. Basis datanya SQLite di memori, jadi setiap permintaan mulai dari tabel kosong.

Setiap soal menyebut isian formulir yang dikirim. Telusuri dari baris $_POST: apa hasil cast (int), apakah hitungTotal melempar exception, dan bila ya, baris mana yang dilewati. Ingat bahwa htmlspecialchars hanya mengubah teks yang DICETAK, bukan isi variabelnya. Isi basis data tetap asli; pengamanan untuk HTML dilakukan di setiap tempat data itu dicetak.

<?php
// pesan.php — formulir pesanan katering Dapur Bu Ratna, Semarang
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE pesanan (nama TEXT, porsi INTEGER, total INTEGER)");

function hitungTotal(int $porsi): int {
    if ($porsi < 10) {
        throw new InvalidArgumentException("Minimal pesan 10 porsi");
    }
    $harga = match (true) {
        $porsi >= 50 => 23000,
        default => 25000,
    };
    return $porsi * $harga;
}

$nama = $_POST["nama"] ?? "";
$porsi = (int) ($_POST["porsi"] ?? 0);

try {
    $total = hitungTotal($porsi);
    $s = $db->prepare("INSERT INTO pesanan VALUES (?, ?, ?)");
    $s->execute([$nama, $porsi, $total]);
    echo "<p>Pesanan " . htmlspecialchars($nama) . " tersimpan.</p>\n";
    echo "<p>Total: Rp" . number_format($total, 0, ',', '.') . "</p>\n";
} catch (InvalidArgumentException $e) {
    echo "<p>Ditolak: " . $e->getMessage() . "</p>\n";
}

$jumlah = $db->query("SELECT COUNT(*) FROM pesanan")->fetchColumn();
echo "<p>Pesanan tersimpan: $jumlah</p>\n";

Latihan

0/4 lulus

Misi akhir modul: luluskan minimal 4 dari 4 tugas. Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 1 dari 4

Formulir mengirim nama = `Sri` dan porsi = `60`. Apa baris kedua keluaran?

<?php
// pesan.php — formulir pesanan katering Dapur Bu Ratna, Semarang
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE pesanan (nama TEXT, porsi INTEGER, total INTEGER)");

function hitungTotal(int $porsi): int {
    if ($porsi < 10) {
        throw new InvalidArgumentException("Minimal pesan 10 porsi");
    }
    $harga = match (true) {
        $porsi >= 50 => 23000,
        default => 25000,
    };
    return $porsi * $harga;
}

$nama = $_POST["nama"] ?? "";
$porsi = (int) ($_POST["porsi"] ?? 0);

try {
    $total = hitungTotal($porsi);
    $s = $db->prepare("INSERT INTO pesanan VALUES (?, ?, ?)");
    $s->execute([$nama, $porsi, $total]);
    echo "<p>Pesanan " . htmlspecialchars($nama) . " tersimpan.</p>\n";
    echo "<p>Total: Rp" . number_format($total, 0, ',', '.') . "</p>\n";
} catch (InvalidArgumentException $e) {
    echo "<p>Ditolak: " . $e->getMessage() . "</p>\n";
}

$jumlah = $db->query("SELECT COUNT(*) FROM pesanan")->fetchColumn();
echo "<p>Pesanan tersimpan: $jumlah</p>\n";
Pilih satu jawaban

Latihan 2 dari 4

Formulir mengirim nama = `Joko` dan porsi = `8`. Apa keluaran program?

<?php
// pesan.php — formulir pesanan katering Dapur Bu Ratna, Semarang
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE pesanan (nama TEXT, porsi INTEGER, total INTEGER)");

function hitungTotal(int $porsi): int {
    if ($porsi < 10) {
        throw new InvalidArgumentException("Minimal pesan 10 porsi");
    }
    $harga = match (true) {
        $porsi >= 50 => 23000,
        default => 25000,
    };
    return $porsi * $harga;
}

$nama = $_POST["nama"] ?? "";
$porsi = (int) ($_POST["porsi"] ?? 0);

try {
    $total = hitungTotal($porsi);
    $s = $db->prepare("INSERT INTO pesanan VALUES (?, ?, ?)");
    $s->execute([$nama, $porsi, $total]);
    echo "<p>Pesanan " . htmlspecialchars($nama) . " tersimpan.</p>\n";
    echo "<p>Total: Rp" . number_format($total, 0, ',', '.') . "</p>\n";
} catch (InvalidArgumentException $e) {
    echo "<p>Ditolak: " . $e->getMessage() . "</p>\n";
}

$jumlah = $db->query("SELECT COUNT(*) FROM pesanan")->fetchColumn();
echo "<p>Pesanan tersimpan: $jumlah</p>\n";
Pilih satu jawaban

Latihan 3 dari 4

Formulir mengirim nama = `<i>Tono</i>` dan porsi = `20`. Teks apa yang tersimpan di kolom nama tabel pesanan?

<?php
// pesan.php — formulir pesanan katering Dapur Bu Ratna, Semarang
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE pesanan (nama TEXT, porsi INTEGER, total INTEGER)");

function hitungTotal(int $porsi): int {
    if ($porsi < 10) {
        throw new InvalidArgumentException("Minimal pesan 10 porsi");
    }
    $harga = match (true) {
        $porsi >= 50 => 23000,
        default => 25000,
    };
    return $porsi * $harga;
}

$nama = $_POST["nama"] ?? "";
$porsi = (int) ($_POST["porsi"] ?? 0);

try {
    $total = hitungTotal($porsi);
    $s = $db->prepare("INSERT INTO pesanan VALUES (?, ?, ?)");
    $s->execute([$nama, $porsi, $total]);
    echo "<p>Pesanan " . htmlspecialchars($nama) . " tersimpan.</p>\n";
    echo "<p>Total: Rp" . number_format($total, 0, ',', '.') . "</p>\n";
} catch (InvalidArgumentException $e) {
    echo "<p>Ditolak: " . $e->getMessage() . "</p>\n";
}

$jumlah = $db->query("SELECT COUNT(*) FROM pesanan")->fetchColumn();
echo "<p>Pesanan tersimpan: $jumlah</p>\n";
Pilih satu jawaban

Latihan 4 dari 4

Formulir mengirim nama = `Wati` dan porsi = `25 porsi`. Apa baris kedua keluaran?

<?php
// pesan.php — formulir pesanan katering Dapur Bu Ratna, Semarang
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE pesanan (nama TEXT, porsi INTEGER, total INTEGER)");

function hitungTotal(int $porsi): int {
    if ($porsi < 10) {
        throw new InvalidArgumentException("Minimal pesan 10 porsi");
    }
    $harga = match (true) {
        $porsi >= 50 => 23000,
        default => 25000,
    };
    return $porsi * $harga;
}

$nama = $_POST["nama"] ?? "";
$porsi = (int) ($_POST["porsi"] ?? 0);

try {
    $total = hitungTotal($porsi);
    $s = $db->prepare("INSERT INTO pesanan VALUES (?, ?, ?)");
    $s->execute([$nama, $porsi, $total]);
    echo "<p>Pesanan " . htmlspecialchars($nama) . " tersimpan.</p>\n";
    echo "<p>Total: Rp" . number_format($total, 0, ',', '.') . "</p>\n";
} catch (InvalidArgumentException $e) {
    echo "<p>Ditolak: " . $e->getMessage() . "</p>\n";
}

$jumlah = $db->query("SELECT COUNT(*) FROM pesanan")->fetchColumn();
echo "<p>Pesanan tersimpan: $jumlah</p>\n";
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke