Validasi Lanjutan
Validasi serius: filter_var, regex untuk pola khusus, dan sanitasi tipe data.
Kenapa Validasi Lanjutan Dibutuhkan?
filter_var hebat untuk pola umum, tapi aturan bisnis sering lebih spesifik: "username hanya huruf, angka, underscore, 5-15 karakter", "nomor HP Indonesia diawali 08 dan 10-14 digit", "password wajib ada huruf besar, angka, dan simbol". Untuk aturan custom seperti ini, PHP menyediakan regex (Pola) lewat preg_match().
<?php
// Contoh 1: regex untuk aturan bisnis Indonesia
$errors = [];
$username = trim($_POST["username"] ?? "");
if (!preg_match("/^[a-zA-Z0-9_]{5,15}$/", $username)) {
$errors[] = "Username: 5-15 karakter, huruf/angka/underscore saja.";
}
$hp = trim($_POST["hp"] ?? "");
if (!preg_match("/^08[0-9]{8,12}$/", $hp)) {
$errors[] = "Nomor HP harus diawali 08, total 10-14 digit.";
}Membaca regex /^08[0-9]{8,12}$/: ^ = awal string, 08 = harus diawali 08, [0-9]{8,12} = 8-12 digit angka, $ = akhir string. Tanpa ^ dan $, regex hanya mencari kecocokan di sebagian string dan "abc08xxxx" bisa lolos.
<?php
// Contoh 2: password kuat + konfirmasi cocok
$pass = $_POST["pass"] ?? "";
$pass2 = $_POST["pass2"] ?? "";
if (strlen($pass) < 8) {
$errors[] = "Password minimal 8 karakter.";
} elseif (!preg_match("/[A-Z]/", $pass)
|| !preg_match("/[0-9]/", $pass)
|| !preg_match("/[^a-zA-Z0-9]/", $pass)) {
$errors[] = "Password wajib ada huruf besar, angka, dan simbol.";
}
if ($pass !== $pass2) {
$errors[] = "Konfirmasi password tidak cocok.";
}Strategi regex bertahap (satu pola sederhana per syarat) jauh lebih mudah dibaca daripada satu regex raksasa. [^a-zA-Z0-9] artinya "satu karakter yang BUKAN huruf/angka", yaitu simbol.
Jebakan yang Sering Terjadi
Regex tanpa anchor ^...$. preg_match("/08[0-9]+/", "xx08123xx") menghasilkan true karena polanya ketemu di tengah. Untuk validasi "seluruh string harus cocok", selalu bungkus dengan ^ dan $.
Validasi password dengan hash, bukan plaintext. Jangan pernah menyimpan atau membandingkan password asli. Setelah validasi lolos, langsung password_hash($pass, PASSWORD_DEFAULT) dan simpan hash-nya (modul password-hash menjelaskan detailnya).
Validasi Bertingkat yang Rapi
Untuk form besar, bungkus aturan dalam fungsi validator agar reusable:
<?php
function validasi(array $data): array {
$e = [];
if (!preg_match("/^[a-z0-9_]{5,15}$/i", trim($data["username"] ?? ""))) {
$e["username"] = "Username 5-15 karakter alfanumerik.";
}
if (!preg_match("/^08\d{8,12}$/", trim($data["hp"] ?? ""))) {
$e["hp"] = "Nomor HP diawali 08, 10-14 digit.";
}
if (($data["pass"] ?? "") !== ($data["pass2"] ?? "")) {
$e["pass2"] = "Konfirmasi tidak cocok.";
}
return $e; // kosong = lolos
}
$errors = validasi($_POST);
if ($errors === []) {
// proses...
}Fungsi validasi() murni (input array, output array error) mudah di-unit-test tanpa server web: panggil dengan data contoh, cek error yang keluar. Inilah langkah awal menuju kode yang testable.
Catatan teknis: Situs regex101.com adalah taman bermain untuk mencoba pola regex dengan penjelasan per simbol dalam bahasa manusia. Tempel polamu di sana saat bingung, jauh lebih cepat daripada menebak-nebak.
Tantangan
Validator nomor HP
Buat fungsi validasiHP($hp) yang return true jika: hanya digit, diawali "08", panjang 10-14. Pakai regex. Tes dengan "08123456789" (valid), "628123" (tidak), "08abc12345" (tidak).
Kuis Bab
Uji pemahamanmu: Bab 6: Form & Validasi
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Kapan sebaiknya memakai method GET?
2.Bagaimana cara menangkap banyak checkbox di PHP?
3.Apa fungsi htmlspecialchars()?
4.Apa tujuan token CSRF pada form?
5.Mana yang BENAR tentang validasi?