Tutorial PHP #14: Validasi Input Form di PHP

1. Kenapa Validasi Input Penting?

Jangan pernah percaya data dari user! Validasi input memiliki dua tujuan utama:

  • Menjaga kualitas data - pastikan format dan isi data sesuai kebutuhan
  • Keamanan aplikasi - mencegah serangan seperti XSS, SQL Injection, dsb

2. Validasi Dasar

<?php
$errors = [];
$nama = "";
$email = "";

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // Cek apakah field kosong
    if (empty($_POST["nama"])) {
        $errors["nama"] = "Nama wajib diisi";
    } else {
        $nama = $_POST["nama"];
    }

    if (empty($_POST["email"])) {
        $errors["email"] = "Email wajib diisi";
    } else {
        $email = $_POST["email"];
    }

    // Jika tidak ada error, proses data
    if (empty($errors)) {
        echo "Data valid! Nama: $nama, Email: $email";
    }
}
?>

3. Sanitasi Input

Sanitasi membersihkan input dari karakter berbahaya sebelum disimpan atau ditampilkan.

<?php
$input = "<script>alert('XSS Attack')</script>";

// htmlspecialchars: ubah karakter HTML jadi entitas - cegah XSS
$aman = htmlspecialchars($input, ENT_QUOTES, "UTF-8");
echo $aman;   // Output: &lt;script&gt;alert('XSS')&lt;/script&gt;

// strip_tags: hapus semua tag HTML
$bersih = strip_tags($input);
echo $bersih;   // Output: alert(XSS Attack)

// trim: hapus spasi di awal dan akhir
$nama = trim("  Ariq  ");
echo $nama;   // Output: Ariq
?>

4. Validasi dengan filter_var()

PHP punya fungsi built-in filter_var() yang sangat berguna untuk validasi dan sanitasi:

<?php
// Validasi email
$email = "ariq@email.com";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Email tidak valid";
} else {
    echo "Email valid";
}

// Validasi URL
$url = "https://ariq.dev";
if (!filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL tidak valid";
}

// Validasi angka
$umur = "25";
if (!filter_var($umur, FILTER_VALIDATE_INT)) {
    echo "Bukan angka bulat";
}

// Validasi rentang angka
if (!filter_var($umur, FILTER_VALIDATE_INT, ["options" => ["min_range" => 1, "max_range" => 120]])) {
    echo "Umur tidak valid";
}

// Sanitasi email
$emailKotor = "  ariq @email.com  ";
$emailBersih = filter_var($emailKotor, FILTER_SANITIZE_EMAIL);
echo $emailBersih;   // Output: ariq@email.com
?>

5. Validasi Panjang String

<?php
$password = $_POST["password"] ?? "";

if (strlen($password) < 8) {
    echo "Password minimal 8 karakter";
}

if (strlen($password) > 50) {
    echo "Password maksimal 50 karakter";
}

$username = trim($_POST["username"] ?? "");
if (!preg_match("/^[a-zA-Z0-9_]+$/", $username)) {
    echo "Username hanya boleh huruf, angka, dan underscore";
}
?>

6. Contoh Form Validasi Lengkap

<?php
$errors = [];
$sukses = false;

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

    if (empty($nama))   $errors["nama"]  = "Nama wajib diisi";
    if (empty($email))  $errors["email"] = "Email wajib diisi";
    elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors["email"] = "Format email tidak valid";
    if (empty($umur))   $errors["umur"]  = "Umur wajib diisi";
    elseif (!is_numeric($umur) || $umur < 1 || $umur > 120) $errors["umur"] = "Umur tidak valid";

    if (empty($errors)) $sukses = true;
}
?>

7. Ringkasan

  • Selalu validasi data dari user - jangan pernah percaya langsung
  • htmlspecialchars() untuk mencegah XSS
  • filter_var() untuk validasi email, URL, dan angka
  • Kumpulkan semua error ke dalam array sebelum memproses data

Tutorial berikutnya membahas include, require, include_once, require_once.