Free Ebook Tutorial from Rosihan Ari's Blog

Tutorial Javascript | Tutorial PHP | Tutorial AJAX | Tutorial CSS | Tutorial FPDF | Tutorial Wordpress | Tutorial Java SE


Ebook yang direkomendasikan untuk Anda
Ebook Panduan Praktis OOP di PHP


Ide Membuat Script PHP untuk Pencarian dengan Multi Kategori


April 4th, 2009 | by rosihanari | Cetak Artikel Cetak Artikel


GampSMS SMS Gateway

Dalam suatu aplikasi yang terkait dengan database, seringkali muncul fasilitas untuk pencarian data. Untuk mempersempit scope pencarian biasanya pencarian dilakukan berdasarkan kategori tertentu. Kategori pencarian bisa bersifat single category artinya hanya berdasar satu kategori pencarian saja atau ada yang bersifat multiple category atau multi kategori dimana user bisa melakukan pencarian berdasarkan lebih dari satu kategori.

Untuk membuat fasilitas pencarian berdasarkan satu kategori pada prinsipnya mudah. Sebagai contoh misalkan pencarian data mahasiswa, dimana user bisa melakukan pencarian berdasarkan salah satu dari kategori NIM, nama mahasiswa, alamat, jenis kelamin atau yang lain. Dalam hal ini (single category), prinsipnya hanyalah menggunakan statement kondisional saja. Jika yang dipilih adalah kategori NIM, maka jalankan query pencarian data berdasarkan kategori NIM. Jika yang dipilih adalah kategori nama mahasiswa, maka jalankan query pencarian data berdasarkan nama mahasiswa dan seterusnya. Saya kira mudah… dan tidak ada masalah.

Namun… bagaimana bila pencariannya berdasarkan multi kategori? misalkan user ingin mencari tahu siapa saja sih mahasiswa yang beralamat di Solo dan berjenis kelamin laki-laki misalnya :-) Kalau kita terapkan logika seperti halnya pada single kategori, maka akan sulit diimplementasikan. Mengapa sulit? ya.. karena akan banyak kemungkinan yang terjadi dalam pemilihan kategorinya. Coba bayangkan, seandainya untuk data mahasiswa terdapat 10 buah field. Untuk single kategori, tidak ada masalah karena kemungkinkan pemilihan kategorinya ada 10 buah (Anda membuat statement kondisional sebanyak 10 buah). Namun.. jika menggunakan multi kategori, wah… bisa-bisa Anda pusing karena terlalu banyak kemungkinannya si user tadi memilih kategorinya. Hitung-hitung ada sekitar jutaan kemungkinan. wow… capee dehh… :-)

Sebagai gambaran saja, seperti apa pencarian multi kategori itu, bisa Anda lihat pada gambar di bawah ini.

Photobucket

Gambar di atas menggambarkan pencarian data mahasiswa, dimana user bisa memilih kategori pencarian lebih dari satu. Dalam contoh di atas terdapat 4 kategori, dimana user dapat mengkombinasikannya sesuai keinginan. Perhatikan, bahwa gambar di atas menunjukkan si user ingin mencari mahasiswa bernama ‘Joko’ yang beralamat di ‘Solo’. Kalau dihitung-hitung ada sebanyak 24 buah total pilihan yang mungkin dipilih user. Kalau Anda buat ke 24 kemungkinan tersebut dengan statement kondisional wah… repot :-)

Nah… pada artikel ini akan dibahas bagaimana trik untuk membuat script guna keperluan pencarian multi kategori tersebut. Untuk mudahnya kita akan menerapkannya ke studi kasus saja. Studi kasus yang dipilih sama seperti contoh pada gambar di atas saja yah.. supaya mudah.

OK.. pertama.. kita siapkan databasenya terlebih dahulu, beserta tabelnya. Kalau perlu recordnya sekalian untuk contoh saja.

CREATE TABLE mhs (
  nim varchar(10),
  namamhs varchar(30)
  alamat text,
  sex varchar(10),
  PRIMARY KEY  (nim)
);

INSERT INTO `mhs` VALUES ('M0197001', 'ROSIHAN ARI YUANA', 'COLOMADU', 'L');
INSERT INTO `mhs` VALUES ('M0197002', 'DWI AMALIA FITRIANI', 'KUDUS', 'P');
INSERT INTO `mhs` VALUES ('M0197003', 'FAZA FAUZAN KH.', 'COLOMADU', 'L');
INSERT INTO `mhs` VALUES ('M0197004', 'NADA HASANAH', 'COLOMADU', 'P');
INSERT INTO `mhs` VALUES ('M0197005', 'MUH. AHSANI TAQWIM', 'COLOMADU', 'L');

Selanjutnya kita siapkan form pencariannya.

form.htm

<h1>Cari Data Mahasiswa</h1>

