Membuat Halaman Pencarian Hotel dengan Ajax
Menyediakan layanan pencarian hotel yang praktis dan responsif adalah salah satu aspek penting dalam sebuah situs atau aplikasi pemesanan akomodasi. Menggunakan Asynchronous JavaScript and XML (Ajax), kita dapat membuat pengguna mencari hotel dan mendapatkan hasil seketika tanpa memuat ulang keseluruhan halaman. Teknik ini meningkatkan user experience, menghemat bandwidth, serta membuat aplikasi terasa lebih interaktif.
Manfaat Menggunakan Ajax dalam Pencarian Hotel
- Responsif dan Cepat: Pengguna dapat melihat hasil pencarian langsung, tanpa harus melakukan full reload.
- Efisiensi Bandwidth: Hanya data relevan (hasil pencarian) yang diambil dari server, bukan keseluruhan halaman.
- Pengalaman Interaktif: Pengguna dapat memasukkan kota, rentang harga, atau nama hotel dan langsung melihat hasil terkini.
- Mudah Diintegrasikan: Ajax bersifat fleksibel dan dapat diterapkan di berbagai platform server side seperti PHP, Node.js, atau Python.
Struktur Database
Misalkan kita membuat sebuah tabel bernama hotels
untuk menyimpan daftar hotel. Tabel ini akan
memiliki beberapa kolom seperti id
, hotel_name
, city
, price
,
dan rating
sebagai contoh:
CREATE TABLE hotels (
id INT AUTO_INCREMENT PRIMARY KEY,
hotel_name VARCHAR(100) NOT NULL,
city VARCHAR(50) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
rating DECIMAL(2, 1) NOT NULL
);
Selanjutnya, isikan beberapa data awal untuk keperluan uji coba:
INSERT INTO hotels (hotel_name, city, price, rating) VALUES
('Grand Palace Hotel', 'Jakarta', 950000, 4.5),
('Sunset Beach Resort', 'Bali', 1200000, 4.7),
('Mountain View Lodge', 'Bandung', 700000, 4.2),
('Royal Inn', 'Surabaya', 500000, 3.8),
('City Light Hotel', 'Jakarta', 650000, 4.0);
Struktur Folder Proyek
Untuk mempermudah manajemen file, kita dapat menggunakan struktur folder sebagai berikut:
hotel-search/
├── index.html (File utama untuk tampilan pencarian)
├── searchHotel.php (File server-side untuk memproses permintaan Ajax)
└── db_connection.php (File opsional yang berisi detail koneksi database)
Menyiapkan Koneksi Database (db_connection.php)
Kita dapat memisahkan detail koneksi database dalam file db_connection.php
untuk menjaga kerapian kode.
Contoh minimalnya seperti berikut:
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'hotel_db';
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
die("Koneksi gagal: " . mysqli_connect_error());
}
Membuat Endpoint Pencarian (searchHotel.php)
File searchHotel.php
akan menerima parameter query atau keyword yang dikirim melalui
request Ajax. Kemudian, kita akan melakukan SELECT
data hotel dari tabel hotels
berdasarkan kata kunci tersebut. Selanjutnya, hasilnya dikemas dalam format JSON agar mudah diproses di sisi klien.
<?php
header('Content-Type: application/json');
// Mengambil file koneksi (opsional)
include 'db_connection.php';
// Pastikan koneksi berhasil dibuat
if (!$conn) {
die(json_encode(["error" => "Koneksi database gagal."]));
}
// Mendapatkan keyword dari request GET
$keyword = isset($_GET['keyword']) ? $_GET['keyword'] : '';
// Query sederhana: mencari kecocokan di nama hotel atau kota
$sql = "SELECT * FROM hotels
WHERE hotel_name LIKE '%$keyword%'
OR city LIKE '%$keyword%'
ORDER BY rating DESC";
$result = mysqli_query($conn, $sql);
$data = [];
if ($result && mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
}
echo json_encode($data);
header('Content-Type: application/json');
menandakan bahwa respons akan berbentuk JSON.$_GET['keyword']
mengambil kata kunci pencarian yang dikirim oleh klien.LIKE '%$keyword%'
memastikan pencarian mencakup kata kunci parsial (berada di mana saja pada nama hotel atau kota).json_encode($data)
mengekspor hasil query ke dalam format JSON.
Membuat Antarmuka Pengguna (index.html)
Di sisi klien, kita akan menyiapkan sebuah halaman HTML dengan kolom pencarian untuk nama hotel atau kota.
Setiap kali pengguna mengetik kata kunci, Ajax akan dikirim ke searchHotel.php
untuk memuat data hotel terkait.
Pada artikel ini kita memanfaatkan jQuery untuk menangani Ajax dengan mudah.
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Pencarian Hotel 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;
}
.hotel-card {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.hotel-card h3 {
margin: 0 0 5px 0;
}
.hotel-card p {
margin: 5px 0;
}
</style>
</head>
<body>
<h1>Halaman Pencarian Hotel</h1>
<p>
Masukkan nama hotel atau kota untuk mencari daftar hotel yang tersedia.
</p>
<div>
<label for="search-input">Kata Kunci:</label>
<input type="text" id="search-input" placeholder="Cari hotel atau kota..." />
</div>
<div id="search-results"></div>
<script>
$(document).ready(function() {
// Fungsi untuk melakukan Ajax request
function searchHotels(keyword) {
$.ajax({
url: 'searchHotel.php',
type: 'GET',
data: { keyword: keyword },
dataType: 'json',
success: function(response) {
// Kosongkan elemen hasil pencarian
$('#search-results').empty();
if(response.length > 0) {
// Loop melalui data hasil pencarian
$.each(response, function(index, hotel) {
let hotelHTML = `
<div class="hotel-card">
<h3>${hotel.hotel_name}</h3>
<p>Lokasi: ${hotel.city}</p>
<p>Harga: Rp ${parseFloat(hotel.price).toLocaleString('id-ID')}</p>
<p>Rating: ${hotel.rating}</p>
</div>
`;
$('#search-results').append(hotelHTML);
});
} else {
$('#search-results').html('<p>Tidak ada hotel yang cocok dengan kata kunci.</p>');
}
},
error: function() {
$('#search-results').html('<p>Terjadi kesalahan saat memuat data.</p>');
}
});
}
// Event saat pengguna mengetik di kolom pencarian
$('#search-input').on('keyup', function() {
let keyword = $(this).val().trim();
// Panggil fungsi Ajax hanya jika pengguna memasukkan minimal 1 karakter
if (keyword.length > 0) {
searchHotels(keyword);
} else {
// Kosongkan hasil jika tidak ada input
$('#search-results').empty();
}
});
});
</script>
</body>
</html>
#search-input
adalah kolom tempat pengguna mengetik kata kunci pencarian.searchHotels(keyword)
adalah fungsi Ajax yang akan dipanggil tiap kali ada perubahan input (keyup).- Data yang berhasil diambil dari server di-loop untuk ditampilkan pada
id="search-results"
.
Teknik Debounce untuk Optimasi
Jika jumlah hotel di database Anda sangat besar, memicu Ajax terus-menerus untuk setiap ketukan tombol dapat membebani server. Salah satu solusi adalah menerapkan debounce. Dengan metode ini, permintaan Ajax hanya dikirim setelah pengguna berhenti mengetik selama kurun waktu tertentu.
let debounceTimer;
$('#search-input').on('keyup', function() {
let keyword = $(this).val().trim();
clearTimeout(debounceTimer);
debounceTimer = setTimeout(function() {
if (keyword.length > 0) {
searchHotels(keyword);
} else {
$('#search-results').empty();
}
}, 300); // Debounce selama 300ms
});
Dengan demikian, server tidak akan dibanjiri permintaan dan performa aplikasi menjadi lebih stabil.
Menyempurnakan Fitur Pencarian
- Filter Harga: Menambahkan filter rentang harga (contoh: 0 - 1.000.000, 1.000.000 - 2.000.000, dsb.).
- Filter Rating: Menyediakan opsi menampilkan hotel dengan rating minimal 4, 3, atau 2 bintang.
- Pagination: Untuk database besar, tampilkan hasil secara bertahap (misal 10 hotel per halaman).
- Sorting: Memungkinkan pengguna mengurutkan hasil pencarian berdasarkan harga termurah, rating tertinggi, atau nama hotel.
- Auto Suggestion: Menampilkan saran nama kota atau hotel saat pengguna mengetik (serupa autocomplete).
Pengujian
Beberapa skenario pengujian perlu dilakukan untuk memastikan halaman pencarian hotel berfungsi optimal:
- Pencarian Kosong: Pengguna mengetik karakter lalu menghapusnya; pastikan hasil pencarian kembali kosong.
- Kata Kunci Tidak Ada: Pastikan pesan yang sesuai (“Tidak ada hotel yang cocok…”) muncul bila tidak ditemukan.
- Penanganan Error: Matikan database atau ubah
searchHotel.php
untuk mensimulasikan kegagalan koneksi, cek apakah pesan error tampil. - Respons Waktu: Uji coba pada jaringan lambat untuk memastikan aplikasi masih responsif dan menampilkan notifikasi yang jelas saat proses memakan waktu lama.
Keamanan Tambahan
Beberapa hal yang bisa dilakukan untuk meningkatkan keamanan dan kualitas kode:
- Prepared Statements: Gunakan prepared statements untuk mencegah SQL Injection.
- Validasi Input: Batasi jenis karakter yang boleh dikirim di
keyword
. Jika ingin mencari berdasarkan kota atau nama hotel, bisa juga gunakan whitelist. - Escaping Output: Jika menampilkan data yang diambil dari database ke halaman, pertimbangkan mekanisme HTML escaping agar terhindar dari serangan XSS.
- Log dan Monitoring: Untuk aplikasi berskala besar, gunakan mekanisme logging agar developer mudah mengawasi performa query dan mendeteksi potensi error.
Baca Juga :