kemaren kita sudah membuat sebuah framework PHP sendiri dengan model MVC. Sekarang kita akan Membuat CRUD Dengan Framework sendiri, akan mimin contohkan dalam sebuah CRUD atau membuat aplikasi sederhana yang dapat melakukan manipulasi data seperti Cread Read Update dan Delete. Mimin anjurkan kalian juga telah membaca artikel sebelumnya, disana mimin membahas mengenai cara membuat framework dengan model MVC, kalian dapat menggunakan link tertaut di bawah
pastikan kalian juga telah membuat framework MVC dan memahami apa itu MVC, jika kalian ketinggalan mengenai pembahasan MVC, mimin juga pernah membahas mengenai MVC pada website ini, pada judul artikel “Mengenal OOP dan MVC dalam bahasa PHP“. Kalian dapat mengunjunginya pada link tertaut dibawah ini
Mengenal OOP dan MVC dalam bahasa PHP
sekarang dikira kalian sudah memahami, setidaknya kalian memiliki bayangan dan konsep mengenai MVC itu sendiri, berikutnya langsung kita ke pembahsan inti dari artikel ini yaitu Membuat CRUD Dengan Framework Sendiri MVC model. Sebagai contoh sederhana, mimin asumsikan sebagai temanya yaitu kita dapat melakukan Lihat, Tambah, Edit dan Hapus sebuah biodata. Didalam biodata tersebut ada berupa, nama, email dan nomer hp.
Cara Membuat CRUD Dengan Framework Sendiri Model MVC
Daftar Isi
Database
langkah pertama yang mimin lakukan yaitu membuat sebuah database. Mimin menggunakan database MySql, dengan nama table crud
-- phpMyAdmin SQL Dump -- version 5.1.1 -- https://www.phpmyadmin.net/ -- -- Host: 127.0.0.1 -- Generation Time: Apr 28, 2022 at 06:53 PM -- Server version: 10.4.21-MariaDB -- PHP Version: 7.4.23 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Database: `crud` -- -- -------------------------------------------------------- -- -- Table structure for table `biodata` -- CREATE TABLE `biodata` ( `id` int(11) NOT NULL, `nama` varchar(30) NOT NULL, `email` varchar(30) NOT NULL, `no_hp` varchar(13) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -- Dumping data for table `biodata` -- INSERT INTO `biodata` (`id`, `nama`, `email`, `no_hp`) VALUES (3, '122', '12@3333', '12'), (7, 'samsufdin', 'walluh@w', '0992'); -- -- Indexes for dumped tables -- -- -- Indexes for table `biodata` -- ALTER TABLE `biodata` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `biodata` -- ALTER TABLE `biodata` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
kalian dapat memasukkan code SQL di atas, dan kemudian setelah selesai diseleksi akan menghasilkan tabel seperti gambar dibawah ini

