Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts

Wednesday, 10 December 2025

Sistem Produk Tambah Stok Tanpa Model di CodeIgniter 4 v4.6.3: Sederhana

Manajemen stok adalah salah satu fitur penting dalam aplikasi penjualan, inventori, atau gudang. Pada CodeIgniter 4, kita dapat membangun sistem produk dengan kemampuan untuk menambah stok secara fleksibel, baik melalui form input maupun melalui proses update otomatis. Artikel ini membahas langkah demi langkah membuat fitur tersebut: mulai dari struktur database, controller, hingga tampilan (view).

1. Struktur Database

Pertama, buat tabel products untuk menyimpan data produk dan stoknya.


CREATE TABLE products (
    id_product INT AUTO_INCREMENT PRIMARY KEY,
    kode_product VARCHAR(10)
    nama_product VARCHAR(50) NOT NULL,
    harga_ INT NOT NULL,
    stok INT NOT NULL DEFAULT 0
);


Kolom stok bertipe integer untuk menampung jumlah stok yang tersedia.

2. Membuat Controller Product

Controller akan menangani input pengguna, menampilkan halaman, serta melakukan proses tambah stok.

app/Controllers/Product.php



namespace App\Controllers;

class Product extends BaseController{

  protected $db;

  public function __construct(){
    $this->db = \Config\Database::connect();
  }

  public function index(): string{
    $product = $this->db->table('product')->get()->getResult();
    return view('product/index',['data'=>$product]);
  }

  public function simpan_product(){
    $kode = $this->request->getPost("kode_product");
    $nama = $this->request->getPost("nama_product");
    $harga = $this->request->getPost("harga");
    
    $cekKode = $this->db->table("product")
                        ->select("kode_product")
                        ->where("kode_product",$kode)
                        ->get()
                        ->getRow();
    
    if($cekKode !== null){
      $err = ['error'=>true, 'message'=>'kode product tidak valid !!'];
      return view("product/tambah",$err);
    }

    if($harga < 1 || $harga == ""){
      $err = ['error'=>true, 'message'=>'harga tidak boleh Nol "0" !!'];
      return view("product/tambah",$err);
    }

    //simpan
    $data = [
      "kode_product"=>$kode,
      "nama_product"=>$nama,
      "harga"=>$harga,
      "stok"=>0
    ];
    $this->db->table('product')->insert($data);

    return redirect()->to("product");
  }

  public function stok_tambah($err=null){
    $data['data'] = $this->db->table('product')->get()->getResult();
    if($err !== null){
      $data = array_merge($data,$err);
      return view('product/tambah-stok',$data);
    }
    return view('product/tambah-stok',$data);
  }

  public function stok_simpan(){
    $product = $this->request->getPost('id_product');
    $stok = $this->request->getPost('stok');

    //cek error
    if($product == 'n'){
      $err = ['error'=>true,'message'=>'Silahkan pilih kode product !!'];
      return $this->stok_tambah($err);
    }
    if($stok == '' || $stok < 1){
      $err = ['error'=>true,'message'=>'Inputkan Stok dengan benar !!'];
      return $this->stok_tambah($err);
    }
    
    //berhasil
    $data = [
      'stok'=>$stok
    ];
    $this->db->table('product')->set('stok','stok + '.$stok,false)
                              ->where('id_product',$product)
                              ->update();

    return redirect()->to('/product');
  }

}


Penjelasan:

  • index() : menampilkan data product
  • simpan_product() : menyimpan data product ke database
  • stok_tambah : menampilkan form tambah stok
  • stok_simpan() : mengupdate stok product berdasarkan kode product yang dipilih

3. Membuat View Daftar Produk 

app/Views/product/index.php 

4. Membuat View Form Tambah Stok

app/Views/product/add_stock.php 

Form ini hanya membutuhkan input angka untuk menambah stok produk.

5. Routing 

Tambahkan rute untuk controller product.

app/Config/Routes.php 


//products
$routes->get('/product', 'Product::index');
$routes->get('/product/tambah', function(){
  return view('product/tambah');
});
$routes->post('/product/simpan', 'Product::simpan_product');

