Cara Membuat Pencarian Dengan PHP dan AJAK
Assalamu'alaikum....
Pada kesempatan yang berbahagia ini. Saya akan coba share tutorial mengenai cara membuat pencarian plus pagination tanpa refresh halaman dengan PHP, MySQL dan AJAX. Kebetulan beberapa hari yang lalu ada salah seorang pengunjung blog saya ini yang meminta kepada saya untuk menggabungkan 2 tutorial saya sebelumnya yakni Cara Membuat Pencarian Tanpa Refresh Halaman dengan PHP dan AJAX danCara Mudah Membuat Pagination dengan PHP dan MySQL. Tentunya disini kita akan menggunakan library JQUERY untuk membuat kode AJAX nya. Disini juga saya menggunakan Bootstrap untuk desain nya, biar sedikit enak dipandang hehe. Tapi bootstrap ini hanya opsional, jadi jika kalian tidak ingin menggunakannya bisa di hapus saja. Langsung ikut saja langkah-langkahnya dibawah ini.
STEP 1 – PERSIAPANBerikut ini adalah hal-hal yang harus dipersiapkan :
- Download JQUERY, klik link berikut :Download.
- Download Bootstrap, klik link berikut :Download.
- Buat sebuah folder baru dengan namasearch_pagination, lalu simpan pada folder xampp/htdocs/.
- Buat sebuah folder dengan nama css, lalu simpan pada folderxampp/htdocs/search_pagination/.
- Buat sebuah folder dengan nama js, lalu simpan pada folderxampp/htdocs/search_pagination/.
- Esktrak file bootstrap.7z yang telah didownload tadi.
- Copy and paste folder fonts dari folder bootstrap yang telah diekstrak tadi ke folderxampp/htdocs/search_pagination/.
- Copy and paste file bootstrap.min.cssdari folder bootstrap/css/ yang telah diekstrak tadi ke folderxampp/htdocs/search_pagination/css/.
- Copy and paste file bootstrap.min.jsdari folder bootstrap/js/ yang telah diekstrak tadi ke folderxampp/htdocs/search_pagination/js/.
- Rename file JQUERY yang telah di download tadi menjadi jquery.min.js, lalu copy and paste pada folderxampp/htdocs/search_pagination/js/.
STEP 2 – DATABASEPada step ini, kita akan membuat databasenya. ikuti langkah-langkah berikut ini :
- Buat sebuah database dengan nama mynotescode.
- Buat sebuah tabel dengan nama siswa. Struktur tabelnya sebagai berikut :

