Cara Membuat Halaman Pencaharian dengan Ajax
Pembuatan halaman pencarian yang interaktif dan responsif menjadi kebutuhan yang krusial dalam berbagai jenis aplikasi web. Dengan menggunakan teknik Asynchronous JavaScript and XML (Ajax), kita dapat menampilkan hasil pencarian secara dinamis tanpa perlu memuat ulang seluruh halaman. Hal ini meningkatkan user experience dan efisiensi penggunaan bandwidth.
Mengapa Menggunakan Ajax untuk Pencarian
- Responsif dan Cepat: Pengguna tidak perlu menunggu full page reload setiap kali melakukan pencarian.
- Pengalaman Interaktif: Hasil pencarian bisa diperbarui secara instan, bahkan saat pengguna sedang mengetik (live search).
- Penghematan Bandwidth: Hanya data relevan yang dikirim ke server, bukan keseluruhan halaman.
- Fleksibilitas: Mudah diintegrasikan dengan berbagai teknologi server side (PHP, Node.js, Python, dsb.).
Struktur Folder Proyek
Sebagai acuan, berikut adalah contoh struktur folder sederhana untuk meletakkan berkas-berkas yang dibutuhkan:
ajax-search/
├── index.html (File utama untuk tampilan pencarian)
├── search.php (File server-side untuk memproses permintaan Ajax)
└── db_connection.php (File opsional untuk menghubungkan ke database, jika diperlukan)
Menyiapkan Basis Data
Untuk mempraktikkan contoh ini, asumsikan kita memiliki sebuah tabel di MySQL dengan nama products
berisi data sederhana:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100),
product_desc TEXT
);
Isi tabel products
dengan beberapa data contoh:
INSERT INTO products (product_name, product_desc) VALUES
('Laptop XYZ', 'Laptop dengan prosesor terbaru dan RAM 8GB'),
('Kamera ABC', 'Kamera digital 24MP dengan lensa kit'),
('Smartphone DEF', 'Smartphone dengan memori internal 128GB'),
('Smart TV GHI', 'TV pintar dengan sistem operasi Android dan resolusi 4K');
Menyiapkan File PHP untuk Koneksi Database (Opsional)
Jika Anda memilih struktur dan best practice yang lebih rapi, pisahkan detail koneksi database di file db_connection.php
.
Berikut contoh singkat:
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'my_database';
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
die("Koneksi gagal: " . mysqli_connect_error());
}
Membuat Endpoint Pencarian (search.php)
File search.php
ini akan bertanggung jawab menerima parameter query (kata kunci) dari request Ajax,
kemudian mengeksekusi SELECT
di tabel products
berdasarkan kata kunci tersebut.
Selanjutnya, hasil akan dikirim kembali ke sisi klien dalam format JSON.
<?php
header('Content-Type: application/json');
// Jika Anda memisahkan koneksi, maka:
// include 'db_connection.php';
// Atau langsung definisikan di sini:
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'my_database';
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
die(json_encode(["error" => "Koneksi ke database gagal."]));
}
// Mengambil query pencarian
$keyword = isset($_GET['keyword']) ? $_GET['keyword'] : '';
// Query sederhana dengan LIKE
$sql = "SELECT * FROM products
WHERE product_name LIKE '%$keyword%'
OR product_desc LIKE '%$keyword%'
ORDER BY id DESC";
$result = mysqli_query($conn, $sql);
$data = [];
if ($result && mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
}
// Mengembalikan response dalam format JSON
echo json_encode($data);
Penjelasan singkat:
header('Content-Type: application/json');
memastikan respons dikirim dalam format JSON.$_GET['keyword']
mengambil nilai kata kunci yang dikirim viaquery string
.- Konstruk
LIKE '%$keyword%'
memungkinkan pencarian berdasarkan sebagian kata. json_encode($data)
menyulap array hasil query menjadi string JSON yang mudah diolah JavaScript di sisi klien.
LIKE
, umumnya Anda perlu mempertimbangkan teknik prepared statements
untuk mencegah injeksi SQL. Pada contoh di atas, kita menggunakan pendekatan sederhana untuk tujuan demo.
Membuat Halaman Antarmuka (index.html)
Selanjutnya, kita buat halaman antarmuka dengan input pencarian dan area hasil pencarian. Untuk menggunakan Ajax dengan mudah, kita akan memakai jQuery (bisa juga dengan vanilla JavaScript, atau fetch API).
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Pencarian dengan Ajax</title>
<!-- Memuat jQuery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
#search-results {
margin-top: 20px;
}
.product {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.product h3 {
margin-top: 0;
margin-bottom: 5px;
}
</style>
</head>
<body>
<h1>Halaman Pencarian Produk</h1>
<p>Ketik kata kunci produk, lalu hasil akan otomatis muncul.</p>
<div>
<label for="search-input">Cari Produk:</label>
<input type="text" id="search-input" placeholder="misal: laptop, kamera, tv" />
</div>
<div id="search-results"></div>
<script>
$(document).ready(function() {
// Fungsi untuk melakukan Ajax request
function searchProducts(keyword) {
$.ajax({
url: 'search.php',
type: 'GET',
data: { keyword: keyword },
dataType: 'json',
success: function(response) {
// Kosongkan elemen sebelum menampilkan data baru
$('#search-results').empty();
if(response.length > 0) {
// Loop data hasil pencarian
$.each(response, function(index, product) {
let html = `
<div class="product">
<h3>${product.product_name}</h3>
<p>${product.product_desc}</p>
</div>
`;
$('#search-results').append(html);
});
} else {
$('#search-results').html('<p>Tidak ada hasil ditemukan.</p>');
}
},
error: function() {
$('#search-results').html('<p>Terjadi kesalahan saat memuat data.</p>');
}
});
}
// Memantau input saat user mengetik (keyup event)
$('#search-input').on('keyup', function() {
let keyword = $(this).val().trim();
// Hanya panggil Ajax jika keyword minimal 1 karakter
if(keyword.length > 0) {
searchProducts(keyword);
} else {
// Kosongkan jika tidak ada input
$('#search-results').empty();
}
});
});
</script>
</body>
</html>
Penjelasan alur kerja:
- User mengetikkan kata kunci pada
input
denganid="search-input"
. .on('keyup')
memicu fungsisearchProducts(keyword)
setiap kali ada perubahan pada input.- Fungsi
searchProducts()
mengirim requestGET
kesearch.php
dengan parameterkeyword
. - Saat response berhasil diterima, data JSON di-loop untuk ditampilkan dalam
<div id="search-results">
.
Teknik Penundaan (Debouncing) Pencarian
Jika Anda memiliki tabel berukuran besar atau ingin mengurangi jumlah request yang dikirim, Anda bisa menambahkan teknik debounce supaya Ajax tidak terpanggil terlalu sering saat user mengetik dengan cepat.
Contoh menambahkan debounce sederhana:
let debounceTimer;
$('#search-input').on('keyup', function() {
let keyword = $(this).val().trim();
clearTimeout(debounceTimer);
debounceTimer = setTimeout(function() {
if(keyword.length > 0) {
searchProducts(keyword);
} else {
$('#search-results').empty();
}
}, 300); // jeda 300 ms
});
Dengan pendekatan ini, Ajax hanya akan terpanggil ketika user selesai mengetik (atau berhenti sejenak) dalam 300 milidetik.
Membuat Tampilan Lebih Menarik
Penampilan hasil pencarian dapat dikembangkan lebih lanjut dengan styling CSS atau menggunakan framework seperti Bootstrap atau Tailwind CSS. Anda bisa menambahkan elemen gambar produk, harga, tombol untuk melihat detail, dan fitur lainnya.
Pengujian
Sebelum menganggap halaman pencarian sudah siap, lakukan beberapa pengujian berikut:
- Input Kosong: Pastikan hasil pencarian direset ketika pengguna mengosongkan kolom input.
- Karakter Khusus: Cek apakah halaman aman dari karakter aneh atau berpotensi injeksi.
- Data Non-Exist: Coba masukkan kata kunci yang tidak ada di database, perhatikan apakah pesan “tidak ada hasil” muncul.
- Kecepatan: Test pada koneksi internet lambat untuk memastikan penanganan error tetap berjalan baik.
Menangani Kesalahan
- Koneksi Gagal: Di sisi server, Anda bisa mengembalikan
{"error": "Pesan kesalahan"}
jika database bermasalah. - Error Ajax: Tangani di sisi klien dengan menampilkan pesan khusus di area hasil pencarian.
- Logs dan Monitoring: Jika aplikasi sudah online, gunakan logging agar developer bisa memantau apa yang terjadi di server.
Keamanan Tambahan
Beberapa hal yang dapat diterapkan untuk meningkatkan keamanan:
- Prepared Statement: Hindari langsung menempelkan
$keyword
di query. Gunakan prepared statement untuk mencegah SQL Injection. - Escaping Output: Jika menampilkan data yang di-input oleh user, pertimbangkan teknik escaping untuk menghindari XSS.
- Limit dan Pagination: Saat menampilkan daftar hasil, gunakan
LIMIT
pada query jika data sangat besar, serta terapkan pagination agar beban server lebih ringan.
Baca Juga :