//stok
$routes->get('/product/stok/tambah','Product::stok_tambah');
$routes->post('product/stok/simpan','Product::stok_simpan');

6. Membuat View Form tambah Product

app/Views/product/tambah.php 

7. Cara Kerja Sistem

Ketika admin ingin menambah stok:

  • Akses browser dengan endpoint `/product`
  • Klik tambah product, utuk menambahkan data product
  • Klik tambah stok, untuk mengubah stok product
  • Masukan jumlah stok sesuai kode product
  • sistem akan update stok product,stok lama akan ditambahkan dengan stok baru

Kesimpulan

Fitur ini dapat dikembangkan lebih lanjut, misalnya dengan catatan history stok, pengurangan stok otomatis saat transaksi, atau validasi lebih kompleks.

untuk melihat artikel lain, bisa klik Disini

  

Tuesday, 9 December 2025

Property Public Private Protected pada Class dan Penggunaannya dalam OOP PHP

Pemrograman PHP telah berkembang jauh dari sekadar bahasa scripting sederhana untuk membuat halaman web dinamis. Sejak diperkenalkannya PHP 5, konsep Object-Oriented Programming (OOP) menjadi bagian inti dalam pengembangannya. Dengan OOP, developer memiliki cara yang lebih terstruktur, rapi, dan modular dalam membangun aplikasi. Salah satu komponen penting dalam OOP PHP adalah property yang terdapat di dalam class.

Artikel ini akan membahas secara detail apa itu property, bagaimana penggunaannya, berbagai kasus yang muncul terkait property, dan bagaimana mengatasinya dengan pendekatan yang baik.

Apa Itu Property dalam PHP? 

Dalam PHP, property adalah variabel yang didefinisikan di dalam sebuah class. Property digunakan untuk menyimpan data atau state dari objek. Setiap objek yang dibuat dari class tersebut akan memiliki property sendiri, kecuali property bersifat static.

Contoh dasar:


class Mobil {
    public $merk;
    public $warna;
}

Pada contoh ini, merk dan warna adalah property class Mobil. Ketika kita membuat objek baru dari class tersebut, masing-masing objek dapat memiliki nilai property yang berbeda.

Jenis-Jenis Visibility Property 

Untuk mengontrol akses terhadap property, PHP menyediakan tiga tingkat visibility:

  • public – dapat diakses dari mana saja (di dalam class, objek, dan luar class).
  • protected – hanya dapat diakses dari dalam class dan turunannya.
  • private – hanya dapat diakses dari dalam class itu sendiri.

Contoh:


class User {
    public $nama;
    protected $email;
    private $password;
}

Dengan aturan ini, PHP memastikan keamanan data serta menjaga agar struktur kode tetap bersih dan terkendali.

Kasus Umum yang Terjadi pada Property dalam PHP

1. Property Tidak Terdefinisi (Undefined Property)

Kasus paling umum adalah pesan error seperti:


Notice: Undefined property: User::$email

Ini terjadi ketika Anda mencoba mengakses property yang tidak pernah dideklarasikan atau salah penulisan. Contoh salah:


$user = new User();
echo $user->emali; // Typo: "emali"

Cara mengatasinya tentu dengan memastikan nama property sudah benar dan dideklarasikan dalam class.

2. Mengakses Property Private atau Protected dari Luar Class 

Kesalahan lain yang sering muncul:


Fatal error: Uncaught Error: Cannot access protected property User::$email

Ini terjadi ketika developer mencoba mengakses property yang tidak bersifat public. Solusinya adalah menggunakan getter dan setter.


class User {
    protected $email;

    public function setEmail($email) {
        $this->email = $email;
    }

    public function getEmail() {
        return $this->email;
    }
}

3. Property Belum Diinisialisasi (Typed Property Error)

Sejak PHP 7.4, property dapat diberikan tipe data (typed property). Jika property tersebut digunakan sebelum diberi nilai, PHP akan menampilkan error. Contoh:


class Produk {
    public int $stok;
}

$p = new Produk();
echo $p->stok; // Error: uninitialized property