<p>Pilih kategori pencarian</p>

<form method="post" action="proses.php">
<table>
   <tr><td><input type="checkbox" name="nimCat"> NIM</td><td><input type="text" name="nim"></td></tr>
   <tr><td><input type="checkbox" name="namaCat"> Nama Mahasiswa</td><td><input type="text" name="nama"></td></tr>
   <tr><td><input type="checkbox" name="alamatCat"> Alamat</td><td><input type="text" name="alamat"></td></tr>
   <tr><td><input type="checkbox" name="sexCat"> Jenis Kelamin</td><td><input type="radio" name="sex" value="L"> Laki-Laki <input type="radio" name="sex" value="P"> Perempuan</td></tr>
   <tr><td></td><td><input type="submit" name="submit" value="Submit"></td></tr>
</table>
</form>

Karena bersifat multi kategori, maka sebaiknya kita gunakan komponen checkbox. Untuk masing-masing checkbox diberi nama yang berbeda-beda, misal di situ ada ‘nimCat’, ‘namaCat’ dst.

OK.. next.. ini yang paling penting yaitu script untuk pencariannya.

OK.. sekarang kita coba analisis sebentar tentang bagaimana query yang terbentuk bila user memilih suatu kategori tertentu. Sebagai contoh misalkan user memilih kategorinya adalah NIM saja, maka querynya berbentuk:

SELECT * FROM mhs WHERE nim = '...';

Bila user memilih kategorinya NIM dan nama mahasiswa, maka querynya berbentuk:

SELECT * FROM mhs WHERE nim = '...' AND namamhs LIKE '%...%';

Bila user memilih kategorinya nama mahasiswa, alamat dan jenis kelamin, maka querynya berbentuk:

SELECT * FROM mhs WHERE namamhs LIKE '%...%' AND alamat LIKE '%...%' AND sex = '...';

Dari beberapa contoh di atas, kita bisa simpulkan bahwa terdapat bagian query yang sama entah apapun pilihan kategorinya yaitu bagian: SELECT * FROM mhs WHERE. Sedangkan bagian yang berbeda-beda hanyalah bagian klausa WHERE nya saja. OK… berarti sekarang kita hanya fokus ke bagian WHERE saja

Sekarang kita analisis lagi bagian WHERE nya. Jika yang dipilih hanya NIM saja, maka dalam WHERE ditambahkan nim = '...'. Bila NIM dan nama mahasiswa yang dipilih maka nim = '...' ini ditambahkan AND namamhs LIKE '%...%' sehingga menjadi nim = '...' AND namamhs LIKE '%...%'. dan seterusnya. Dengan demikian konsep untuk pencarian multi kategori sebenarnya hanya menggabung-gabung syarat pada bagian WHERE saja.

Nah.. bagaimana jika ide di atas kita implementasikan dalam script?

OK.. mula-mula, kita beri inisialisasi untuk bagian WHERE nya adalah empty sting terlebih dahulu

<?php
$bagianWhere = "";
?>

Selanjutnya, kita buat script untuk mengkondisikan bila user memilih kategori NIM.

<?php

$bagianWhere = "";

if (isset($_POST['nimCat']))
{
   $nim = $_POST['nim'];
   $bagianWhere .= "nim = '$nim'";
}

?>

Maksud dari script di atas adalah, jika user memilih checkbox NIM yang tadi diberi nama ‘nimCat’, maka akan dibaca nilai NIM yang berasal dari textbox NIM. Selanjutnya setelah membaca nilai NIM yang mau dicari, maka pada bagian WHERE ditambahkan perintah nim = '$nim'. Supaya membentuk query SELECT * FROM mhs WHERE nim = nim = '$nim'.

Berikutnya script jika kategori nama mahasiswa dipilih

<?php

$bagianWhere = "";

if (isset($_POST['nimCat']))
{
   $nim = $_POST['nim'];
   $bagianWhere .= "nim = '$nim'";
}

if (isset($_POST['namaCat']))
{
   $namamhs = $_POST['nama'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "namamhs LIKE '%$namamhs%'";
   }
   else
   {
        $bagianWhere .= " AND namamhs LIKE '%$namamhs%'";
   }
}

?>

Nah… untuk bagian script untuk kategori nama mahasiswa ini agak beda tapi sedikit. Pada prinsipnya hampir sama, yaitu dicek dulu apakah checkbox nama mahasiswa dipilih atau tidak. Jika dipilih maka baca value nama mahasiswa yang ingin dicari. Selanjutnya, dilakukan pengecekan lagi. Jika $bagianWhere kosong, maka $bagianWhere akan ditambahkan namamhs LIKE '%namamhs%'. Maksud dari $bagianWhere kosong adalah bila user tidak memilih kategori NIM. Jika user tidak memilih kategori NIM, maka otomatis $bagianWhere nya masih kosong bukan? Namun… bila user juga memilih kategori NIM, atau dengan kata lain $bagianWhere tidak kosong alias sudah terisi dengan nim = '$nim', maka $bagianWhere ditambahkan dengan AND namamhs LIKE '%$namamhs%' sehingga menjadi nim = '$nim' AND namamhs LIKE '%$namamhs%'. Simpel bukan idenya.. :-)

