formpostwebMenengah3 mnt baca

Form dengan POST

Kirim data tersembunyi dari URL: form POST, membaca $_POST, dan bedanya dengan GET.

Kenapa POST Ada?

GET menempel data di URL: terlihat semua orang dan terbatas panjangnya. POST mengirim data di badan request (body), tersembunyi dari URL. Inilah kenapa form login, pendaftaran, dan kritik-saran memakai POST: datanya tidak nongol di address bar, tidak tersimpan di history, dan bisa membawa teks sangat panjang atau file.

PHP menampungnya di $_POST, kembaran $_GET yang cara pakainya identik.

php
<?php
// Contoh 1: form kritik & saran (satu file)
$pesan = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $nama = trim($_POST["nama"] ?? "");
    $isi = trim($_POST["isi"] ?? "");
    if ($nama !== "" && $isi !== "") {
        $pesan = "Terima kasih, $nama! Saranmu sudah dicatat.";
    } else {
        $pesan = "Nama dan saran wajib diisi.";
    }
}
?>
<?php if ($pesan): ?><p><?= htmlspecialchars($pesan) ?></p><?php endif; ?>
<form method="post" action="">
    <input type="text" name="nama" placeholder="Namamu">
    <textarea name="isi" placeholder="Tulis saran..."></textarea>
    <button type="submit">Kirim</button>
</form>

Pola ini adalah template universal form POST satu file: (1) cek $_SERVER["REQUEST_METHOD"] === "POST" untuk tahu apakah form baru saja disubmit, (2) ambil dan rapikan input, (3) validasi, (4) tampilkan pesan. <?= ... ?> adalah singkatan <?php echo ... ?>.

php
<?php
// Contoh 2: POST-Redirect-GET (mencegah duplikat saat refresh)
// File: simpan.php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $nama = trim($_POST["nama"] ?? "");
    // ... simpan ke file/database ...
    file_put_contents("saran.txt", $nama . "\n", FILE_APPEND);
    header("Location: terima-kasih.php");  // redirect!
    exit;
}

Tanpa redirect, user yang menekan refresh setelah submit akan melihat peringatan "kirim ulang form?" dan datanya tersimpan dua kali. Pola POST-Redirect-GET: setelah POST berhasil, kirim header Location agar browser pindah ke halaman GET biasa. Refresh setelah itu aman karena hanya mengulang GET.

Jebakan yang Sering Terjadi

Output sebelum header(). header("Location: ...") wajib dipanggil sebelum ada output apa pun (bahkan spasi atau baris kosong sebelum <?php). Kalau sudah terlanjur echo, PHP error "headers already sent". Aturan: logika POST (termasuk redirect) selalu di atas, HTML di bawah.

Mengira POST = aman. POST hanya menyembunyikan data dari URL, bukan mengenkripsinya. Tanpa HTTPS, data POST tetap bisa diintip di jaringan. Dan validasi tetap wajib: user bisa mengirim POST palsu dengan curl tanpa lewat form-mu sama sekali. Jangan pernah percaya $_POST.

Form Multi-Langkah dengan Session

Form panjang (pendaftaran 3 langkah) memakai session sebagai "memori" antar langkah:

php
<?php
session_start();
$langkah = (int) ($_GET["langkah"] ?? 1);

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // simpan langkah ini ke session, lanjut ke langkah berikut
    $_SESSION["form"] = array_merge($_SESSION["form"] ?? [], $_POST);
    $langkah++;
    header("Location: ?langkah=$langkah");
    exit;
}

if ($langkah === 1) {
    echo '<form method="post">Nama: <input name="nama"><button>Lanjut</button></form>';
} elseif ($langkah === 2) {
    echo '<form method="post">Alamat: <input name="alamat"><button>Lanjut</button></form>';
} else {
    $data = $_SESSION["form"] ?? [];
    echo "Selesai! Data: " . htmlspecialchars(json_encode($data));
    unset($_SESSION["form"]);   // bersihkan setelah selesai
}

Pola ini: tiap langkah POST ke dirinya sendiri, simpan ke session, redirect ke langkah berikut (PRG!). Di langkah final, gabungkan semua dan proses. Session dibersihkan agar form bisa diulang dari awal.

Catatan teknis: $_POST hanya terisi untuk request dengan content-type form (application/x-www-form-urlencoded atau multipart/form-data). Data JSON mentah dari JavaScript fetch tidak masuk $_POST; bacanya lewat file_get_contents("php://input") (dibahas di modul JSON).

Tantangan

Form kritik saran

Buat satu file kritik.php: form POST berisi nama dan pesan (textarea). Saat disubmit, tampilkan "Terima kasih NAMA, pesanmu: PESAN" dengan htmlspecialchars. Form tetap tampil di bawahnya.