Untuk mengatasi hal ini, property harus diberi nilai default atau diinisialisasi dalam constructor:


public int $stok = 0;

Atau:


public function __construct() {
    $this->stok = 0;
}

Best Practice Mengelola Property dalam Class PHP

1. Gunakan Encapsulation

Selalu jaga property tetap private atau protected, kemudian akses menggunakan getter dan setter. Ini mencegah manipulasi langsung yang dapat merusak konsistensi data.

2. Gunakan Typed Property

Typed property membantu mencegah kesalahan tipe data, terutama pada aplikasi besar:


public string $judul;
public float $harga;

3. Inisialisasi Property dalam Constructor

Constructor memastikan setiap objek memiliki nilai awal yang benar.


public function __construct($nama, $email) {
    $this->nama = $nama;
    $this->email = $email;
}

4. Hindari Property yang Tidak Digunakan

Property yang terlalu banyak dapat membuat class membingungkan dan rentan terhadap error.

Kesimpulan 

Property dalam class PHP adalah elemen fundamental dari konsep Object-Oriented Programming. Dengan memahami cara kerjanya, aturan visibility, serta kasus-kasus umum yang sering terjadi, Anda akan dapat membangun aplikasi yang lebih rapi, aman, dan mudah dipelihara. PHP modern menawarkan fitur-fitur seperti typed property, constructor, dan encapsulation yang membantu developer mengelola property dengan lebih baik.

Dengan pemahaman yang kuat tentang property, Anda dapat membuat class yang lebih efisien, jelas, dan profesional dalam pengembangan aplikasi berbasis PHP.

Untuk melihat artikel lain bisa klik Disini 

Saturday, 6 December 2025

Sistem Login dan Register di CodeIgniter 4 versi v4.6.3

 

CodeIgniter 4 merupakan salah satu framework PHP yang ringan, cepat, dan mudah digunakan. Salah satu kebutuhan utama dalam membangun aplikasi web adalah fitur login dan register sebagai pintu gerbang autentikasi pengguna. Pada artikel ini, kita akan membahas langkah-langkah lengkap untuk membuat sistem login dan register sederhana dengan CodeIgniter 4, mulai dari konfigurasi awal, pembuatan model, controller, hingga pembuatan tampilan. Tutorial ini cocok untuk pemula yang ingin memahami dasar autentikasi di CodeIgniter 4.

1. Persiapan Proyek CodeIgniter 4

Sebelum memulai, pastikan CodeIgniter 4 sudah terinstal. Kamu bisa menginstalnya menggunakan composer dengan perintah:


composer create-project codeigniter4/appstarter ci4-login

Setelah itu, jalankan server lokal:


php spark serve

Jika CodeIgniter sudah berjalan, kita siap masuk ke pembuatan fitur login dan register.

2. Membuat Tabel User di Database


CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Pada kolom password, kita akan menyimpan password yang telah di-hash agar lebih aman.

3. Konfigurasi Koneksi Database

Buka file: app/Config/Database.php

Sesuaikan dengan konfigurasi lokalmu:


public $default = [
    'DSN'      => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'ci4_auth',
    'DBDriver' => 'MySQLi',
];

4. Membuat Model User

Model digunakan untuk berinteraksi dengan tabel users.

Buat file baru: app/Models/UserModel.php 


namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table            = 'users';
    protected $primaryKey       = 'id';
    protected $useAutoIncrement = true;
    protected $returnType       = 'array';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = ['username', 'email', 'password'];

    protected bool $allowEmptyInserts = false;
    protected bool $updateOnlyChanged = true;

    protected array $casts = [];
    protected array $castHandlers = [];

    // Dates
    protected $useTimestamps = false;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';

    // Validation
    protected $validationRules      = [];
    protected $validationMessages   = [];
    protected $skipValidation       = false;
    protected $cleanValidationRules = true;

    // Callbacks
    protected $allowCallbacks = true;
    protected $beforeInsert   = [];
    protected $afterInsert    = [];
    protected $beforeUpdate   = [];
    protected $afterUpdate    = [];
    protected $beforeFind     = [];
    protected $afterFind      = [];
    protected $beforeDelete   = [];
    protected $afterDelete    = [];
}

