Untuk menangani form input di PHP, kamu perlu memilih method yang sesuai di HTML, membaca nilai lewat $_POST atau $_GET, memvalidasi data sebelum dipakai, lalu menampilkan error tanpa membuat pengguna mengisi ulang seluruh form. Empat langkah ini yang paling sering terlewat oleh pemula.

Di bawah ini perbandingan pilihan pada tiap langkah, beserta alasan memilih salah satunya.

Mulai dari method form, bukan dari kode PHP

Kesalahan umum pemula adalah langsung menulis handler PHP sebelum menentukan method. Padahal method menentukan cara data dikirim dan di mana nilainya bisa dibaca.

Gunakan POST untuk form yang mengubah data: registrasi, login, tambah produk, ubah profil. Nilainya tidak muncul di URL dan tidak tersimpan di riwayat browser. Gunakan GET untuk pencarian, filter, atau paginasi, karena hasilnya masuk akal untuk dibagikan lewat tautan.

Form login sebaiknya tidak memakai GET. Bukan karena GET otomatis tidak aman, tetapi karena isi form akan tercatat di log server dan riwayat browser.

Lengkapi atribut yang mencegah kesalahan sepele

Selalu isi atribut action dan method secara eksplisit. Tambahkan maxlength pada kolom teks, required pada kolom wajib, dan type="email" untuk alamat email. Atribut ini tidak menggantikan validasi PHP, tetapi mengurangi jumlah request yang pasti gagal.

Cara membaca nilai input: $_POST, $_GET, atau filter_input

Tiga pilihan ini sering dianggap setara. Perbedaannya ada pada asal data dan cara PHP menyaringnya.

  • $_POST dan $_GET: superglobal yang bisa langsung diakses. Cepat ditulis, tetapi mudah dipakai tanpa pengecekan.
  • filter_input(): mengambil nilai dari sumber yang dinamai, misalnya INPUT_POST, dan mengembalikan null bila kunci tidak ada. Pilihan ini memaksa kamu menangani kasus input hilang.
  • Request object: hanya relevan bila kamu memakai framework. Untuk skrip PHP murni, cara ini menambah lapisan tanpa manfaat nyata.

Untuk pemula, filter_input() dengan tipe FILTER_DEFAULT atau FILTER_SANITIZE_SPECIAL_CHARS cukup sebagai titik awal. Kamu tetap harus memeriksa nilainya sebelum dipakai, karena fungsi ini tidak menjamin isi yang masuk masuk akal.

Saat mengecek nilai kosong, bedakan antara null, string kosong, dan 0. Perbedaan ini dijelaskan lebih rinci di artikel isset, empty, dan Null Coalescing di PHP, dan sangat memengaruhi validasi form.

Validasi: satu fungsi, banyak aturan

Validasi form paling rawan ditulis berulang di tiap halaman. Cara paling sederhana untuk pemula: kumpulkan error dalam satu array, jangan hentikan skrip di error pertama.

Contoh pola dasarnya:

$errors = [];
$nama = trim($_POST['nama'] ?? '');
$email = trim($_POST['email'] ?? '');

if ($nama === '') {
    $errors['nama'] = 'Nama wajib diisi.';
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors['email'] = 'Format email tidak valid.';
}

if ($errors) {
    // tampilkan kembali form beserta pesan error
}

Pola ini memungkinkan kamu menampilkan semua pesan sekaligus, jadi pengguna tidak perlu memperbaiki satu per satu.

Validasi di browser tetap berguna, tapi bukan pengaman

Validasi JavaScript mempercepat umpan balik dan mengurangi round trip ke server. Tetap lakukan validasi di PHP karena request bisa dikirim tanpa melewati browser. Pembahasan lebih lengkap soal pembagian tugas ini ada di Validasi Form PHP vs Validasi JavaScript.

Menampilkan pesan error tanpa menghapus isian

