Wednesday, August 23, 2017

Search Engine dengan PHP, PDO & MySQL

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