- CREATE TABLE IF NOT EXISTS `siswa` (
- `nis` varchar(11) NOT NULL,
- `nama` varchar(50) NOT NULL,
- `jenis_kelamin` varchar(10) NOT NULL,
- `telp` varchar(15) NOT NULL,
- `alamat` text NOT NULL,
- PRIMARY KEY (`nis`)
- )
STEP 3 – KONEKSI DATABASEPada step ini, kita akan membuat file koneksi.php yang berfungsi untuk menghubungkan dengan database MySQL. Silahkan buat file koneksi.php, lalu simpan di folderxampp/htdocs/search_pagination/. Berikut ini kodenya :
- <?php
- $host = 'localhost'; // Nama hostnya
- $username = 'root'; // Username
- $password = ''; // Password (Isi jika menggunakan password)
- $database = 'mynotescode'; // Nama databasenya
- // Koneksi ke MySQL dengan PDO
- $pdo = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
- ?>
STEP 4 – VIEWLangkah selanjutnya adalah membuat 1 buah file yang berguna sebagai template utamanya. Buat sebuah file dengan namaindex.php, lalu simpan pada folderxampp/htdocs/search_pagination/. Berikut tampilan dan kodenya :

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Pencarian Plus Pagination Dengan PHP dan AJAX</title>
- <!-- Load File bootstrap.min.css yang ada difolder css -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
- <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
- <![endif]-->
- <style>
- .align-middle{
- vertical-align: middle !important;
- }
- </style>
- </head>
- <body>
- <div style="padding: 0 15px;">
- <h2>Pencarian Plus Pagination</h2><hr>
- <!--
- -- Buat sebuah div dengan class row
- -- class row ini berfungsi untuk membagi-bagi layar
- -- di dalam bootstrap, 1 layar penuh (dari kiri ke kanan) dibagi menjadi 12 bagian / Kolom
- -- Atau lebih tepatnya sering disebut dengan GRID
- -- col-xs-12 artinya jika ukuran layar < 768px, maka gunakan 12 kolom
- -- col-sm-6 artinya jika ukuran layar >= 768px, maka gunakan 6 kolom
- -- Untuk lebih jelasnya soal Grid, silahkan buka link ini : http://viid.me/qb4V8P
- -->
- <div class="row">
- <div class="col-xs-12 col-sm-6">
- <!--
- -- Input Group adalah salah satu komponen yang disediakan bootstrap
- -- Untuk lebih jelasnya soal Input Group, silahkan buka link ini : http://viid.me/qb4Mup
- -->
- <div class="input-group">
- <!-- Buat sebuah textbox dan beri id keyword -->
- <input type="text" class="form-control" placeholder="Pencarian..." id="keyword">
- <span class="input-group-btn">
- <!-- Buat sebuah tombol search dan beri id btn-search -->
- <button class="btn btn-primary" type="button" id="btn-search">SEARCH</button>
- <a href="" class="btn btn-warning">RESET</a>
- </span>
- </div>
- </div>
- </div>
- <br>
- <!--
- -- Beri atribut id="view" pada tag div yang akan digunakan untuk menampung data
- -- yang ada pada tabel siswa di database dan paginationnya
- -->
- <div id="view"><?php include "view.php"; ?></div>
- </div>
- <!-- Load File jquery.min.js yang ada difolder js -->
- <script src="js/jquery.min.js"></script>
- <!-- Load File bootstrap.min.js yang ada difolder js -->
- <script src="js/bootstrap.min.js"></script>
- <!-- Load file ajax.js yang ada di folder js -->
- <script src="js/ajax.js"></script>
- </body>
- </html>
Pada kode diatas, kita akan me-load librari / plugin yang dibutuh kan seperti Jquery dan Bootstrap. Dan kita juga me-load sebuah file ajax.js yang akan kita buat pada langkah selanjutnya.
Kemudian pada kode index.php diatas, disitu terdapat kode <?php include “view.php”; ?>, Kode tersebut berfungsi untuk me-load file view.php yang isinya adalah tabel yang menampung data dari hasil query ke tabel siswa di database. Sekarang kita akan coba buat file tersebut. Buat sebuah file dengan namaview.php, lalu simpan pada folderxampp/htdocs/search_pagination/. Berikut kodenya :
- <div class="table-responsive">
- <table class="table table-bordered">
- <tr>
- <th>NO</th>
- <th>NIS</th>
- <th>NAMA</th>
- <th>JENIS KELAMIN</th>
- <th>TELP</th>
- <th>ALAMAT</th>
- </tr>
- <?php
- // Include / load file koneksi.php
- include "koneksi.php";
- // Cek apakah terdapat data page pada URL
- $page = (isset($_POST['page']))? $_POST['page'] : 1;
- $limit = 5; // Jumlah data per halamannya
- $no = (($page - 1) * $limit) + 1; // Untuk setting awal nomor pada halaman yang aktif
- // Untuk menentukan dari data ke berapa yang akan ditampilkan pada tabel yang ada di database
- $limit_start = ($page - 1) * $limit;
- // Cek apakah variabel data search tersedia
- // Artinya cek apakah user telah mengklik tombol search atau belum
- if(isset($_POST['search']) && $_POST['search'] == true){ // Jika ada data search yg dikirim (user telah mengklik tombol search) dan search sama dengan true
- // variabel $keyword ini berasal dari file search.php,
- // dimana isinya adalah apa yang diinput oleh user pada textbox pencarian
- $param = '%'.$keyword.'%';
- // Buat query untuk menampilkan data siswa berdasarkan NIS / Nama / Jenis Kelamin / Telp / Alamat
- // dan sesuai limit yang ditentukan
- $sql = $pdo->prepare("SELECT * FROM siswa WHERE nis LIKE :ni OR nama LIKE :na OR jenis_kelamin LIKE :jk OR telp LIKE :t OR alamat LIKE :a LIMIT ".$limit_start.",".$limit);
- $sql->bindParam(':ni', $param);
- $sql->bindParam(':na', $param);
- $sql->bindParam(':jk', $param);
- $sql->bindParam(':t', $param);
- $sql->bindParam(':a', $param);
- $sql->execute(); // Eksekusi querynya
- // Buat query untuk menghitung semua jumlah data
- // dengan keyword yang telah di input
- $sql2 = $pdo->prepare("SELECT COUNT(*) AS jumlah FROM siswa WHERE nis LIKE :ni OR nama LIKE :na OR jenis_kelamin LIKE :jk OR telp LIKE :t OR alamat LIKE :a");
- $sql2->bindParam(':ni', $param);
- $sql2->bindParam(':na', $param);
- $sql2->bindParam(':jk', $param);
- $sql2->bindParam(':t', $param);
- $sql2->bindParam(':a', $param);
- $sql2->execute(); // Eksekusi querynya
- $get_jumlah = $sql2->fetch();
- }else{ // Jika user belum mengklik tombol search (PROSES TANPA AJAX)
- // Buat query untuk menampilkan semua data siswa
- $sql = $pdo->prepare("SELECT * FROM siswa LIMIT ".$limit_start.",".$limit);
- $sql->execute(); // Eksekusi querynya
- // Buat query untuk menghitung semua jumlah data
- $sql2 = $pdo->prepare("SELECT COUNT(*) AS jumlah FROM siswa");
- $sql2->execute(); // Eksekusi querynya
- $get_jumlah = $sql2->fetch();
- }
- while($data = $sql->fetch()){ // Ambil semua data dari hasil eksekusi $sql
- ?>
- <tr>
- <td class="align-middle"><?php echo $no; ?></td>
- <td class="align-middle"><?php echo $data['nis']; ?></td>
- <td class="align-middle"><?php echo $data['nama']; ?></td>
- <td class="align-middle"><?php echo $data['jenis_kelamin']; ?></td>
- <td class="align-middle"><?php echo $data['telp']; ?></td>
- <td class="align-middle"><?php echo $data['alamat']; ?></td>
- </tr>
- <?php
- $no++;
- }
- ?>
- </table>
- </div>
- <?php
- if($sql->rowCount() > 0){ // Jika datanya ada, tampilkan paginationnya
- ?>
- <!--
- -- Buat Paginationnya
- -- Dengan bootstrap, kita jadi dimudahkan untuk membuat tombol-tombol pagination dengan design yang bagus tentunya
- -->
- <ul class="pagination">
- <!-- LINK FIRST AND PREV -->
- <?php
- if($page == 1){ // Jika page adalah page ke 1, maka disable link PREV
- ?>
- <li class="disabled"><a href="#">First</a></li>
- <li class="disabled"><a href="#">«</a></li>
- <?php
- }else{ // Jika page bukan page ke 1
- $link_prev = ($page > 1)? $page - 1 : 1;
- ?>
- <li><a href="javascript:void(0);" onclick="searchWithPagination(1, false)">First</a></li>
- <li><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $link_prev; ?>, false)">«</a></li>
- <?php
- }
- ?>
- <!-- LINK NUMBER -->
- <?php
- $jumlah_page = ceil($get_jumlah['jumlah'] / $limit); // Hitung jumlah halamannya
- $jumlah_number = 3; // Tentukan jumlah link number sebelum dan sesudah page yang aktif
- $start_number = ($page > $jumlah_number)? $page - $jumlah_number : 1; // Untuk awal link number
- $end_number = ($page < ($jumlah_page - $jumlah_number))? $page + $jumlah_number : $jumlah_page; // Untuk akhir link number
- for($i = $start_number; $i <= $end_number; $i++){
- $link_active = ($page == $i)? ' class="active"' : '';
- ?>
- <li<?php echo $link_active; ?>><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $i; ?>, false)"><?php echo $i; ?></a></li>
- <?php
- }
- ?>
- <!-- LINK NEXT AND LAST -->
- <?php
- // Jika page sama dengan jumlah page, maka disable link NEXT nya
- // Artinya page tersebut adalah page terakhir
- if($page == $jumlah_page){ // Jika page terakhir
- ?>
- <li class="disabled"><a href="#">»</a></li>
- <li class="disabled"><a href="#">Last</a></li>
- <?php
- }else{ // Jika Bukan page terakhir
- $link_next = ($page < $jumlah_page)? $page + 1 : $jumlah_page;
- ?>
- <li><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $link_next; ?>, false)">»</a></li>
- <li><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $jumlah_page; ?>, false)">Last</a></li>
- <?php
- }
- ?>
- </ul>
- <?php
- }
- ?>
Saya akan coba jelaskan sedikit mengenai kode diatas karena sebagian sudah saya jelaskan pada tiap-tiap kode dengan komentar.
include “koneksi.php”;
Kode tersebut berfungsi untuk me-load file koneksi.php.
Kode tersebut berfungsi untuk me-load file koneksi.php.
$sql = $pdo->prepare(“SELECT * FROM siswa WHERE nis LIKE :ni OR nama LIKE :na OR jenis_kelamin LIKE :jk OR telp LIKE :t OR alamat LIKE :a”);
$sql->bindParam(‘:ni’, $param);
$sql->bindParam(‘:na’, $param);
$sql->bindParam(‘:jk’, $param);
$sql->bindParam(‘:t’, $param);
$sql->bindParam(‘:a’, $param);
$sql->execute();
Kode tersebut berfungsi untuk melakukan query ke database dan mengeksekusinya. Pada contoh diatas, kita akan melakukan query untuk menampilkan data siswa berdasarkan salah satu komponen (Berdasarkan NIS / Nama / Jenis Kelamin / Nomor Telepon / Alamat).
$sql->bindParam(‘:ni’, $param);
$sql->bindParam(‘:na’, $param);
$sql->bindParam(‘:jk’, $param);
$sql->bindParam(‘:t’, $param);
$sql->bindParam(‘:a’, $param);
$sql->execute();
Kode tersebut berfungsi untuk melakukan query ke database dan mengeksekusinya. Pada contoh diatas, kita akan melakukan query untuk menampilkan data siswa berdasarkan salah satu komponen (Berdasarkan NIS / Nama / Jenis Kelamin / Nomor Telepon / Alamat).
$sql = $pdo->prepare(“SELECT * FROM siswa”);
$sql->execute();
Sama seperti kode sebelumnya, hanya kode ini berguna untuk menampilkan semua data dari tabel siswa.
$sql->execute();
Sama seperti kode sebelumnya, hanya kode ini berguna untuk menampilkan semua data dari tabel siswa.
$data = $sql->fetch()
Kode tersebut berfungsi untuk mengambil semua data hasil query dan menampung data-data tersebut di dalam sebuah array lalu menyimpannya ke dalam variabel$data. Kode tersebut saya simpan di dalam sebuah kode while(….) yang berfungsi untuk melakukan proses perulangan sampai data terkahir dengan tujuan agar kita bisa menampilkan datanya satu per satu.
Kode tersebut berfungsi untuk mengambil semua data hasil query dan menampung data-data tersebut di dalam sebuah array lalu menyimpannya ke dalam variabel$data. Kode tersebut saya simpan di dalam sebuah kode while(….) yang berfungsi untuk melakukan proses perulangan sampai data terkahir dengan tujuan agar kita bisa menampilkan datanya satu per satu.
- <tr>
- <td class="align-middle"><?php echo $data['nis']; ?></td>
- <td class="align-middle"><?php echo $data['nama']; ?></td>
- <td class="align-middle"><?php echo $data['jenis_kelamin']; ?></td>
- <td class="align-middle"><?php echo $data['telp']; ?></td>
- <td class="align-middle"><?php echo $data['alamat']; ?></td>
- </tr>
Pada kode diatas terdapat variabel $datadigunakan untuk mengambil isi dari field-field yang ada pada tabel siswa di database mynotescode. Pada kode diatas juga ada kode yang berada pada tanda [‘……’], kode tersebut harus sama dengan nama field yang ada pada tabel siswa.
$jumlah_page = ceil($get_jumlah[‘jumlah’] / $limit);Untuk menghitung jumlah halaman. Perhitungan ini diambil berdasarkan jumlah_semua_data dibagi dengan limit_per_halaman yang telah ditentukan.
$jumlah_number = 3;Untuk menentukan jumlah link number sebelum dan sesudah page yang aktif. Bingung? lihat gambar dibawah ini :

