Validasi di browser memberi respons cepat, validasi di server melindungi data. Perbandingan ini menunjukkan kapan masing-masing dipakai dan mengapa keduanya sering dibutuhkan bersama.
Validasi form PHP vs JavaScript bukan pilihan salah satu, karena keduanya menyelesaikan masalah berbeda. JavaScript memeriksa input sebelum data dikirim ke server, sedangkan PHP memeriksa ulang data yang sudah tiba. Form yang hanya mengandalkan salah satunya akan meninggalkan celah, baik dari sisi pengalaman pengguna maupun keamanan.
Perbedaan mendasar saat form dikirim
Ketika pengguna menekan tombol submit, browser menjalankan handler JavaScript lebih dulu. Kalau ada aturan yang dilanggar, pengiriman bisa dibatalkan dan pesan kesalahan muncul tanpa memuat ulang halaman. Data belum menyentuh server sama sekali.
PHP bekerja di sisi sebaliknya. Setelah request tiba di server, skrip memeriksa $_POST atau $_GET, memastikan setiap field sesuai aturan, lalu memutuskan apakah data disimpan atau dikembalikan ke form. Pemeriksaan ini berjalan pada data yang benar-benar dikirim, termasuk yang dikirim lewat alat bantu atau permintaan manual.
Perbedaan posisi pemeriksaan ini menentukan segalanya. JavaScript menjaga jalur normal pengguna, PHP menjaga jalur apa pun yang bisa masuk ke aplikasi.
Validasi JavaScript: respons cepat di sisi klien
Atribut HTML seperti required, type="email", dan pattern sudah menjalankan validasi dasar tanpa satu baris JavaScript. Browser modern menampilkan pesan bawaan dan menghentikan submit sampai input benar.
Untuk aturan yang lebih rumit, misalnya mencocokkan dua kolom password atau memeriksa ketersediaan username, JavaScript memberi jalan tanpa memuat ulang halaman. Pengguna tahu kesalahannya seketika, bukan setelah menunggu respons server.
Kelemahan utamanya sederhana: kode JavaScript berjalan di komputer pengguna. Siapa pun bisa membuka DevTools, mematikan JavaScript, atau mengirim request langsung dengan curl. Semua aturan validasi di browser bisa dilewati.
Validasi di browser adalah kenyamanan, bukan penjaga pintu. Pintu yang sebenarnya ada di server.
Validasi PHP: lapisan yang tidak bisa dilewati
Setiap request HTTP sampai ke PHP sebagai data mentah. Server tidak peduli apakah permintaan berasal dari form yang rapi atau dari skrip yang dibuat khusus. Karena itu, pemeriksaan di PHP wajib mengulang semua aturan yang sudah dijalankan di browser.
Alur yang lazim dipakai: kumpulkan pesan kesalahan dalam array, tampilkan kembali form dengan nilai sebelumnya, dan tandai field yang bermasalah. Pola ini menjaga pengguna tidak perlu mengetik ulang seluruh isian.
<?php
$errors = [];
$email = trim($_POST['email'] ?? '');
if ($email === '') {
$errors['email'] = 'Email wajib diisi.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Format email tidak valid.';
}
if ($errors) {
// tampilkan ulang form dengan $errors dan $email
} else {
// lanjutkan proses simpan
}
?>
Fungsi filter_var menangani format email, URL, dan angka dengan lebih andal daripada ekspresi reguler buatan sendiri. Untuk data yang disimpan ke database, validasi form tetap harus dilengkapi prepared statement, seperti yang dibahas di panduan menghubungkan PHP ke MySQL dengan PDO dan MySQLi. Validasi memeriksa bentuk data; prepared statement mencegah data itu dieksekusi sebagai perintah SQL.
Membandingkan keduanya pada beberapa kriteria
| Kriteria | JavaScript (klien) | PHP (server) |
|---|---|---|
| Kecepatan umpan balik | Langsung, tanpa request | Setelah halaman dimuat ulang atau AJAX |
| Bisa dilewati pengguna | Ya | Tidak |
| Melindungi database | Tidak | Ya |
| Bergantung pada JavaScript aktif | Ya | Tidak |
| Cocok untuk aturan lintas field | Nyaman | Wajib |
Dua baris terakhir sering luput diperhatikan. Sebagian pengguna mematikan JavaScript karena alasan keamanan atau jaringan lambat. Kalau validasi hanya ada di browser, mereka tidak bisa mengirim form sama sekali. Aturan yang melibatkan beberapa field, misalnya tanggal akhir harus setelah tanggal mulai, juga perlu dipastikan ulang di server karena nilainya bisa diubah sebelum dikirim.
Pola yang dipakai di praktik: keduanya, dengan pembagian tugas
Aturan validasi sebaiknya ditulis sekali dalam bentuk yang bisa dipakai kedua sisi. Untuk proyek kecil, menulis ulang aturan sederhana di PHP tidak masalah. Untuk form yang panjang, pertimbangkan skema validasi yang diekspor ke JavaScript atau endpoint pemeriksaan ringan lewat AJAX.
- JavaScript menangani pemeriksaan format, field wajib, dan panjang karakter sebelum submit.
- PHP mengulang semua pemeriksaan itu, ditambah aturan yang butuh data server seperti keunikan username.
- Pesan kesalahan dari PHP ditampilkan di dekat field yang bersangkutan, bukan sebagai daftar di atas form.
- Nilai yang sudah diisi dikembalikan saat form ditampilkan ulang, kecuali field sensitif seperti password.
Saat halaman form memuat data dari database, misalnya daftar kategori atau kota, pastikan nilai yang dipilih juga diperiksa keabsahannya di PHP. Teknik menampilkan data ke HTML dari database bisa Anda pelajari di cara menampilkan data dari database ke HTML dengan PHP, lalu tambahkan pemeriksaan bahwa nilai yang dikirim memang ada di daftar tersebut.
Untuk form yang pemeriksaannya bergantung pada interaksi dinamis, misalnya memilih elemen tertentu lalu memvalidasi isinya, memahami cara memilih elemen dengan selector jQuery membantu menulis kode yang tepat sasaran tanpa menyentuh elemen lain.
Kesalahan yang sering terjadi
- Hanya memakai validasi HTML5 lalu menganggap form aman. Atribut
requiredmudah dihapus lewat DevTools. - Mempercayai nilai
$_POSTapa adanya karena “sudah diperiksa JavaScript”. Server tidak tahu apa yang terjadi di browser. - Menampilkan pesan kesalahan dari PHP dengan
echolangsung ke HTML tanpa escape, yang membuka celah XSS. - Memvalidasi ulang field yang tidak dikirim, lalu memunculkan error palsu karena indeks array tidak ada.
Saat menelusuri masalah validasi, mencatat nilai $_POST dan pesan error sebelum keputusan diambil sangat membantu. Cara debug PHP yang berbeda-beda, dari var dump sampai logger, dirangkum di perbandingan cara debug PHP.
Ringkasan
JavaScript mempercepat umpan balik, PHP menjaga integritas data. Form yang baik memakai keduanya: browser memeriksa lebih dulu agar pengguna tidak menunggu, server memeriksa ulang karena hanya di situlah aturan benar-benar ditegakkan. Kalau harus memilih satu untuk alasan keamanan, pilih PHP. Kalau memilih satu untuk kenyamanan, pilih JavaScript. Dalam praktik, keduanya bekerja bersama.
Pertanyaan yang Sering Diajukan
Apakah validasi JavaScript saja cukup untuk form login?
Tidak. Form login harus diperiksa di PHP karena request bisa dikirim tanpa melewati browser. Validasi JavaScript di form login lebih berguna untuk mencegah kolom kosong terkirim, bukan untuk mengamankan proses autentikasi.
Bagaimana menampilkan pesan error PHP tanpa memuat ulang halaman?
Kirim data form lewat fetch ke endpoint PHP yang mengembalikan JSON berisi daftar error. JavaScript lalu menempelkan pesan itu ke field terkait. Pemeriksaan di server tetap sama; hanya cara menampilkan hasilnya yang berubah.
Apakah atribut HTML5 menggantikan validasi JavaScript?
Untuk aturan dasar seperti field wajib dan format email, atribut HTML5 sudah cukup dan tidak perlu kode tambahan. Validasi JavaScript tetap diperlukan untuk aturan yang tidak bisa dinyatakan lewat atribut, misalnya kecocokan dua password atau ketergantungan antar field.