#Part 4: Validasi Form, Flashdata, dan Upload Gambar di CodeIgniter 4 Lengkap 10 Jul 2026

#Part 4: Validasi Form, Flashdata, dan Upload Gambar di CodeIgniter 4 Lengkap

#Part 4: Validasi Form, Flashdata, dan Upload Gambar di CodeIgniter 4 Lengkap

Di #Part 3 kita sudah berhasil bikin CRUD. Tapi ada masalah besar: User bisa submit form kosong. Atau upload file .exe yang bisa merusak server. Bahaya!

Di part ini kita akan "mengunci" aplikasi kita. Kita akan belajar 3 hal penting: Validasi Form, Flashdata, dan Upload Gambar. Ini skill wajib untuk aplikasi production.

1. Kenapa Validasi Server Side Wajib?

Banyak pemula cuma pakai required di HTML. Itu gampang diakalin. Hacker bisa matiin JS dan submit data kosong.

Validasi Server Side = dicek di PHP/Controller. Mau dihack gimana pun tetap ketahuan. CI4 punya library Validasi yang sangat powerful.

2. Implementasi Validasi di Controller Produk

Kita lanjutkan project #Part 3. Buka method store() dan update() di Produk.php

public function store()
{
    $rules = [
        "nama_produk" => "required|min_length[3]|max_length[100]",
        "harga"       => "required|numeric|greater_than[0]",
        "stok"        => "required|integer|greater_than_equal_to[0]",
        "gambar"      => "uploaded[gambar]|is_image[gambar]|mime_in[gambar,image/jpg,image/jpeg,image/png]|max_size[gambar,2048]"
    ];

    $errors = [
        "nama_produk" => [
            "required" => "Nama Produk wajib diisi",
            "min_length" => "Minimal 3 karakter"
        ],
        "harga" => [
            "required" => "Harga wajib diisi",
            "numeric" => "Harga harus angka"
        ]
    ];

    if(!$this->validate($rules, $errors)) {
        return redirect()->back()->withInput()->with("errors", $this->validator->getErrors());
    }

    // jika lolos validasi, lanjut simpan
    $this->produkModel->save($this->request->getPost());
    return redirect()->to("/produk")->with("success", "Data berhasil ditambah");
}

Penjelasan: uploaded wajib upload. is_image pastikan file gambar. max_size max 2MB. Array $errors buat custom pesan biar user paham.

3. Menampilkan Error dan Flashdata di View

Flashdata = pesan 1x tampil lalu hilang. Cocok untuk "Data berhasil disimpan"

Di View index.php, taruh di atas tabel:




getFlashdata("success")): ?>
    
getFlashdata("success") ?>




Di View create.php, di bawah tiap input:

">
 

4. Tutorial Upload Gambar Produk Lengkap

Langkah upload aman di CI4:

  1. Buat Folder: Buat folder public/uploads/produk. Kasih permission 755
  2. Ubah Form: Tambahkan enctype="multipart/form-data" di tag
  3. Kode Upload di Controller:
$gambar = $this->request->getFile("gambar");
if($gambar->isValid() && !$gambar->hasMoved()) {
    $namaBaru = $gambar->getRandomName(); // biar nama file unik
    $gambar->move("uploads/produk", $namaBaru);
    // simpan $namaBaru ke database
}

Bonus: Resize Gambar Otomatis

Biar web tidak berat, kita resize. CI4 punya Image Library:

$image = ConfigServices::image()->withFile("uploads/produk/".$namaBaru)->fit(300, 300, "center")->save("uploads/produk/thumb_".$namaBaru);

5. Tips Keamanan Upload File

Bahaya Solusi CI4
Upload file PHP Gunakan mime_in dan is_image
Nama file sama Gunakan getRandomName()
File terlalu besar Gunakan max_size

Kesimpulan

Dengan Validasi + Upload ini, aplikasi CRUD kamu sudah setara aplikasi beneran. Di #Part 5: Cara Deploy ke Hosting kita akan upload semua ini ke internet.

FAQ

Perbedaan withInput() dan with()?

withInput() mengembalikan data lama ke form. with("success", "...") untuk flashdata.

Gambar tidak mau ke upload?

Cek 3 hal: 1. enctype form 2. permission folder 3. max_size di php.ini

Apakah validasi client side masih perlu?

Perlu untuk UX. Tapi validasi server side wajib untuk keamanan.

Males Ngoding Sendiri?

Tim Culobo siap buatin website, ajarin coding, atau naikin SEO web kamu.

Lihat 3 Layanan Kami
💬

Belum ada diskusi

Jadilah yang pertama bertanya tentang artikel ini

Ada Pertanyaan? Konsultasi Gratis

Tim Culobo jawab dalam 24 jam. Mau belajar coding, bikin website, atau naikin SEO.

*Kami balas maksimal 1x24 jam di hari kerja