5. Membuat Controller Auth

Controller ini akan mengatur register, login, dan logout.

Buat file: app/Controllers/Auth.php 

Register:


public function register()
{
    return view('auth/register');
}

public function saveRegister(){
	$userModel = new UserModel();
		
	$cekUsername = $userModel->where('username', $this->request->getPost('username'))->first();
	$cekEmail = $userModel->where('email', $this->request->getPost('email'))->first();

	if ($cekUsername) {
		return redirect()->back()->with('error', 'Username sudah digunakan!');
	}
	if ($cekEmail) {
		return redirect()->back()->with('error', 'Email sudah digunakan!');
	}

	$data = [
    	'username' => $this->request->getPost('username'),
		'email'    => $this->request->getPost('email'),
		'password' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
	];

	$userModel->insert($data);

	return redirect()->to('/login')->with('success', 'Register berhasil!');
}

Login:


public function login()
{
    return view('auth/login');
}

public function doLogin(){
	$session = session();
	$userModel = new UserModel();

	$email = $this->request->getPost('email');
	$password = $this->request->getPost('password');

	$user = $userModel->where('email', $email)->first();

	if ($user) {
		if (password_verify($password, $user['password'])) {
			$session->set([
				'user_id'  => $user['id'],
				'username' => $user['username'],
				'logged_in'=> true
			]);
			return redirect()->to('/');
		} else {
			return redirect()->back()->with('error', 'Password salah!');
		}
	} else {
		return redirect()->back()->with('error', 'Email tidak ditemukan!');
	}
}

Logout:


public function logout()
{
    session()->destroy();
    return redirect()->to('/login');
}

6. Membuat Tampilan Register dan Login

Tampilan Register: app/Views/auth/register.php 

Tampilan Login: app/Views/auth/login.php

7. Membuat Controller Home


namespace App\Controllers;

use App\Libraries\ResponseApi;

class Home extends BaseController{

  public function index(){   
    if(!session()->get('logged_in')){
      return redirect()->to('/login');
    } 
    return view('home');
  }
  
}

Tambahkan file home.php pada View/home.php: 

8. Menambahkan Routing

Tambahkan ke file app/Config/Routes.php:



$routes->get('/', 'Home::index');
$routes->get('/register', 'Auth::register');
$routes->post('/save-register', 'Auth::saveRegister');

$routes->get('/login', 'Auth::login');
$routes->post('/do-login', 'Auth::doLogin');

$routes->get('/logout', 'Auth::logout');


Kesimpulan

Membangun sistem login dan register di CodeIgniter 4 cukup mudah dan terstruktur. Dengan memanfaatkan fitur bawaan seperti Model, Controller, dan View, kita dapat membuat autentikasi yang aman menggunakan hash password. Sistem sederhana ini bisa dikembangkan menjadi lebih kompleks, seperti verifikasi email, reset password, atau penerapan role dan level akses pengguna. 

Untuk melihat artikel yang lain, bisa klik Disini 

Monday, 17 November 2025

Tutorial Routing di CodeIgniter 4 Basic hingga Advanced

 

Routing merupakan salah satu bagian terpenting dalam pengembangan aplikasi web menggunakan CodeIgniter 4. Dengan routing, kita dapat menentukan bagaimana sebuah URL dipetakan ke controller atau aksi tertentu. Tanpa routing yang tepat, aplikasi bisa menjadi tidak terstruktur, sulit dipelihara, dan rawan error. Pada artikel ini, kita akan membahas routing di CodeIgniter 4 mulai dari konsep dasar hingga penggunaan tingkat lanjut.

Apa Itu Routing di CodeIgniter 4? 

Routing adalah proses yang menghubungkan permintaan (request) dari user ke fungsi atau controller yang sesuai. Misalnya, ketika pengguna membuka URL example.com/home, maka router akan meneruskan permintaan itu ke controller Home dan menjalankan function index().

CodeIgniter 4 menggunakan file app/Config/Routes.php sebagai tempat utama untuk mendefinisikan semua route.