Nah.. konsep di atas bisa dilanjutkan untuk kategori yang lain. Akhirnya scriptnya menjadi seperti di bawah ini

<?php

$bagianWhere = "";

if (isset($_POST['nimCat']))
{
   $nim = $_POST['nim'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "nim = '$nim'";
   }
}

if (isset($_POST['namaCat']))
{
   $namamhs = $_POST['nama'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "namamhs LIKE '%$namamhs%'";
   }
   else
   {
        $bagianWhere .= " AND namamhs LIKE '%$namamhs%'";
   }
}

if (isset($_POST['alamatCat']))
{
   $alamat = $_POST['alamat'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "alamat LIKE '%$alamat%'";
   }
   else
   {
        $bagianWhere .= " AND alamat LIKE '%$alamat%'";
   }
}

if (isset($_POST['sexCat']))
{
   $sex = $_POST['sex'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "sex = '$sex'";
   }
   else
   {
        $bagianWhere .= " AND sex = '$sex'";
   }
}

?>

Nah… setelah selesai membentuk bagian WHERE nya, terakhir kita padukan bagian WHERE yang terbentuk ke dalam query utuhnya.

<?php

$bagianWhere = "";

if (isset($_POST['nimCat']))
{
   $nim = $_POST['nim'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "nim = '$nim'";
   }
}

if (isset($_POST['namaCat']))
{
   $namamhs = $_POST['nama'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "namamhs LIKE '%$namamhs%'";
   }
   else
   {
        $bagianWhere .= " AND namamhs LIKE '%$namamhs%'";
   }
}

if (isset($_POST['alamatCat']))
{
   $alamat = $_POST['alamat'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "alamat LIKE '%$alamat%'";
   }
   else
   {
        $bagianWhere .= " AND alamat LIKE '%$alamat%'";
   }
}

if (isset($_POST['sexCat']))
{
   $sex = $_POST['sex'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "sex = '$sex'";
   }
   else
   {
        $bagianWhere .= " AND sex = '$sex'";
   }
}

$query = "SELECT * FROM mhs WHERE ".$bagianWhere;
$hasil = mysql_query($query);

?>

Sederhana bukan idenya? Kalau kita buat satu-persatu IF nya tanpa trik di atas tentu kita butuh 24 buah IF untuk semua kemungkinannya. Namun dengan trik di atas hanya butuh 4 buah IF saja.

Nah… berikut ini script secara keseluruhan untuk menampilkan hasil query berdasarkan multi kategori yang dipilih user. Untuk mempercantik tampilan hasil pencarian saya tampilkan dalam bentuk tabel.

<?php

mysql_connect("dbhost", "dbuser", "dbpassword");
mysql_select_db("dbname");

$bagianWhere = "";

if (isset($_POST['nimCat']))
{
   $nim = $_POST['nim'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "nim = '$nim'";
   }
}

if (isset($_POST['namaCat']))
{
   $namamhs = $_POST['nama'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "namamhs LIKE '%$namamhs%'";
   }
   else
   {
        $bagianWhere .= " AND namamhs LIKE '%$namamhs%'";
   }
}

if (isset($_POST['alamatCat']))
{
   $alamat = $_POST['alamat'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "alamat LIKE '%$alamat%'";
   }
   else
   {
        $bagianWhere .= " AND alamat LIKE '%$alamat%'";
   }
}

if (isset($_POST['sexCat']))
{
   $sex = $_POST['sex'];
   if (empty($bagianWhere))
   {
        $bagianWhere .= "sex = '$sex'";
   }
   else
   {
        $bagianWhere .= " AND sex = '$sex'";
   }
}

$query = "SELECT * FROM mhs WHERE ".$bagianWhere;
$hasil = mysql_query($query);
echo "<table border='1'>";
echo "<tr><td>NIM</td><td>Nama Mahasiswa</td><td>Alamat</td><td>Jenis Kelamin</td></tr>";
while ($data = mysql_fetch_array($hasil))
{
   echo "<tr><td>".$data['nim']."</td><td>".$data['namamhs']."</td><td>".$data['alamat']."</td><td>".$data['sex']."</td></tr>";
}
echo "</table>";
?>

OK deh.. selamat mencoba. Artikel ini saya ambil dari salah satu modul dalam Kursus PHP Online Bersama Rosihan Ari Y, sekaligus request dari Mas Yoyok (salah satu member saya).

