Form adalah cara utama untuk mengumpulkan data dari pengguna di web. Pelajari cara menangani form dengan PHP, memproses data, validasi input, dan menjaga keamanan aplikasi web Anda.
Mengenal Form HTML
Form HTML adalah cara untuk mengumpulkan input dari pengguna. Data yang dikumpulkan kemudian dikirim ke server untuk diproses oleh PHP.
Struktur Dasar Form
<form action="proses.php" method="POST">
<label for="nama">Nama:</label>
<input type="text" id="nama" name="nama" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<label for="pesan">Pesan:</label>
<textarea id="pesan" name="pesan" rows="4" required></textarea>
<button type="submit">Kirim</button>
</form>
Perbedaan GET dan POST
Aspek |
GET |
POST |
Lokasi Data |
URL (query string) |
Body HTTP request |
Ukuran Data |
Terbatas (~2048 karakter) |
Tidak terbatas |
Keamanan |
Kurang aman (terlihat di URL) |
Lebih aman |
Penggunaan |
Pencarian, filtering |
Form login, registrasi |
Bookmark |
Bisa di-bookmark |
Tidak bisa di-bookmark |
Memproses Data Form dengan PHP
PHP menyediakan superglobal $_POST dan $_GET untuk mengakses data form.
<?php
// proses.php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Mengambil data dari form
$nama = $_POST['nama'];
$email = $_POST['email'];
$pesan = $_POST['pesan'];
// Menampilkan data
echo "<h2>Data yang Diterima:</h2>";
echo "Nama: " . $nama . "<br>";
echo "Email: " . $email . "<br>";
echo "Pesan: " . $pesan . "<br>";
} else {
echo "Tidak ada data yang dikirim.";
}
?>
Penting: Selalu periksa apakah data form benar-benar ada sebelum menggunakannya untuk menghindari error.
Memeriksa Keberadaan Data Form
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Memeriksa apakah field ada dan tidak kosong
if (isset($_POST['nama']) && !empty($_POST['nama'])) {
$nama = $_POST['nama'];
} else {
$nama = "Nama tidak diisi";
}
// Cara yang lebih singkat dengan null coalescing operator
$email = $_POST['email'] ?? 'Email tidak diisi';
$pesan = $_POST['pesan'] ?? 'Pesan tidak diisi';
// Menampilkan hasil
echo "Nama: $nama<br>";
echo "Email: $email<br>";
echo "Pesan: $pesan<br>";
}
?>
Form dengan Method GET
<!-- Form pencarian -->
<form action="search.php" method="GET">
<label for="query">Cari:</label>
<input type="text" id="query" name="query" placeholder="Masukkan kata kunci...">
<label for="kategori">Kategori:</label>
<select id="kategori" name="kategori">
<option value="">Semua Kategori</option>
<option value="tutorial">Tutorial</option>
<option value="artikel">Artikel</option>
<option value="tips">Tips</option>
</select>
<button type="submit">Cari</button>
</form>
<?php
// search.php
if (isset($_GET['query'])) {
$query = $_GET['query'];
$kategori = $_GET['kategori'] ?? '';
echo "Mencari: '$query'";
if (!empty($kategori)) {
echo " dalam kategori '$kategori'";
}
// Di sini Anda bisa menambahkan logika pencarian ke database
// ...
} else {
echo "Tidak ada kata kunci pencarian.";
}
?>
Validasi Data Form
Validasi adalah proses memastikan data yang dikirim pengguna sesuai dengan format dan kriteria yang diinginkan.
Jenis-jenis Validasi
- Validasi Keberadaan: Memastikan field tidak kosong
- Validasi Format: Memastikan data sesuai format (email, nomor telepon)
- Validasi Panjang: Memastikan panjang data dalam batas yang diizinkan
- Validasi Tipe: Memastikan data bertipe yang benar (angka, string)
Contoh Validasi Lengkap
<?php
$errors = [];
$nama = $email = $umur = $password = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Validasi Nama
if (empty($_POST["nama"])) {
$errors[] = "Nama harus diisi";
} elseif (strlen($_POST["nama"]) < 2) {
$errors[] = "Nama minimal 2 karakter";
} else {
$nama = trim($_POST["nama"]);
// Memastikan hanya huruf dan spasi
if (!preg_match("/^[a-zA-Z\s]+$/", $nama)) {
$errors[] = "Nama hanya boleh berisi huruf dan spasi";
}
}
// Validasi Email
if (empty($_POST["email"])) {
$errors[] = "Email harus diisi";
} else {
$email = trim($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Format email tidak valid";
}
}
// Validasi Umur
if (empty($_POST["umur"])) {
$errors[] = "Umur harus diisi";
} else {
$umur = $_POST["umur"];
if (!is_numeric($umur) || $umur < 13 || $umur > 100) {
$errors[] = "Umur harus berupa angka antara 13-100";
}
}
// Validasi Password
if (empty($_POST["password"])) {
$errors[] = "Password harus diisi";
} else {
$password = $_POST["password"];
if (strlen($password) < 8) {
$errors[] = "Password minimal 8 karakter";
}
if (!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/", $password)) {
$errors[] = "Password harus mengandung huruf besar, kecil, dan angka";
}
}
// Jika tidak ada error
if (empty($errors)) {
echo "<div class='alert alert-success'>Data berhasil divalidasi!</div>";
echo "<p>Nama: $nama</p>";
echo "<p>Email: $email</p>";
echo "<p>Umur: $umur</p>";
// Di sini Anda bisa menyimpan ke database
}
}
?>
<!-- Menampilkan error jika ada -->
<?php if (!empty($errors)): ?>
<div class="alert alert-danger">
<h4>Terjadi kesalahan:</h4>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" action="">
<div class="mb-3">
<label for="nama" class="form-label">Nama Lengkap:</label>
<input type="text" class="form-control" id="nama" name="nama" value="<?php echo htmlspecialchars($nama); ?>">
</div>
<div class="mb-3">
<label for="email" class="form-label">Email:</label>
<input type="email" class="form-control" id="email" name="email" value="<?php echo htmlspecialchars($email); ?>">
</div>
<div class="mb-3">
<label for="umur" class="form-label">Umur:</label>
<input type="number" class="form-control" id="umur" name="umur" value="<?php echo htmlspecialchars($umur); ?>">
</div>
<div class="mb-3">
<label for="password" class="form-label">Password:</label>
<input type="password" class="form-control" id="password" name="password">
</div>
<button type="submit" class="btn btn-primary">Daftar</button>
</form>
Fungsi Validasi Built-in PHP
PHP menyediakan beberapa fungsi untuk memudahkan validasi:
Fungsi |
Kegunaan |
Contoh |
filter_var() |
Validasi dan sanitasi data |
filter_var($email, FILTER_VALIDATE_EMAIL) |
is_numeric() |
Memeriksa apakah nilai numerik |
is_numeric($umur) |
preg_match() |
Validasi dengan regex |
preg_match("/^[0-9]+$/", $nomor) |
strlen() |
Memeriksa panjang string |
strlen($password) >= 8 |
empty() |
Memeriksa apakah kosong |
empty($_POST['nama']) |
Filter Validasi Umum
<?php
// Validasi Email
$email = "user@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Email valid";
} else {
echo "Email tidak valid";
}
// Validasi URL
$url = "https://www.example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL valid";
} else {
echo "URL tidak valid";
}
// Validasi IP Address
$ip = "192.168.1.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
echo "IP Address valid";
} else {
echo "IP Address tidak valid";
}
// Validasi Integer dalam range
$int = 100;
$options = array(
"options" => array(
"min_range" => 1,
"max_range" => 200
)
);
if (filter_var($int, FILTER_VALIDATE_INT, $options)) {
echo "Integer valid dalam range";
} else {
echo "Integer tidak valid atau di luar range";
}
?>
Keamanan Form
Keamanan form sangat penting untuk melindungi aplikasi dari berbagai serangan seperti XSS, SQL Injection, dan CSRF.
1. Sanitasi Input (Input Sanitization)
Sanitasi adalah proses membersihkan data input dari karakter berbahaya.
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Sanitasi input dengan filter_var
$nama = filter_var($_POST['nama'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
// Sanitasi dengan htmlspecialchars (mencegah XSS)
$komentar = htmlspecialchars($_POST['komentar'], ENT_QUOTES, 'UTF-8');
// Sanitasi dengan strip_tags (menghapus HTML tags)
$deskripsi = strip_tags($_POST['deskripsi']);
// Sanitasi dengan trim (menghapus spasi di awal/akhir)
$username = trim($_POST['username']);
echo "Data yang telah disanitasi:<br>";
echo "Nama: $nama<br>";
echo "Email: $email<br>";
echo "Komentar: $komentar<br>";
echo "Deskripsi: $deskripsi<br>";
echo "Username: $username<br>";
}
?>
2. Pencegahan XSS (Cross-Site Scripting)
XSS terjadi ketika script berbahaya diinjeksi ke dalam halaman web melalui input pengguna.
<?php
function sanitizeOutput($data) {
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$nama = $_POST['nama'];
$komentar = $_POST['komentar'];
// SALAH: Langsung menampilkan input (rentan XSS)
// echo "Nama: " . $nama;
// echo "Komentar: " . $komentar;
// BENAR: Sanitasi sebelum menampilkan
echo "Nama: " . sanitizeOutput($nama) . "<br>";
echo "Komentar: " . sanitizeOutput($komentar) . "<br>";
}
?>
<form method="POST">
<input type="text" name="nama" placeholder="Masukkan nama">
<textarea name="komentar" placeholder="Masukkan komentar"></textarea>
<button type="submit">Kirim</button>
</form>
3. CSRF Protection
CSRF (Cross-Site Request Forgery) adalah serangan yang memaksa pengguna melakukan aksi yang tidak diinginkan.
<?php
session_start();
// Fungsi untuk generate CSRF token
function generateCSRFToken() {
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
// Fungsi untuk verifikasi CSRF token
function verifyCSRFToken($token) {
return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Verifikasi CSRF token
if (!isset($_POST['csrf_token']) || !verifyCSRFToken($_POST['csrf_token'])) {
die("CSRF token tidak valid!");
}
// Proses form jika token valid
echo "Form berhasil diproses dengan aman!";
// Reset token setelah digunakan
unset($_SESSION['csrf_token']);
}
$csrf_token = generateCSRFToken();
?>
<form method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?>">
<input type="text" name="data" placeholder="Masukkan data">
<button type="submit">Kirim</button>
</form>
4. Upload File yang Aman
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["upload"])) {
$target_dir = "uploads/";
$file = $_FILES["upload"];
// Validasi error upload
if ($file["error"] !== UPLOAD_ERR_OK) {
die("Error upload file.");
}
// Validasi ukuran file (max 2MB)
if ($file["size"] > 2 * 1024 * 1024) {
die("File terlalu besar. Maksimal 2MB.");
}
// Validasi tipe file
$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file["tmp_name"]);
finfo_close($finfo);
if (!in_array($mime_type, $allowed_types)) {
die("Tipe file tidak diizinkan. Hanya JPEG, PNG, dan GIF.");
}
// Generate nama file yang aman
$file_extension = pathinfo($file["name"], PATHINFO_EXTENSION);
$new_filename = uniqid() . '.' . $file_extension;
$target_file = $target_dir . $new_filename;
// Pastikan direktori upload ada
if (!is_dir($target_dir)) {
mkdir($target_dir, 0755, true);
}
// Upload file
if (move_uploaded_file($file["tmp_name"], $target_file)) {
echo "File berhasil diupload: " . $new_filename;
} else {
echo "Gagal mengupload file.";
}
}
?>
<form method="POST" enctype="multipart/form-data">
<label for="upload">Pilih file gambar:</label>
<input type="file" id="upload" name="upload" accept="image/*">
<button type="submit">Upload</button>
</form>
Praktik Keamanan Penting:
- Selalu validasi dan sanitasi input pengguna
- Gunakan prepared statements untuk query database
- Implementasikan CSRF protection untuk form penting
- Batasi ukuran dan tipe file upload
- Jangan pernah percaya input dari client-side
- Gunakan HTTPS untuk form yang mengandung data sensitif