1. Routing Dasar (Basic Routing) 

    a. Route ke Controller

Contoh sederhana routing di CodeIgniter 4:


$routes->get('/', 'Home::index');

Kode tersebut berarti ketika pengguna mengakses URL root /, maka controller Home dengan method index() akan dijalankan.

    b. Route dengan Parameter

Kita juga dapat menangkap parameter dari URL:


$routes->get('blog/(:any)','Blog::detail/$1');

Penjelasan:

  • (:any) menangkap segalanya (string bebas) 
  • $1 merujuk ke parameter pertama

Contoh penggunaan:
example.com/blog/tutorial-codeigniter → diarahkan ke Blog::detail("tutorial-codeigniter") 

    c. Routing POST 

Untuk request POST:


$routes->post('user/login', 'User::login');

Ini berguna untuk form login, upload, atau proses lainnya.

2. Routing dengan Jenis Segment

CodeIgniter 4 menyediakan beberapa jenis wildcard:

 

Wildcard Fungsi
(:any) Menerima semua karakter
(:segment) Menerima segment URL tanpa slash
(:num) Hanya angka
(:alpha) Hanya huruf
(:alphanum) Huruf dan angka

Contoh:


$routes->get('product/(:num)', 'Product::detail/$1');

URL: /product/12 → OK
URL: /product/abc → Tidak cocok  

3. Routing ke Closure (Tanpa Controller)

Routing juga bisa langsung mengeksekusi function:


$routes->get('hello', function() {
	return "Hello World!"
});

Ini berguna untuk testing atau endpoint sederhana.

4. Route Grouping (Pengelompokan Route)

Untuk aplikasi besar, grouping sangat membantu menjaga kerapian. Contoh grouping:


$routes->group('admin', function($routes) {
	$routes->get('dashboard', 'Admin\Dashboard::index');
    $routes->get('users', 'Admin\Users::index');
})

Hasil URL:

  • /admin/dashboard
  • /admin/users  

Dengan grouping, struktur menjadi lebih rapi dan mudah dikelola.

5. Routing dengan Filter

Filter digunakan untuk validasi sebelum sebuah route dieksekusi, seperti autentikasi. Contoh:


$routes->group('admin', ['filter' => 'auth'], function($routes){
	$routes->get('panel', 'Admin\Panel::index');
});

Artinya: Semua route dalam grup admin harus melewati filter auth terlebih dahulu. ini sangat berguna untuk membuat sistem login. 

6. Auto Routing (Legacy & Improved)

CodeIgniter 4 menyediakan auto routing, tetapi penggunaannya harus hati-hati.

    a. Auto Routing Improved (Direkomendasikan)  

Aktifkan di App/Config/Feature.php


public bool $autoRoutesImproved = true;

Dengan fitur ini, URL otomatis mencocokkan controller tanpa deklarasi route.

    b. Auto Routing Legacy (Tidak Disarankan) 

egacy auto routing rawan celah keamanan dan beberapa fungsi tidak terkunci dengan baik.

7. Routing REST API

Membuat route untuk API sangat mudah:


$routes->resource('users');

Ini otomatis membuat route berikut:

  • GET /users
  • POST /users
  • GET /users/(:num)
  • PUT /users/(:num)
  • DELETE /users/(:num)

Fitur ini sangat membantu dalam pembuatan REST API secara cepat.

Kesimpulan

Routing di CodeIgniter 4 menawarkan fleksibilitas tinggi dan kemudahan dalam pengaturan arus navigasi aplikasi. Mulai dari routing dasar ke controller, penggunaan parameter, grouping, filter, hingga REST API, semuanya dirancang untuk memudahkan developer dalam membangun aplikasi yang cepat, aman, dan terstruktur.

Dengan memahami routing secara menyeluruh, proses pengembangan aplikasi akan menjadi lebih efisien dan mudah dipelihara. Jika kamu sedang membangun aplikasi berskala besar, penggunaan grouping dan filter sangat disarankan untuk menjaga kerapian dan keamanan struktur aplikasi. Hal lain yang perlu diperhatikan adalah penggunaan auto routing improved sebagai pengganti legacy demi keamanan aplikasi.  

