Masalah yang muncul
Search
Enggine merupakan komponen fundamental, hampir semua aplikasi berbasis web
menggunakan search engine, degan search engine mereka dapat menyari suata data
dari banyak data yang ada di database. Masalah ini saya dapat ketika hampir semua orang mencari data dan
mengetikan di kolom search engine tidak sesuai dengan data yang ada di
database. SQL adalah bahasa yang tepat untuk masukan yang sesuai persis dengan
data dalam database.
Solusi
Kebanyakan orang
membuat SQL queri menggunakan wildcard (%). Script yang saya bagikan ini sangat
bermanfaat buat penggunanya dan dapat mengexplore isi database sesuai yang di
inginkan, misalkan ingin mencari data karyawan dengan nama, maka mereka akan membutuhkan semua data nama karyawan. coba lihat script dibawah ini
SELECT name, street_address, phone FROM employees WHERE name = '$users_input'
Dalam contoh
ini, kesederhanaan mengabaikan jelas resiko SQL injection, informasi karyawan
hanya dapat diambil jika pengguna memasukan dengan nama yang tepat. Misalkan mencari
“tum” ketika nama karyawan dalam database adalah “tumiem” tidak mendapatkan
hasil apa-apa jika ini menggunakan wildcard(%). Disini saya ingin
membagikan cara mencari nama karyawan
hanya dengan bagian dari nama karyawan tersebut dan mendapatkan hasil yang sesuai. Lihat script dibawah ini.
SELECT name, street_address, phone FROM employees WHERE name LIKE '%$users_input%'
Perhatikan wildcard(%)
yang berada di antara user_input, sebagian wildcard(%). Akan cocok setiap mencari
nama “tum” dengan queri “tumiem” dengan script yang digunakan bukan
=, sebagai wildcard(%) tidak akan kompetibel jika mengunakan =,
Mesin Pencarian Mengunakan Wildcard
<?php
$q = $_POST['q'];
$search = $db->prepare("SELECT `id`, `name` FROM `users` WHERE `name` LIKE ?");
$search->execute(array("%$q%"));
foreach($search as $s) {
echo $s['name'];
}
?>
Namun script
diatas agak terbatas, saya menggunakan
metode ini untuk mencari database sementara waktu dan saat itu bekerja secara
memadai dan efisien, namun tidak sesuai permintaan pengguna, masih tidak bisa
menampilkan hasil yang relevan, seharusnya bisa menampilkan hasil yang sama
persis sesuai yang ada di database, misalkan saya mencari nama “tum” maka jika
di database namanya “tumiem” maka tidak akan mendapatkan hasil apapun. Wildcard
membantu mengambil data yang sesuai permintaan pengguna.
Alternatif
SQL mempunyai
batasan untuk menyelesaikan masalah, sehingga satu-satunya solusi yaitu
mengunakan PHP untuk menyaring hasil, kelemahan dari solusi ini jika semua
baris dalam database yang diperlukan untuk diperoleh dan kemudian diurutkan.
Fungsi PHP yang terutama adalah lenshtein(), yang menghitung jarak atau
jumlah karakter. Dan metaphone() yang berfungsi menghitung string atau jarak
fonetika antara dua baris. Lihat script di bawah ini
<?php
$q = $_POST['q'];
$results = array();
foreach($db->query('SELECT `id`, `name` FROM `employees`') as $name) {
if (levenshtein(metaphone($q), metaphone($name['name'])) < 3) {
array_push($results,$name['name']);
}
}
foreach ($results as $result) {
echo $result."\n";
}
?>
Untuk
menambah atau mengurangi apa yang dianggap relevan, ubah jarak minimum ke nomor
yang berbeda, jumlah yang lebih tinggi akan mencakup lebih luas hasil
seddangkan angka yang lebik kecil cakupanya akan sedikit pula.
Tidak terrasa sudah 3 jam membuat tutorial, maklumin aja tidak bisa ngarang tulisan, makanya kata-nya belepotan, yang penting ngerti maksudnya,, heheheh
No comments:
Post a Comment