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 :
  1. Download JQUERY, klik link berikut :Download.
  2. Download Bootstrap, klik link berikut :Download.
  3. Buat sebuah folder baru dengan namasearch_pagination, lalu simpan pada folder xampp/htdocs/.
  4. Buat sebuah folder dengan nama css, lalu simpan pada folderxampp/htdocs/search_pagination/.
  5. Buat sebuah folder dengan nama js, lalu simpan pada folderxampp/htdocs/search_pagination/.
  6. Esktrak file bootstrap.7z yang telah didownload tadi.
  7. Copy and paste folder fonts dari folder bootstrap yang telah diekstrak tadi ke folderxampp/htdocs/search_pagination/.
  8. Copy and paste file bootstrap.min.cssdari folder bootstrap/css/ yang telah diekstrak tadi ke folderxampp/htdocs/search_pagination/css/.
  9. Copy and paste file bootstrap.min.jsdari folder bootstrap/js/ yang telah diekstrak tadi ke folderxampp/htdocs/search_pagination/js/.
  10. 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 :
  1. Buat sebuah database dengan nama mynotescode.
  2. Buat sebuah tabel dengan nama siswa. Struktur tabelnya sebagai berikut :
    Struktur Tabel - Cara Membuat Pencarian Plus Pagination Tanpa Refresh dengan PHP
    1. CREATE TABLE IF NOT EXISTS `siswa` (
    2. `nis` varchar(11) NOT NULL,
    3. `nama` varchar(50) NOT NULL,
    4. `jenis_kelamin` varchar(10) NOT NULL,
    5. `telp` varchar(15) NOT NULL,
    6. `alamat` text NOT NULL,
    7. PRIMARY KEY (`nis`)
    8. )
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 :
  1. <?php
  2. $host = 'localhost'; // Nama hostnya
  3. $username = 'root'; // Username
  4. $password = ''; // Password (Isi jika menggunakan password)
  5. $database = 'mynotescode'; // Nama databasenya
  6. // Koneksi ke MySQL dengan PDO
  7. $pdo = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
  8. ?>

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 :
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Pencarian Plus Pagination Dengan PHP dan AJAX</title>
  8. <!-- Load File bootstrap.min.css yang ada difolder css -->
  9. <link href="css/bootstrap.min.css" rel="stylesheet">
  10. <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  11. <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  12. <!--[if lt IE 9]>
  13. <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
  14. <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
  15. <![endif]-->
  16. <style>
  17. .align-middle{
  18. vertical-align: middle !important;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div style="padding: 0 15px;">
  24. <h2>Pencarian Plus Pagination</h2><hr>
  25. <!--
  26. -- Buat sebuah div dengan class row
  27. -- class row ini berfungsi untuk membagi-bagi layar
  28. -- di dalam bootstrap, 1 layar penuh (dari kiri ke kanan) dibagi menjadi 12 bagian / Kolom
  29. -- Atau lebih tepatnya sering disebut dengan GRID
  30. -- col-xs-12 artinya jika ukuran layar < 768px, maka gunakan 12 kolom
  31. -- col-sm-6 artinya jika ukuran layar >= 768px, maka gunakan 6 kolom
  32. -- Untuk lebih jelasnya soal Grid, silahkan buka link ini : http://viid.me/qb4V8P
  33. -->
  34. <div class="row">
  35. <div class="col-xs-12 col-sm-6">
  36. <!--
  37. -- Input Group adalah salah satu komponen yang disediakan bootstrap
  38. -- Untuk lebih jelasnya soal Input Group, silahkan buka link ini : http://viid.me/qb4Mup
  39. -->
  40. <div class="input-group">
  41. <!-- Buat sebuah textbox dan beri id keyword -->
  42. <input type="text" class="form-control" placeholder="Pencarian..." id="keyword">
  43. <span class="input-group-btn">
  44. <!-- Buat sebuah tombol search dan beri id btn-search -->
  45. <button class="btn btn-primary" type="button" id="btn-search">SEARCH</button>
  46. <a href="" class="btn btn-warning">RESET</a>
  47. </span>
  48. </div>
  49. </div>
  50. </div>
  51. <br>
  52. <!--
  53. -- Beri atribut id="view" pada tag div yang akan digunakan untuk menampung data
  54. -- yang ada pada tabel siswa di database dan paginationnya
  55. -->
  56. <div id="view"><?php include "view.php"; ?></div>
  57. </div>
  58. <!-- Load File jquery.min.js yang ada difolder js -->
  59. <script src="js/jquery.min.js"></script>
  60. <!-- Load File bootstrap.min.js yang ada difolder js -->
  61. <script src="js/bootstrap.min.js"></script>
  62. <!-- Load file ajax.js yang ada di folder js -->
  63. <script src="js/ajax.js"></script>
  64. </body>
  65. </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 :
  1. <div class="table-responsive">
  2. <table class="table table-bordered">
  3. <tr>
  4. <th>NO</th>
  5. <th>NIS</th>
  6. <th>NAMA</th>
  7. <th>JENIS KELAMIN</th>
  8. <th>TELP</th>
  9. <th>ALAMAT</th>
  10. </tr>
  11. <?php
  12. // Include / load file koneksi.php
  13. include "koneksi.php";
  14. // Cek apakah terdapat data page pada URL
  15. $page = (isset($_POST['page']))? $_POST['page'] : 1;
  16. $limit = 5; // Jumlah data per halamannya
  17. $no = (($page - 1) * $limit) + 1; // Untuk setting awal nomor pada halaman yang aktif
  18. // Untuk menentukan dari data ke berapa yang akan ditampilkan pada tabel yang ada di database
  19. $limit_start = ($page - 1) * $limit;
  20. // Cek apakah variabel data search tersedia
  21. // Artinya cek apakah user telah mengklik tombol search atau belum
  22. if(isset($_POST['search']) && $_POST['search'] == true){ // Jika ada data search yg dikirim (user telah mengklik tombol search) dan search sama dengan true
  23. // variabel $keyword ini berasal dari file search.php,
  24. // dimana isinya adalah apa yang diinput oleh user pada textbox pencarian
  25. $param = '%'.$keyword.'%';
  26. // Buat query untuk menampilkan data siswa berdasarkan NIS / Nama / Jenis Kelamin / Telp / Alamat
  27. // dan sesuai limit yang ditentukan
  28. $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);
  29. $sql->bindParam(':ni', $param);
  30. $sql->bindParam(':na', $param);
  31. $sql->bindParam(':jk', $param);
  32. $sql->bindParam(':t', $param);
  33. $sql->bindParam(':a', $param);
  34. $sql->execute(); // Eksekusi querynya
  35. // Buat query untuk menghitung semua jumlah data
  36. // dengan keyword yang telah di input
  37. $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");
  38. $sql2->bindParam(':ni', $param);
  39. $sql2->bindParam(':na', $param);
  40. $sql2->bindParam(':jk', $param);
  41. $sql2->bindParam(':t', $param);
  42. $sql2->bindParam(':a', $param);
  43. $sql2->execute(); // Eksekusi querynya
  44. $get_jumlah = $sql2->fetch();
  45. }else{ // Jika user belum mengklik tombol search (PROSES TANPA AJAX)
  46. // Buat query untuk menampilkan semua data siswa
  47. $sql = $pdo->prepare("SELECT * FROM siswa LIMIT ".$limit_start.",".$limit);
  48. $sql->execute(); // Eksekusi querynya
  49. // Buat query untuk menghitung semua jumlah data
  50. $sql2 = $pdo->prepare("SELECT COUNT(*) AS jumlah FROM siswa");
  51. $sql2->execute(); // Eksekusi querynya
  52. $get_jumlah = $sql2->fetch();
  53. }
  54. while($data = $sql->fetch()){ // Ambil semua data dari hasil eksekusi $sql
  55. ?>
  56. <tr>
  57. <td class="align-middle"><?php echo $no; ?></td>
  58. <td class="align-middle"><?php echo $data['nis']; ?></td>
  59. <td class="align-middle"><?php echo $data['nama']; ?></td>
  60. <td class="align-middle"><?php echo $data['jenis_kelamin']; ?></td>
  61. <td class="align-middle"><?php echo $data['telp']; ?></td>
  62. <td class="align-middle"><?php echo $data['alamat']; ?></td>
  63. </tr>
  64. <?php
  65. $no++;
  66. }
  67. ?>
  68. </table>
  69. </div>
  70. <?php
  71. if($sql->rowCount() > 0){ // Jika datanya ada, tampilkan paginationnya
  72. ?>
  73. <!--
  74. -- Buat Paginationnya
  75. -- Dengan bootstrap, kita jadi dimudahkan untuk membuat tombol-tombol pagination dengan design yang bagus tentunya
  76. -->
  77. <ul class="pagination">
  78. <!-- LINK FIRST AND PREV -->
  79. <?php
  80. if($page == 1){ // Jika page adalah page ke 1, maka disable link PREV
  81. ?>
  82. <li class="disabled"><a href="#">First</a></li>
  83. <li class="disabled"><a href="#">&laquo;</a></li>
  84. <?php
  85. }else{ // Jika page bukan page ke 1
  86. $link_prev = ($page > 1)? $page - 1 : 1;
  87. ?>
  88. <li><a href="javascript:void(0);" onclick="searchWithPagination(1, false)">First</a></li>
  89. <li><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $link_prev; ?>, false)">&laquo;</a></li>
  90. <?php
  91. }
  92. ?>
  93. <!-- LINK NUMBER -->
  94. <?php
  95. $jumlah_page = ceil($get_jumlah['jumlah'] / $limit); // Hitung jumlah halamannya
  96. $jumlah_number = 3; // Tentukan jumlah link number sebelum dan sesudah page yang aktif
  97. $start_number = ($page > $jumlah_number)? $page - $jumlah_number : 1; // Untuk awal link number
  98. $end_number = ($page < ($jumlah_page - $jumlah_number))? $page + $jumlah_number : $jumlah_page; // Untuk akhir link number
  99. for($i = $start_number; $i <= $end_number; $i++){
  100. $link_active = ($page == $i)? ' class="active"' : '';
  101. ?>
  102. <li<?php echo $link_active; ?>><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $i; ?>, false)"><?php echo $i; ?></a></li>
  103. <?php
  104. }
  105. ?>
  106. <!-- LINK NEXT AND LAST -->
  107. <?php
  108. // Jika page sama dengan jumlah page, maka disable link NEXT nya
  109. // Artinya page tersebut adalah page terakhir
  110. if($page == $jumlah_page){ // Jika page terakhir
  111. ?>
  112. <li class="disabled"><a href="#">&raquo;</a></li>
  113. <li class="disabled"><a href="#">Last</a></li>
  114. <?php
  115. }else{ // Jika Bukan page terakhir
  116. $link_next = ($page < $jumlah_page)? $page + 1 : $jumlah_page;
  117. ?>
  118. <li><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $link_next; ?>, false)">&raquo;</a></li>
  119. <li><a href="javascript:void(0);" onclick="searchWithPagination(<?php echo $jumlah_page; ?>, false)">Last</a></li>
  120. <?php
  121. }
  122. ?>
  123. </ul>
  124. <?php
  125. }
  126. ?>
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.
$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 = $pdo->prepare(“SELECT * FROM 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.
  1. <tr>
  2. <td class="align-middle"><?php echo $data['nis']; ?></td>
  3. <td class="align-middle"><?php echo $data['nama']; ?></td>
  4. <td class="align-middle"><?php echo $data['jenis_kelamin']; ?></td>
  5. <td class="align-middle"><?php echo $data['telp']; ?></td>
  6. <td class="align-middle"><?php echo $data['alamat']; ?></td>
  7. </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 :
Penjelasan - Cara Mudah Membuat Pagination dengan PHP
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 :
  1. $(document).ready(function(){
  2. $("#btn-search").click(function(){ // Ketika tombol simpan di klik
  3. // Panggil function
  4. searchWithPagination(1, true); // Set page_number nya dengan 1 dan set search nya dengan true
  5. });
  6. });
  7. // Buat sebuah function dengan nama searchWithPagination
  8. // Function ini untuk mengirim data keyword dan pagination dengan AJAX
  9. function searchWithPagination(page_number, search){
  10. // Ubah text tombol search menjadi SEARCHING...
  11. // Dan tambahkan atribut disable pada tombol nya agar tidak bisa diklik lagi
  12. $(this).html("SEARCHING...").attr("disabled", "disabled");
  13. $.ajax({
  14. url: 'search.php', // File tujuan
  15. type: 'POST', // Tentukan type nya POST atau GET
  16. data: {keyword: $("#keyword").val(), page: page_number, search: search}, // Set data yang akan dikirim
  17. dataType: "json",
  18. beforeSend: function(e) {
  19. if(e && e.overrideMimeType) {
  20. e.overrideMimeType("application/json;charset=UTF-8");
  21. }
  22. },
  23. success: function(response){ // Ketika proses pengiriman berhasil
  24. // Ubah kembali text button search menjadi SEARCH
  25. // Dan hapus atribut disabled untuk meng-enable kembali button search nya
  26. $("#btn-search").html("SEARCH").removeAttr("disabled");
  27. // Ganti isi dari div view dengan view yang diambil dari search.php
  28. $("#view").html(response.hasil);
  29. },
  30. error: function (xhr, ajaxOptions, thrownError) { // Ketika terjadi error
  31. alert(xhr.responseText); // munculkan alert
  32. }
  33. });
  34. }
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 :
  1. <?php
  2. $keyword = $_POST['keyword']; // Ambil data keyword yang dikirim dengan AJAX
  3. // Load view.php
  4. ob_start();
  5. include "view.php";
  6. $html = ob_get_contents(); // Masukan isi dari view.php ke dalam variabel $html
  7. ob_end_clean();
  8. // Buat array dengan index hasil dan value nya $html
  9. // Lalu konversi menjadi JSON
  10. echo json_encode(array('hasil'=>$html));
  11. ?>

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

SUMBER & REFERENSIDokumentasi Bootstrap :http://getbootstrap.com/getting-started/
Dokumentasi Style Pagination  :http://getbootstrap.com/components/#pagination

Comments

Popular posts from this blog

Soal Bahasa Arab Tentang Kata Ganti [Ism Dhomir] Kata Tunjuk [Ism Isyarah]

Soal Bahasa Arab SMK/MA