untuk melihat artikel lain tentang Codeigniter 4 atau 3 bisa dilihat Disini

Membuat Middleware Sederhana dengan CodeIgniter 4


 

Dalam pengembangan aplikasi web modern, middleware menjadi komponen penting untuk menangani proses yang perlu dijalankan sebelum atau sesudah sebuah request diproses oleh controller. CodeIgniter 4, sebagai versi terbaru dari framework PHP populer ini, telah menyediakan fitur middleware (disebut Filters) yang memudahkan developer mengelola autentikasi, logging, pembatasan akses, dan berbagai kebutuhan pre-processing lainnya.

Pada artikel ini, kita akan membahas langkah-langkah membuat middleware sederhana di CodeIgniter 4, mulai dari struktur dasar hingga implementasinya.

Apa itu Middleware (Filter) di CodeIgniter 4?

Secara sederhana, middleware atau filter adalah lapisan yang menangani proses tertentu sebelum request diteruskan ke controller atau setelah controller menyelesaikan prosesnya. Filter ini dapat digunakan untuk:

  •  Memeriksa status login pengguna.
  •  Membatasi akses berdasarkan role.
  •  Logging aktivitas user.
  •  Menambahkan header khusus pada response.
  •  Mengamankan API.

CodeIgniter 4 menyediakan struktur filter yang mudah digunakan dan sangat fleksibel.

Langkah 1: Membuat Filter Baru 

CodeIgniter menyediakan perintah CLI untuk membuat filter dengan cepat, tetapi kita juga bisa melakukannya secara manual. 

Membuat file filter 

Buat file baru di: app/Filters/AuthFilter.php
Isi dengan kode berikut:

 

Filter di atas akan mengecek apakah session logged_in ada. Jika tidak, pengguna diarahkan ke halaman login. 

Langkah 2: Mendaftarkan Filter ke Config 

Agar filter bisa digunakan, kita harus mendaftarkannya ke file konfigurasi filter.

Buka file: app/Config/Filters.php
Tambahkan filter yang baru kita buat: 

 

Dengan begitu, filter kita sudah memiliki alias auth dan dapat digunakan pada route atau global filter.

Langkah 3: Membuat controller 

Buat controller pada folder controller misal Home.php isinya seperi ini:

 

Langkah 4: Menggunakan Filter pada Route

Filter bisa diterapkan pada route tertentu atau grup route. Contoh: menerapkan filter ke satu route.


$routes->get('/dashboard','Dashboard::index', ['filter'=> 'auth']);

Setiap kali route /dashboard diakses, filter auth akan dijalankan terlebih dahulu.

Contoh: menerapkan filter ke grup route


$routes->group('admin', ['filter'=> 'auth'],function($routes) {
	$routes->get('users','Admin\Users::index');
    $routes->get('settings','Admin\Settings::index');
});

Semua route dalam grup admin akan terlindungi oleh filter autentikasi.

untuk file routes.php jadi seperti ini

coba cek akses pada browser dengan mengakses localhost:8080/dashboard secara langsung maka akan di arahkan ke route login. selanjutnya coba buat session terlebih dahulu dengan mengakses route localhost:8080/create-session setelah itu coba akses lagi halaman dashboard maka akan berhasil.

Kesimpulan 

Middleware atau filter di CodeIgniter 4 merupakan fitur yang sangat bermanfaat untuk menangani proses yang harus dijalankan sebelum atau sesudah request diproses. Dengan filter, Anda bisa membuat logika autentikasi, pengamanan API, logging, dan berbagai kebutuhan lain dengan lebih rapi dan terstruktur.

Pada artikel ini, kita telah membahas:

  •  Cara membuat filter sederhana
  •  Cara mendaftarkan filter ke konfigurasi
  •  Cara menggunakannya pada route dan group route

Dengan memahami konsep ini, Anda dapat membangun aplikasi yang lebih aman, terorganisir, dan mudah dirawat.

untuk mmelihat artikel lain yang bersangkutan dengan Codeigniter, bisa dilihat disini.