Oya.. bila script di atas tidak jalan silakan download scriptnya langsung di bawah ini

[ Download Script ]




Share ke Facebook Share ke Twitter
Baca Juga Artikel Terkait
Perintah SQL (SELECT) untuk Multi Tabel (Bag. 1)
Perintah SQL (SELECT) untuk Multi Tabel (Bag. 2)
Script PHP untuk Mengedit Data Via Form
Script PHP untuk Menampilkan Data dalam Tabel dengan Warna Baris Selang-seling
Script PHP untuk Edit Data dengan Komponen RadioButton pada Form

Kata kunci: form - PHP - search -


Ada 126 komentar dalam artikel ini.



  1. muris says:

    mas penjelasan diatas kan hanya satu tabel saja gimana kalo lebih dari satu tabel…querynya gimana?

  2. ugo says:

    Mas mau tanya kl data pencarian di atas di tambah berdasarkan tanggal awal sampai tanggal tertentu bagaimana..?

  3. Erwin says:

    mas saya banyak belajar dari blog ini.., kapan-kapan mau gak melatih guru-guru di SMKN2 Padang Panjang SUMBAR…

  4. Ferdi says:

    Punya saya kok muncul keterangan “mysql_fetch_array() expects parameter 1 to be resource”

    Terkhusus di baris ke 60.

    Mohon bantuannya ?

    • rosihanari says:

      @ferdi: coba cek lagi query SQL nya mas pada sekitar baris ke-60 tsb, cek nama field2nya, nama tabelnya dsb.

  5. porman says:

    Terimakasih bayak atas sharing info nya….Barguna bangat…..dan saya membutuh kannya ….hehehe

    makasih pak..

  6. Medi says:

    Makasih atas tutorialnya, saya memang lagi butuh ni kode pencarian multi kategori. Sangat membantu saya untuk menyelesaikan Tugas Akhir. Makasih bangt ya..

  7. aldi says:

    mas klo kasus ny diubah sdikit menjadi sperti, misalnya :
    isi fieldnya tetap sma ada nim,namamhs,alamat,sex

    contoh isi fieldnya tetap sama dgn dtabase dr mas.

    lalu di form pencariannya saya ingin mencari berdasarkan nama mahasiswanya saja.

    contoh saya ingin mencari nama mahasiswa dwi dengan faza, jadi nanti saya akan mengetikkan di form nya dengan dwi,faze kemudian saya klik search.

    maka nanti data yang keluar adlah hanya data milik dwi dan faza

    kira” scriptnya bgaimana ya mas agar di textbox pencariannya jika penulisannya sperti yg diatas ( dwi,faza ) jadi ada koma sbg pemisahny…
    thnks…

    • rosihanari says:

      @aldi: kalau spt itu nanti agak kompleks sedikit, karena perlu dilakukan proses parsing yaitu untuk mengambil substring yang terletak di antara karakter tertentu, di sini contohnya adalah koma. Lalu untuk setiap substring yang diambil, gabungkan dalam satu query dengan penghubung OR.

  8. septi says:

    pak mau nanya, misalkan kasusnya sama seperti itu,,
    tapi tampilan yang outputnya itu sesuai pilihan user gmn ya ?
    misal: yg wahib ditampilkan adalah no.
    trus kalau milih nama..
    munculnya no n nama aja..
    nag milih nim & nama
    maka munculnya no & nim & nama… ?

  9. mastino says:

    mas,, saya mau tanya,, knapa ya klo pencariannya tidak diisi pesannya Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\search\proses.php on line 61
    cara mengatasinya gimana?? atau klo gtu diisi pesan apa gtu,, selain warning itu

    dan misalkan tidak ditemukan data tidak muncul apa2 selain table,,, biar bisa muncul pesan tidak ditemukan data di tambahin apa ya???

  10. afif says:

    assalamualaikum.pak mau nanya kalau pakai cara ini tapi nampilin tabelnya yang saling berelasi dengan tabel lain bagaimana?



 

Komentar/pertanyaan Anda!

Mohon maaf, komentar/pertanyaan yang menggunakan email palsu atau komentar bernada negatif, cemooh, umpatan, cacian atau sejenisnya secara otomatis akan terhapus karena dianggap spam dan tidak akan tampil

Dimohon jangan pula memasukkan code program dalam bentuk apapun ke dalam komentar karena akan dianggap spam.

Mohon maaf jika seandainya ada beberapa pertanyaan Anda yang tidak direspon atau ditanggapi mengingat banyaknya komentar yang masuk dan keterbatasan kemampuan/ilmu saya dalam menjawab pertanyaan satu persatu. Saya harap Anda bisa memahami dan memakluminya.

Semua komentar atau pertanyaan yg masuk tidak akan langsung tampil di halaman ini, karena akan dimoderasi dahulu.


*