proyekfileformMahir5 mnt baca

Proyek: Buku Tamu

Rangkai semua materi: buku tamu dengan form, validasi, file storage, dan keamanan dasar.

Kenapa Proyek Ini?

Setelah puluhan modul teori, saatnya merangkai semuanya. Buku tamu memaksa memakai: form POST, validasi, sanitasi XSS, tulis-baca file dengan lock, redirect PRG, dan tampilkan data. Ini adalah "ujian praktik" yang mensimulasikan aplikasi web nyata dalam skala kecil.

php
<?php
// Contoh 1: kerangka file tunggal (bukutamu.php)
session_start();
$errors = [];

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $nama = trim($_POST["nama"] ?? "");
    $pesan = trim($_POST["pesan"] ?? "");

    // Validasi berlapis
    if (strlen($nama) < 3 || strlen($nama) > 30) {
        $errors[] = "Nama 3-30 karakter.";
    }
    if (strlen($pesan) < 5 || strlen($pesan) > 300) {
        $errors[] = "Pesan 5-300 karakter.";
    }

    if ($errors === []) {
        // Sanitasi format file: hilangkan pemisah dan newline
        $baris = date("Y-m-d H:i") . "|"
               . str_replace("|", "-", $nama) . "|"
               . str_replace(["\r", "\n", "|"], " ", $pesan) . "\n";
        file_put_contents(__DIR__ . "/tamu.txt",
            $baris, FILE_APPEND | LOCK_EX);

        // Flash message + PRG
        $_SESSION["flash"] = "Terima kasih, pesanmu tersimpan!";
        header("Location: " . $_SERVER["PHP_SELF"]);
        exit;
    }
}

$flash = $_SESSION["flash"] ?? null;
unset($_SESSION["flash"]);   // flash hanya tampil sekali!

Pola flash message (simpan di session, tampilkan sekali, hapus) adalah standar industri untuk pesan sukses setelah redirect. Tanpa ini, pesan sukses tidak bisa melewati redirect PRG.

php
<?php
// Contoh 2: menampilkan daftar (lanjutan file yang sama)
$tamu = [];
if (is_file(__DIR__ . "/tamu.txt")) {
    $tamu = array_reverse(
        file(__DIR__ . "/tamu.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)
    );
}
?>
<?php if ($flash): ?>
    <p style="color:green"><?= htmlspecialchars($flash) ?></p>
<?php endif; ?>
<h2>Buku Tamu (<?= count($tamu) ?>)</h2>
<?php foreach ($tamu as $b): ?>
    <?php [$tgl, $nama, $pesan] = explode("|", $b); ?>
    <p><b><?= htmlspecialchars($nama) ?></b> <small><?= htmlspecialchars($tgl) ?></small><br>
    <?= nl2br(htmlspecialchars($pesan)) ?></p>
<?php endforeach; ?>

array_reverse menampilkan yang terbaru di atas (ekspektasi user). Setiap output dibungkus htmlspecialchars: data dari file tetap dianggap "data luar" karena ditulis oleh pengunjung.

Jebakan yang Sering Terjadi

Lupa LOCK_EX saat banyak pengunjung. Tanpa lock, dua submit bersamaan bisa menghasilkan baris tercampur ("2026-10-08 10:2026-10-08 10:31|Budi..."). Selalu FILE_APPEND | LOCK_EX untuk tulis konkuren.

File data bisa diakses via browser. tamu.txt di folder web bisa dibuka siapa pun via URL dan mengintip semua pesan. Solusi: simpan di luar document root, atau tambahkan .htaccess berisi Deny from all (Apache), atau beri nama acak.

Pengembangan Lanjut

Setelah versi dasar jalan, tantang dirimu dengan fitur ini:

  1. Hapus pesan (admin): tambah password admin sederhana; tiap pesan punya tombol hapus yang menulis ulang file tanpa baris itu.
  2. Balas pesan: format baris ditambah ID unik (uniqid()), balasan menyimpan parent_id.
  3. Emot reaksi: hitung jumlah "suka" per pesan, simpan di file terpisah suka.txt (id => jumlah).
  4. Anti spam: batasi 1 pesan per 30 detik per IP ($_SERVER["REMOTE_ADDR"]).

Setiap fitur melatih konsep berbeda: hapus melatih baca-tulis ulang file, balasan melatih relasi data, reaksi melatih agregasi, anti-spam melatih rate limiting. Kerjakan satu per satu sebagai tantangan.

Catatan teknis: Checklist proyek ini: validasi di server (bukan hanya HTML), sanitasi saat tampil, PRG setelah POST, lock saat tulis file, flash message sekali tampil, dan data di luar jangkauan URL langsung. Kuasai checklist ini dan kamu siap membangun aplikasi web apa pun.

Tantangan

Tambah fitur hapus

Kembangkan buku tamu: tambahkan tombol hapus per entri (pakai index baris). Saat dihapus, tulis ulang file tanpa baris itu. Proteksi dengan CSRF token juga.

Tugas

Tugas: Buku Tamu Lengkap

Buat bukutamu.php lengkap sesuai spesifikasi modul ini: form + validasi + simpan file + tampil terbaru dulu + CSRF + POST-Redirect-GET. Kirim seluruh kode file-mu untuk dinilai AI.

Kriteria penilaian:

  • Validasi nama (min 3) dan pesan (maks 500) dengan pesan error
  • htmlspecialchars di semua output dari user
  • Token CSRF diverifikasi saat POST
  • POST-Redirect-GET setelah simpan berhasil
  • Tidak ada warning PHP saat dijalankan

AI tutor akan memeriksa bug, kesalahan syntax, dan memberi saran perbaikan.