Pada gambar diatas, yang saya beri garis warna merah. itu lah yang saya maksud dengan “Link Number sebelum dan sesudah” page yang aktif.
onclick=”searchWithPagination(……..Pada setiap link paginationnya, saya beri event/atribut onclick dengan value searchWithPagination. searchWithPagination ini adalah fungsi yang nanti pada step selanjutnya akan kita buat. Fungsi ini berguna untuk pagination tanpa refresh halaman nya dan menyesuaikan dengan pencariannya.
STEP 5 – AJAXSelanjutnya kita akan membuat file ajax nya yang berfungsi untuk mengirimkan data ke file proses search.php yang nanti akan kita buat pada step selanjutnya. Sekarang buat sebuah file baru dengan nama ajax.js, lalu simpan pada folderxampp/htdocs/search_pagination/js/. Berikut kodenya :
- $(document).ready(function(){
- $("#btn-search").click(function(){ // Ketika tombol simpan di klik
- // Panggil function
- searchWithPagination(1, true); // Set page_number nya dengan 1 dan set search nya dengan true
- });
- });
- // Buat sebuah function dengan nama searchWithPagination
- // Function ini untuk mengirim data keyword dan pagination dengan AJAX
- function searchWithPagination(page_number, search){
- // Ubah text tombol search menjadi SEARCHING...
- // Dan tambahkan atribut disable pada tombol nya agar tidak bisa diklik lagi
- $(this).html("SEARCHING...").attr("disabled", "disabled");
- $.ajax({
- url: 'search.php', // File tujuan
- type: 'POST', // Tentukan type nya POST atau GET
- data: {keyword: $("#keyword").val(), page: page_number, search: search}, // Set data yang akan dikirim
- dataType: "json",
- beforeSend: function(e) {
- if(e && e.overrideMimeType) {
- e.overrideMimeType("application/json;charset=UTF-8");
- }
- },
- success: function(response){ // Ketika proses pengiriman berhasil
- // Ubah kembali text button search menjadi SEARCH
- // Dan hapus atribut disabled untuk meng-enable kembali button search nya
- $("#btn-search").html("SEARCH").removeAttr("disabled");
- // Ganti isi dari div view dengan view yang diambil dari search.php
- $("#view").html(response.hasil);
- },
- error: function (xhr, ajaxOptions, thrownError) { // Ketika terjadi error
- alert(xhr.responseText); // munculkan alert
- }
- });
- }
Ini yang tadi saya maksud dengan fungsi searchWithPagination(), fungsi ini saya set dengan 2 parameter yakni parameter pertama adalah page_number alias nomor halaman selanjutnya dan parameter kedua adalah search digunakan untuk memberitahu file view.php apakah pagination tersebut plus dengan pencarian atau tidak. ini berguna untuk menyesuaikan pagination dengan pencariannya.
Akan saya jelaskan sedikit mengenai ajax nya, karena sebagian besar sudah saya jelaskan lewat kode diatas dengan komentar.
- url : diisi dengan url file yang akan dituju
- type : diisi dengan method yang ingin digunakan. isi dengan GET atau POST
- data : data yang akan dikirim ke file yang dituju
- success : function(){} : ketika proses pengiriman selesai, lakukan aksi
- error : function(){} : ketika terjadi error, lakukan aksi
untuk penjelasan lebih lengkap mengenai atiribut yang ada di JQUERY AJAX, klik disini (Anda akan masuk ke halaman Iklan terlebih dahulu, Tunggu 5 detik lalu klik tombol SKIP AD yang ada di pojok kanan atas).
STEP 6 – PROSES PENCARIANLangkah terakhir adalah membuat file untuk PHP memproses pencariannya. Buat sebuah file dengan namasearch.php, lalu simpan pada folderxampp/htdocs/search_pagination/. Berikut kodenya :
- <?php
- $keyword = $_POST['keyword']; // Ambil data keyword yang dikirim dengan AJAX
- // Load view.php
- ob_start();
- include "view.php";
- $html = ob_get_contents(); // Masukan isi dari view.php ke dalam variabel $html
- ob_end_clean();
- // Buat array dengan index hasil dan value nya $html
- // Lalu konversi menjadi JSON
- echo json_encode(array('hasil'=>$html));
- ?>
Sekian untuk catatan kali ini. Semoga catatan ini bisa bermanfaat. Apabila ada yang ingin ditanyakan, langsung tanyakan saja lewat form komentar dibawah ini. Jangan lupa LIKE & SHARE nya hehe. Terimakasih.
SOURCE CODE
Untuk mengunduh source code nya, klik salah satu link dibawah ini
– Download versi PDO : Link download yang sesuai tutorial ini yakni menggunakan fungsi PDO untuk query ke databasenya
– Download versi MySQLi : Link download untuk Anda yang ingin source code versi MySQLi dari tutorial ini
Untuk mengunduh source code nya, klik salah satu link dibawah ini
– Download versi PDO : Link download yang sesuai tutorial ini yakni menggunakan fungsi PDO untuk query ke databasenya
– Download versi MySQLi : Link download untuk Anda yang ingin source code versi MySQLi dari tutorial ini
SUMBER & REFERENSIDokumentasi Bootstrap :http://getbootstrap.com/getting-started/
Dokumentasi Style Pagination :http://getbootstrap.com/components/#pagination
Dokumentasi Style Pagination :http://getbootstrap.com/components/#pagination
Comments
Post a Comment