Input Ganda: Checkbox & Select
Tangani banyak pilihan: checkbox array (name[]), select multiple, dan radio.
Kenapa Input Ganda Perlu Perlakuan Khusus?
Form dunia nyata jarang punya satu input teks. Ada checkbox (pilih banyak), radio (pilih satu), select (dropdown), dan select ganda. Masing-masing punya perilaku unik di PHP: checkbox yang tidak dicentang tidak dikirim sama sekali, dan input ganda butuh nama berformat array (name="hobi[]") agar semua pilihan tertampung.
<?php
// Contoh 1: checkbox hobi (pilih banyak)
// HTML: <input type="checkbox" name="hobi[]" value="Membaca"> dst.
$hobi = $_POST["hobi"] ?? []; // array, atau [] jika tidak ada yang dicentang
if (is_array($hobi) && $hobi !== []) {
echo "Hobimu: " . implode(", ", $hobi);
} else {
echo "Belum pilih hobi.";
}Tanda [] pada name="hobi[]" adalah instruksinya PHP: "tampung semua nilai tercentang sebagai array". Tanpa [], hanya nilai terakhir yang sampai. Dan karena checkbox tak tercentang tidak dikirim, ?? [] adalah pengaman wajib.
<?php
// Contoh 2: radio, select, dan form pemesanan makanan
// Radio (pilih satu): name sama, value beda
// <input type="radio" name="ukuran" value="Kecil">
// <input type="radio" name="ukuran" value="Besar">
$ukuran = $_POST["ukuran"] ?? "Sedang";
echo "Ukuran: " . htmlspecialchars($ukuran);
// Select ganda: <select name="topping[]" multiple>
$topping = $_POST["topping"] ?? [];
$total = 15000 + (count($topping) * 3000);
echo "Total: Rp" . number_format($total);
// Validasi nilai terhadap daftar yang diizinkan (PENTING!)
$daftarUkuran = ["Kecil", "Sedang", "Besar"];
if (!in_array($ukuran, $daftarUkuran, true)) {
$ukuran = "Sedang"; // tolak nilai siluman dari luar form
}Poin terakhir adalah pelajaran keamanan penting: user bisa mengubah value radio/select lewat devtools browser atau curl. Jangan pernah percaya nilainya; selalu cek dengan in_array($nilai, $daftarDiizinkan, true) sebelum dipakai.
Jebakan yang Sering Terjadi
Lupa [] pada checkbox ganda. name="hobi" tanpa kurung siku hanya mengirim satu nilai (yang terakhir). Untuk pilihan ganda, nama wajib name="hobi[]" dan hasilnya selalu array.
Memakai $_POST["hobi"] langsung tanpa cek. Kalau tidak ada checkbox tercentang, kuncinya tidak ada dan akses langsung memicu warning "Undefined array key". Selalu $hobi = $_POST["hobi"] ?? []; lalu pastikan is_array() sebelum di-implode atau di-foreach.
Input Dinamis: Tambah Baris
Kasus umum: form order dengan tombol "tambah barang" (JavaScript menambah input). PHP menerimanya sebagai array:
<?php
// HTML yang dihasilkan JS (name berindeks):
// <input name="barang[0][nama]"> <input name="barang[0][qty]">
// <input name="barang[1][nama]"> <input name="barang[1][qty]">
$total = 0;
foreach ($_POST["barang"] ?? [] as $b) {
$nama = trim($b["nama"] ?? "");
$qty = (int) ($b["qty"] ?? 0);
if ($nama === "" || $qty < 1) continue; // lewati baris kosong
// ... ambil harga dari database berdasar $nama ...
$total += $qty * 15000;
}
echo "Total: Rp" . number_format($total);Notasi barang[0][nama] otomatis menjadi array multidimensi di $_POST. Validasi tiap baris: lewati yang kosong, tolak qty aneh. Jangan percaya jumlah baris dari browser: user bisa mengirim 10.000 baris untuk DoS, batasi dengan array_slice($_POST["barang"], 0, 50).
Catatan teknis: Trik input hidden sering dipakai berpasangan dengan checkbox:
<input type="hidden" name="setuju" value="0">sebelum checkboxsetujubernilai 1. Kalau checkbox tidak dicentang, yang terkirim adalah 0 dari hidden input, sehingga kunci selalu ada. Berguna untuk kolom boolean database.
Tantangan
Form pemesanan makanan
Buat form POST: pilih 1 paket (radio: hemat 15000 / kenyang 25000 / sultan 50000) + topping tambahan (checkbox[]: keju 5000, telur 7000, ayam 12000). Hitung dan tampilkan total bayar.