Config
berikutnya kita akan setting file config yang berada di app/config/config.php
<?php //base url define('BASEURL', 'http://localhost/crud'); define('SITEURL',$_SERVER['REQUEST_URI']); //db define('DB_HOST','localhost'); define('DB_USER','root'); define('DB_PASS',''); define('DB_NAME','crud'); $config['waktu'] = 'Asia/Kuala_Lumpur'; $config['session'] ='';
kalian masukkan base url sesuai dengan link kalian, kemudian databasenya sesuaikan dengan server kalain.
berikutnya set default controller yang nantinya akan diseleksi ketika pertama kali membuka aplikasi. Script ini berada pada file routes. app/config/routes.php
<?php //set Default Controller $route['default_controller'] = 'home';
mimin ingin mengarahkan secara default kedalam controller home ketika awal mula membuka aplikasi.
Untuk menampilkan/seleksi pertama ketika kita menuliskan atau memasukkan url semisal seperti localhost/crud. maka otomatis akan mengarah ke controller home sesuai yang disetting pada routes.php
Controller
berikutnya untuk controller mimin membuat 3 buat controller yaitu home.php, table.php dan about.php. Semua controller tersimpan pada folder app/controller.
home.php
<?php class Home extends Controller{ public function index() { $this->view('template/kepala'); $this->view('template/nav'); $this->view('home/index'); $this->view('template/kaki'); } }
about.php
<?php class About extends Controller{ public function index() { $this->view('template/kepala'); $this->view('template/nav'); $this->view('about/index'); $this->view('template/kaki'); } }
tabel.php
<?php class Tabel extends Controller{ public function index() { $this->view('template/kepala'); $this->view('template/nav'); $data['tampilkan']=$this->model('model_tabel')->tampilsemua(); $this->view('tabel/index',$data); $this->view('template/kaki'); } public function tambah(){ $this->view('template/kepala'); $this->view('template/nav'); $this->view('tabel/tambah'); $this->view('template/kaki'); } public function prosestambah(){ if($_POST['nama'] ==""){ echo "<script>alert('Nama tidak boleh kosong');history.go(-1);</script>"; }elseif($_POST['email'] ==""){ echo "<script>alert('Email tidak boleh kosong');history.go(-1);</script>"; }elseif($_POST['no_hp'] ==""){ echo "<script>alert('nomer hp tidak boleh kosong');history.go(-1);</script>"; }else{ if ($this->model('model_tabel')->simpan($_POST) >0) { echo "<script>alert('Data berhasil Tersimpan');;</script>"; echo '<script>window.location.href = "'.BASEURL.'/tabel";</script>'; }; } } public function edit($id){ $this->view('template/kepala'); $this->view('template/nav'); $data['tampil'] = $this->model('model_tabel')->tampiledit($id); $this->view('tabel/edit',$data); $this->view('template/kaki'); } public function prosesedit(){ if($this->model('model_tabel')->edit($_POST)>0){ echo "<script>alert('Data Berhasil teredit');</script>"; echo '<script>window.location.href = "'.BASEURL.'/tabel";</script>'; } } public function hapus($id){ if($this->model('model_tabel')->hapus($id)>0){ echo "<script>alert('Data Berhasil dihapus');</script>"; echo '<script>window.location.href = "'.BASEURL.'/tabel";</script>'; } } }
mimin mengulang sedikit, controller ini berfungsi untuk mengkontrol bagian view dengan model. untuk menampilkan/view menggunakan code $this->view(letak_view, nilai) untuk memasukkan model menggunakan code $this->model(letak_model)->function(nilai).
ketika halaman pertama kali dibuka maka function index akan yang pertama kali diseleksi.
sebagai contoh interaksi view dan model kita dapat melihat pada bagian controller tabel, bagian function index. Pada bagian tersebut mimin ingin menampilkan sebuah data pada tampilan tabel. Data tersebut ada pada database, maka untuk memanggil data tersebut menggunakan model. Untuk menggunakan model disini menggunakan code $this->model(letak_model)->function(nilai).
$data['tampilkan']=$this->model('model_tabel')->tampilsemua(); $this->view('tabel/index',$data);
pemanggilan model tersebut ditampung pada variabel $data[‘tampilkan’], agar dapat ditampikan pada view maka kita perlu melakukan parsing value. Cara melakukannya dangat mudah yaitu dengan $this->view(letak_view, nilai). sebagai contoh code diatas adalah $this->view(‘tabel/index’,$data);.
Maka nilai dari variabel $data akan dapat terkait kedalam view.
Model
berkutnya mimin membuat script model yang bertugas sebagai komunikasi antra aplikasi dengan database. Script ini terletak pada app/models. Mimin membuat sebuah file dengan nama model_tabel.php
<?php class model_tabel{ public function __construct() { $this->db = new Database; } //menampilkan data public function tampilsemua(){ $this->db->query("SELECT * FROM `biodata` "); return $this->db->resultSet(); } //menyimpan data ketika ditambah public function simpan($data){ $this->db->query("INSERT INTO `biodata` (`id`, `nama`, `email`, `no_hp`) VALUES (NULL, :nama, :email, :no_hp);"); $this->db->bind('nama',$data['nama']); $this->db->bind('email',$data['email']); $this->db->bind('no_hp',$data['no_hp']); $this->db->execute(); return $this->db->rowCount(); } //menampilkan edit public function tampiledit($id){ $this->db->query("SELECT * FROM `biodata` WHERE id=:id"); $this->db->bind('id',$id); return $this->db->single(); } //menyimpan data yang diedit public function edit($data){ $this->db->query("UPDATE `biodata` SET `nama` =:nama, `email` =:email, `no_hp` =:no_hp WHERE `biodata`.`id` =:id; "); $this->db->bind('nama',$data['nama']); $this->db->bind('email',$data['email']); $this->db->bind('no_hp',$data['no_hp']); $this->db->bind('id',$data['id']); $this->db->execute(); return $this->db->rowCount(); } //menghapus data yang dipilih public function hapus($id){ $this->db->query("DELETE FROM biodata WHERE id=:id"); $this->db->bind('id',$id); $this->db->execute(); return $this->db->rowCount(); } }
seperti halnya yang mimin sebutkan sebelumnya, model berfungsi untuk berinteraksi kedatabase. Isi dari model ini kalian dapat mengisinya mengenai quer dan berbagai function yang kalian gunakan untuk manipulasi data ke database.
salah satu contohnya yaitu
public function tampilsemua(){ $this->db->query("SELECT * FROM `biodata` "); return $this->db->resultSet(); }
pada function tampilsemua, mimin ingin menampilkan semua data dengan query SELECT * FROM biodata, yang berarti semua tidak terkecuali. Untuk menggunakan function ini, hanya dengan cara memanggil function ini di controller. seperti contoh sebelumnya pada controller tabel function index
public function index() { $this->view('template/kepala'); $this->view('template/nav'); $data['tampilkan']=$this->model('model_tabel')->tampilsemua(); $this->view('tabel/index',$data); $this->view('template/kaki'); }
pada bagian code $data[‘tampilkan’]=$this->model(‘model_tabel’)->tampilsemua(); untuk menggunakan function tampilsemua(). Seperti halnya strukturnya yaitu $this->model(letak_model)->function(nilai). untuk nilai jika kosong kalian tidak usah mengisinya biarkan saja kosong.
Untuk menampilkan/mendapatkan sebuah data data wajib return agar kembali kesemula.
untuk menggunakan associative array kalian dapat menggunakan function resultSet() untuk mengambil semua baris data dan function single() untuk salah satu baris data.
untuk menyeleksi query lainnya seperti tambah, edit hapus. kalian menggunakan cara yang sama. yaitu dengan menyeleksi query yang klaian inginkan, jika terdapat sebuah nilai yang divarsing untuk menghindarai SQL Injector kalian dapat bind data tersebut terlebih dahulu. Sebagai contoh
public function simpan($data){ $this->db->query("INSERT INTO `biodata` (`id`, `nama`, `email`, `no_hp`) VALUES (NULL, :nama, :email, :no_hp);"); $this->db->bind('nama',$data['nama']); $this->db->bind('email',$data['email']); $this->db->bind('no_hp',$data['no_hp']); $this->db->execute(); return $this->db->rowCount();
function diatas adalah untuk menyimpan data ketika kita melakukan tambah data. disini kita menggunakan data varsing dari variabel $_POST kemudian kita parsing ke variabel $data. Simpel yang tadinya $_POST[‘nama’] menjadi $data[‘nama’].
query yang harus kita gunakan “INSERT INTO biodata
(id
, nama
, email
, no_hp
) VALUES (NULL, :nama, :email, :no_hp);” untuk value kita harus menggunakan :nama_value. Karena untuk kita masukkan kedalam function bind.
untuk mengeksekusi query yang bersipat manipulasi seperti Tambah, Edit dan Hapus, menggunakan function execute().
View
untuk script view digunakan untuk membuat sebuah tampilan yang dapat digunakan oleh pengguna untuk berinteraksi terhadap aplikasi. Mimin membuat setiap menu memiliki folde, mimin membuat Home, tabel, about dan template.
Script View ini diletakkan pada app/view/folde_menu

untuk folder template mimin isi seperti komponen utama, seperti header, footer dan navigasi.
masing – masing didalam folder tersebut terdapat file diantranya

code dari masing masing script tersebut yaitu
app/views/template
kepala.php
<!DOCTYPE html> <html lang="en"> <head> <title>Contoh CRUD</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> </head> <body>
nav.php
<nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="#">Contoh CRUD Sederhana</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" aria-current="page" href="<?=BASEURL?>/home">Beranda</a> </li> <li class="nav-item"> <a class="nav-link" href="<?=BASEURL?>/about">About</a> </li> </ul> </div> </div> </nav>
kaki.php
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script> </body> </html>
pada bagian template ini, sederhanyanya struktur dan komponen utama pada script yang berpontensi digunakan berulang – ulang pada script lainnya, dibuat menjadi beberapa bagian. dan kemudian komponen tersebut tinggal masukkan jika dibutuhkan. kalian dapat melihatnya pada bagian controller
$this->view('template/kepala'); $this->view('template/nav'); ... $this->view('template/kaki');
bagian ini terdapat pada bagian function dengan menggunakan views yang sama, yangartinya jika dimasukkan kita akan eload bagian kepala.php, nav.php dan kaki.php dalam satu buah halaman.
untuk menambahkannya kalian sesuaikan dengan view kalian sendiri yang terletak pada /app/viws/folder_
code berikutnya pada controller lainnya
app/views/home
index.php
<div class="container"> <div class="row"> <div class="col"> <p> Selamat Datang diaplikasi CRUD Sederhana Ini </p> <br> <a class="btn btn-info" href="<?=BASEURL?>/tabel">MULAI</a> </div> </div> </div>
app/views/about
index.php
<div class="container"> <div class="row"> <div class="col"> <p> Kunjungi <a href="https://republiccode.com" target="_blank" rel="nofollow" title="Republic Code">republiccode.com</a> </p> <br> </div> </div> </div>
app/views/tabel
index.php
<div class="container"> <div class="row"> <div class="col"> <a class="btn btn-info" href="<?=BASEURL?>">Kembali</a> <a class="btn btn-info" href="<?=BASEURL?>/tabel/tambah">Tambah</a> <hr> <div class="card"> <div class="card-body"> <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Nama</th> <th scope="col">Email</th> <th scope="col">nomer HP</th> <th scope="col">NAV</th> </tr> </thead> <tbody> <?php $no =1; if(count($data['tampilkan'])>0){ foreach($data['tampilkan'] as $data){ ?> <tr> <td><?=$no++?></td> <td><?=$data['nama']?></td> <td><?=$data['email']?></td> <td><?=$data['no_hp']?></td> <td> <a href="<?=BASEURL?>/tabel/edit/<?=$data['id']?>">Edit</a> <a href="<?=BASEURL?>/tabel/hapus/<?=$data['id']?>" onclick="return confirm('Kamu yakin?')">Hapus</a> </td> </tr> <?php } }else{ ?> <tr> <td>Data Tidak Ada</td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> </div> </div>
untuk load beberapa baris data array assosiatif klaian dapat mengguakan perulangan foreach
foreach($data['tampilkan'] as $data){ .... }
$data[‘tampilkan’] ini adalah code yang dilakukan parsing variabel pada bagian controller.
Tambah.php
<div class="container"> <div class="row"> <h1>Tambah Data</h1> <div class="col"> <a href="<?=BASEURL?>/tabel" class="btn btn-info">Kembali</a> <a href="<?=BASEURL?>" class="btn btn-info">Kembali Ke Beranda</a> <div class="card"> <div class="card-body"> <form method="POST" action="<?=BASEURL?>/tabel/prosestambah"> <div class="mb-3"> <label for="nama" class="form-label">Nama</label> <input id="nama" name="nama" type="text" class="form-control" placeholder="Masukkan Nama" require> </div> <div class="mb-3"> <label for="email" class="form-label">Email</label> <input id="email" name="email" type="email" class="form-control" placeholder="Masukkan Email" require> </div> <div class="mb-3"> <label for="hp" class="form-label">Nomer HP</label> <input id="hp" name="no_hp" type="tel" class="form-control" placeholder="Masukkan Nomer HP"> </div> <div class="mb-3"> <input type="submit" value="simpan" class="btn btn-success"> </div> </form> </div> </div> </div> </div> </div>
Edit.php
<div class="container"> <div class="row"> <h1>Edit Data</h1> <div class="col"> <a href="<?=BASEURL?>/tabel" class="btn btn-info">Kembali</a> <a href="<?=BASEURL?>" class="btn btn-info">Kembali Ke Beranda</a> <div class="card"> <div class="card-body"> <form method="POST" action="<?=BASEURL?>/tabel/prosesedit"> <div class="mb-3"> <input type="hidden" name="id" value="<?=$data['tampil']['id']?>"> <label for="nama" class="form-label">Nama</label> <input value="<?=$data['tampil']['nama']?>" id="nama" name="nama" type="text" class="form-control" placeholder="Masukkan Nama" require> </div> <div class="mb-3"> <label for="email" class="form-label">Email</label> <input value="<?=$data['tampil']['email']?>" id="email" name="email" type="email" class="form-control" placeholder="Masukkan Email" require> </div> <div class="mb-3"> <label for="hp" class="form-label">Nomer HP</label> <input value="<?=$data['tampil']['no_hp']?>" id="hp" name="no_hp" type="tel" class="form-control" placeholder="Masukkan Nomer HP"> </div> <div class="mb-3"> <input type="submit" value="simpan" class="btn btn-success"> </div> </form> </div> </div> </div> </div> </div>
disini perbedaannya, jika kalian hanya meload satu barisdata array assosiatop, klaian tidak perlu menggunakan perulangan. klaian hanyya perlu menuliskan $variabel[array]. Pada code ini menggunakan variabel $data.
kita lihat ada controller tabel bagian function edit($id).
pada function ini memiliki value yang ditampung pada variebl $id yang kemudian dimasukkan kedalam function tampiledit pada model_tabel.
$data['tampil'] = $this->model('model_tabel')->tampiledit($id); $this->view('tabel/edit',$data);
data tersebut yang melakukan pengambilan data ditampung pada variabel $data[‘tampil’].
Berikutnya agar dapat digunakan pada view maka diparsinglah variabel $data tersebut kedalam function view. karena hanya menuliskan variabel $data maka semua variabel $data akan masuk kedalam views yang telah ditambahkan variabel tersebut. meskipun itu arraynya bukan tampil.
Pada variabel $data[‘tampil’] telah tertampung sebaris data array assosiatif yang telah kita dapatkan di database, yaitu nama, email dan nomer hp. untuk menampilkannya hanya perlu menuliskan $data[‘tampil’][‘fild_database];
Hasil dari program ini yaitu





sampai sini artikel mengenai Cara Membuat CRUD Dengan Framework Sendiri dengan model MVC. Jika ada yang kurang jelas atau yang ingin ditanyakan kalian dapat menggunakan kolom komentar atau dengan kontak mimin pada bagian hubungi kami. Semoga bermanfaat samapi jumpa pada artikel berikutnya