Form yang dikosongkan setiap kali error membuat pengguna frustrasi. Simpan nilai yang sudah dikirim dan tampilkan kembali di kolom yang sesuai.

Dua pendekatan yang lazim:

  1. Render ulang form yang sama: setelah validasi gagal, tampilkan HTML form lagi dengan nilai terisi dan pesan error di samping kolom.
  2. Redirect dengan session flash: simpan nilai dan error di session, alihkan ke halaman form, lalu hapus session setelah ditampilkan. Pola ini mencegah pengiriman ulang saat pengguna menekan refresh.

Untuk form pendek, pendekatan pertama lebih sederhana. Untuk form panjang atau proses yang memakan waktu, pola kedua lebih rapi. Ingat untuk selalu memanggil htmlspecialchars() saat mencetak nilai kembali ke HTML agar karakter seperti < tidak merusak markup.

Menyimpan ke database dan menangani kegagalan

Setelah validasi lolos, barulah data disimpan. Gunakan prepared statement, jangan menyusun query dengan penggabungan string. Teknik menyusun query yang aman dibahas tuntas di 7 Teknik Menghindari SQL Injection di PHP.

Bungkus proses simpan dalam blok try/catch bila memakai PDO, lalu arahkan pengguna ke halaman sukses hanya jika penyimpanan berhasil. Jika gagal, tampilkan pesan yang jujur tanpa membocorkan detail query ke pengguna.

Untuk kebutuhan yang lebih kompleks, misalnya menampilkan data dengan beberapa kondisi filter sekaligus, lihat contoh penerapannya pada cara menampilkan data dari database dengan filter multi-kondisi di PHP.

Form dengan banyak kolom: pertimbangkan struktur data

Begitu form mulai memiliki kolom dinamis, misalnya beberapa nomor telepon atau baris item, cara kamu menamai input menentukan kemudahan pemrosesan. Gunakan notasi array seperti telepon[] agar PHP menerimanya sebagai array, bukan sekumpulan nama unik.

Kalau nanti data form dikirim ke sisi klien sebagai respons, perhatikan format yang dipakai. Perbandingan antara objek, array, dan JSON bisa dibaca di memilih format data jQuery: objek, array, atau JSON. Prinsipnya: pilih format yang paling mudah diperiksa di sisi penerima.

Checklist sebelum form dianggap selesai

  • Method form sesuai jenis aksi (POST untuk mengubah data).
  • Setiap kolom wajib dicek di PHP, bukan hanya lewat atribut HTML.
  • Semua error ditampilkan sekaligus dan menempel pada kolom terkait.
  • Nilai yang sudah diisi tidak hilang saat validasi gagal.
  • Output ke HTML melewati htmlspecialchars().
  • Query database memakai prepared statement.
  • Ada mekanisme pencegahan pengiriman ganda, minimal redirect setelah simpan.

Kerjakan berurutan. Form yang selesai lebih baik daripada form yang fiturnya banyak tetapi validasinya setengah jadi.

Pertanyaan yang Sering Diajukan

Apakah $_POST sudah aman untuk langsung disimpan ke database?

Tidak. $_POST hanya wadah nilai yang dikirim browser. Isinya bisa berupa apa saja, termasuk karakter yang merusak query atau markup. Validasi isinya, lalu gunakan prepared statement saat menyimpan.

Kapan sebaiknya memakai session untuk menyimpan error form?

Saat proses setelah submit melibatkan redirect, misalnya setelah menyimpan ke database atau saat form berada di halaman berbeda. Session menyimpan error dan nilai sementara, lalu kamu hapus setelah ditampilkan agar tidak muncul lagi saat halaman dimuat ulang.

Perlukah token CSRF untuk form sederhana?

Ya, kalau form mengubah data milik pengguna yang sedang login. Token CSRF mencegah situs lain mengirim request atas nama pengguna. Untuk form yang benar-benar publik, misalnya halaman kontak tanpa login, risikonya lebih kecil tetapi tetap sebaiknya ditambahkan sebagai kebiasaan.