Cara Membuat Search Engine dengan PHP dan MySQL

| | | PHP
Cara Membuat Search Engine dengan PHP dan MySQL

Fitur pencarian atau search engine adalah komponen penting di hampir setiap website. Dengan search engine, pengguna bisa menemukan data dengan cepat tanpa harus menelusuri halaman satu per satu. Membuat search engine dengan PHP dan MySQL sebenarnya cukup straightforward.

Dalam tutorial ini, kita akan membuat search engine yang bisa mencari data di database MySQL, menampilkan hasil dengan highlight kata kunci, pagination, dan filter berdasarkan kategori.

Fitur Search Engine yang Akan Dibuat

  • Pencarian dasar dengan LIKE query
  • Pencarian FULLTEXT untuk hasil yang lebih akurat
  • Highlight kata kunci di hasil pencarian
  • Pagination untuk hasil pencarian yang banyak
  • Filter kategori untuk mempersempit hasil
  • Search suggestion — saran pencarian saat mengetik

Persiapan

  • XAMPP/Laragon yang sudah berjalan
  • PHP 7.4+
  • MySQL

Langkah 1: Membuat Database

CREATE DATABASE search_engine_db;
USE search_engine_db;

CREATE TABLE artikel (
    id INT AUTO_INCREMENT PRIMARY KEY,
    judul VARCHAR(200) NOT NULL,
    isi TEXT NOT NULL,
    kategori VARCHAR(50) NOT NULL,
    penulis VARCHAR(100) NOT NULL,
    tanggal_post DATE NOT NULL,
    views INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FULLTEXT(judul, isi)
) ENGINE=InnoDB;

INSERT INTO artikel (judul, isi, kategori, penulis, tanggal_post, views) VALUES
('Cara Install PHP di Windows 10', 'Panduan lengkap cara install PHP di Windows 10 menggunakan XAMPP dan Laragon. Termasuk konfigurasi environment variable dan testing PHP di CMD.', 'Tutorial', 'Sigit N', '2026-01-15', 1520),
('Tutorial MySQL untuk Pemula', 'Belajar MySQL dari nol. Cara install MySQL, membuat database, membuat tabel, dan perintah dasar SQL seperti SELECT, INSERT, UPDATE, DELETE.', 'Tutorial', 'Sigit N', '2026-01-20', 2340),
('Membuat CRUD dengan PHP dan MySQL', 'Tutorial step by step membuat aplikasi CRUD (Create, Read, Update, Delete) dengan PHP dan MySQL. Dilengkapi dengan form validasi dan pagination.', 'Tutorial', 'Sigit N', '2026-02-01', 3100),
('Apa itu REST API?', 'Penjelasan lengkap tentang REST API, metode HTTP (GET, POST, PUT, DELETE), format JSON, dan cara membuat REST API sederhana dengan PHP.', 'Konsep', 'Sigit N', '2026-02-10', 1890),
('Panduan Lengkap Laravel untuk Pemula', 'Belajar framework Laravel dari nol. Instalasi, routing, controller, model, view, migration, dan membuat aplikasi web pertama dengan Laravel.', 'Tutorial', 'Sigit N', '2026-02-15', 4500),
('Cara Deploy Website di Vercel', 'Tutorial cara deploy website statis dan aplikasi web di Vercel. Termasuk custom domain, environment variable, dan auto deploy dari GitHub.', 'Hosting', 'Sigit N', '2026-03-01', 980),
('Perbedaan GET dan POST dalam HTTP', 'Penjelasan perbedaan metode GET dan POST dalam protokol HTTP. Kapan menggunakan GET dan kapan menggunakan POST, serta keamanannya.', 'Konsep', 'Sigit N', '2026-03-05', 2100),
('Tips Optimasi Database MySQL', 'Cara mengoptimasi performa database MySQL dengan indexing, query optimization, caching, dan konfigurasi server MySQL untuk aplikasi yang lebih cepat.', 'Tips', 'Sigit N', '2026-03-10', 1750),
('Belajar JavaScript Async Await', 'Panduan lengkap menggunakan async/await di JavaScript untuk menangani operasi asinkron. Perbandingan dengan callback dan promise.', 'Tutorial', 'Sigit N', '2026-03-15', 1230),
('Cara Membuat Form Login dengan PHP', 'Tutorial membuat sistem login dengan PHP dan MySQL. Termasuk password hashing, session management, dan proteksi dari SQL injection.', 'Tutorial', 'Sigit N', '2026-03-20', 3800);

Perhatikan baris FULLTEXT(judul, isi) — ini membuat index FULLTEXT pada kolom judul dan isi untuk pencarian yang lebih cepat dan akurat.

Langkah 2: Struktur Folder

search-engine/
├── config/
│   └── database.php
├── css/
│   └── style.css
├── index.php
├── hasil.php
├── suggest.php
└── functions.php

Langkah 3: Koneksi Database

Buat file config/database.php:

<?php
$host = 'localhost';
$dbname = 'search_engine_db';
$username = 'root';
$password = '';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die('Koneksi database gagal: ' . $e->getMessage());
}

Langkah 4: Fungsi Pencarian

Buat file functions.php:

<?php

/**
 * Pencarian menggunakan LIKE — cocok untuk data kecil
 */
function cariDenganLike($pdo, $kata, $kategori = '', $page = 1, $per_page = 5) {
    $offset = ($page - 1) * $per_page;
    $kata_like = '%' . $kata . '%';

    // Query dasar
    $where = "WHERE judul LIKE ? OR isi LIKE ? OR penulis LIKE ?";
    $params = [$kata_like, $kata_like, $kata_like];

    // Tambah filter kategori jika ada
    if (!empty($kategori)) {
        $where .= " AND kategori = ?";
        $params[] = $kategori;
    }

    // Hitung total hasil
    $stmt_count = $pdo->prepare("SELECT COUNT(*) FROM artikel $where");
    $stmt_count->execute($params);
    $total = $stmt_count->fetchColumn();

    // Ambil data dengan pagination
    $params[] = $per_page;
    $params[] = $offset;
    $stmt = $pdo->prepare("SELECT * FROM artikel $where ORDER BY views DESC LIMIT ? OFFSET ?");
    $stmt->bindValue(count($params) - 1, $per_page, PDO::PARAM_INT);
    $stmt->bindValue(count($params), $offset, PDO::PARAM_INT);

    // Bind params lainnya
    for ($i = 0; $i < count($params) - 2; $i++) {
        $stmt->bindValue($i + 1, $params[$i]);
    }

    $stmt->execute();
    $hasil = $stmt->fetchAll();

    return [
        'data' => $hasil,
        'total' => $total,
        'total_pages' => ceil($total / $per_page),
        'page' => $page
    ];
}

/**
 * Pencarian menggunakan FULLTEXT — lebih cepat dan akurat untuk data besar
 */
function cariDenganFulltext($pdo, $kata, $kategori = '', $page = 1, $per_page = 5) {
    $offset = ($page - 1) * $per_page;

    $where = "WHERE MATCH(judul, isi) AGAINST(? IN BOOLEAN MODE)";
    $params = [$kata];

    if (!empty($kategori)) {
        $where .= " AND kategori = ?";
        $params[] = $kategori;
    }

    // Hitung total
    $stmt_count = $pdo->prepare("SELECT COUNT(*) FROM artikel $where");
    $stmt_count->execute($params);
    $total = $stmt_count->fetchColumn();

    // Ambil data dengan relevansi
    $params[] = $per_page;
    $params[] = $offset;

    $sql = "SELECT *, MATCH(judul, isi) AGAINST(? IN BOOLEAN MODE) AS relevansi
            FROM artikel $where
            ORDER BY relevansi DESC
            LIMIT ? OFFSET ?";

    $stmt = $pdo->prepare($sql);
    $all_params = array_merge([$kata], $params);

    for ($i = 0; $i < count($all_params); $i++) {
        $bind_type = is_int($all_params[$i]) ? PDO::PARAM_INT : PDO::PARAM_STR;
        $stmt->bindValue($i + 1, $all_params[$i], $bind_type);
    }

    $stmt->execute();
    $hasil = $stmt->fetchAll();

    return [
        'data' => $hasil,
        'total' => $total,
        'total_pages' => ceil($total / $per_page),
        'page' => $page
    ];
}

/**
 * Highlight kata kunci di dalam teks
 */
function highlight($teks, $kata, $panjang = 200) {
    // Potong teks
    if (strlen($teks) > $panjang) {
        // Cari posisi kata kunci
        $pos = stripos($teks, $kata);
        if ($pos !== false) {
            $mulai = max(0, $pos - 80);
            $teks = substr($teks, $mulai, $panjang);
            if ($mulai > 0) $teks = '...' . $teks;
            if (strlen($teks) >= $panjang) $teks .= '...';
        } else {
            $teks = substr($teks, 0, $panjang) . '...';
        }
    }

    // Highlight kata kunci dengan tag <mark>
    $kata_escaped = preg_quote($kata, '/');
    $teks = preg_replace("/($kata_escaped)/i", '<mark>$1</mark>', $teks);

    return $teks;
}

/**
 * Mendapatkan daftar kategori
 */
function getKategori($pdo) {
    $stmt = $pdo->query('SELECT DISTINCT kategori FROM artikel ORDER BY kategori');
    return $stmt->fetchAll(PDO::FETCH_COLUMN);
}

Penjelasan:

  • cariDenganLike() — pencarian dengan operator LIKE, cocok untuk data kecil-menengah
  • cariDenganFulltext() — pencarian dengan FULLTEXT INDEX, lebih cepat untuk data besar dan mendukung relevansi
  • highlight() — menandai kata kunci dengan tag <mark> agar terlihat di hasil pencarian
  • getKategori() — mengambil daftar kategori untuk filter

Langkah 5: Halaman Utama (Form Pencarian)

Buat file index.php:

<?php
require_once 'config/database.php';
require_once 'functions.php';

$kategori_list = getKategori($pdo);
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Search Engine - PemburuKode</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <div class="search-wrapper">
        <div class="search-box">
            <h1>Cari Artikel</h1>
            <p class="subtitle">Temukan tutorial pemrograman, tips, dan konsep yang kamu butuhkan</p>

            <form action="hasil.php" method="GET" class="search-form">
                <div class="search-input-group">
                    <input type="text" name="q" id="search-input" placeholder="Ketik kata kunci pencarian..."
                           autocomplete="off" required value="<?= htmlspecialchars($_GET['q'] ?? '') ?>">
                    <button type="submit" class="btn-search">Cari</button>
                </div>

                <div class="search-filters">
                    <label>Kategori:</label>
                    <select name="kategori">
                        <option value="">Semua Kategori</option>
                        <?php foreach ($kategori_list as $kat): ?>
                            <option value="<?= $kat ?>"><?= ucfirst($kat) ?></option>
                        <?php endforeach; ?>
                    </select>

                    <label>Mode:</label>
                    <select name="mode">
                        <option value="fulltext">Pencarian Cerdas (FULLTEXT)</option>
                        <option value="like">Pencarian Dasar (LIKE)</option>
                    </select>
                </div>
            </form>

            <!-- Search Suggestion -->
            <div id="suggestions" class="suggestions"></div>

            <div class="popular-searches">
                <h3>Pencarian Populer:</h3>
                <div class="tags">
                    <a href="hasil.php?q=php+mysql">PHP MySQL</a>
                    <a href="hasil.php?q=laravel">Laravel</a>
                    <a href="hasil.php?q=rest+api">REST API</a>
                    <a href="hasil.php?q=javascript">JavaScript</a>
                    <a href="hasil.php?q=login">Login PHP</a>
                </div>
            </div>
        </div>
    </div>

    <script>
        // Search suggestion dengan AJAX
        const input = document.getElementById('search-input');
        const suggestionsBox = document.getElementById('suggestions');
        let timeout;

        input.addEventListener('input', function() {
            clearTimeout(timeout);
            const query = this.value.trim();

            if (query.length < 2) {
                suggestionsBox.innerHTML = '';
                return;
            }

            timeout = setTimeout(() => {
                fetch('suggest.php?q=' + encodeURIComponent(query))
                    .then(res => res.json())
                    .then(data => {
                        if (data.length === 0) {
                            suggestionsBox.innerHTML = '';
                            return;
                        }
                        suggestionsBox.innerHTML = data.map(item =>
                            `<div class="suggestion-item" onclick="selectSuggestion('${item.judul.replace(/'/g, "\\'")}')">
                                <strong>${item.judul}</strong>
                                <small>${item.kategori}</small>
                            </div>`
                        ).join('');
                    });
            }, 300);
        });

        function selectSuggestion(judul) {
            input.value = judul;
            suggestionsBox.innerHTML = '';
            document.querySelector('.search-form').submit();
        }

        // Tutup suggestions saat klik di luar
        document.addEventListener('click', function(e) {
            if (!e.target.closest('.search-input-group') && !e.target.closest('.suggestions')) {
                suggestionsBox.innerHTML = '';
            }
        });
    </script>
</body>
</html>

Langkah 6: Halaman Hasil Pencarian

Buat file hasil.php:

<?php
require_once 'config/database.php';
require_once 'functions.php';

$kata = trim($_GET['q'] ?? '');
$kategori = $_GET['kategori'] ?? '';
$mode = $_GET['mode'] ?? 'fulltext';
$page = max(1, (int)($_GET['page'] ?? 1));
$per_page = 5;

if (empty($kata)) {
    header('Location: index.php');
    exit;
}

// Pilih mode pencarian
if ($mode === 'fulltext') {
    $hasil = cariDenganFulltext($pdo, $kata, $kategori, $page, $per_page);
} else {
    $hasil = cariDenganLike($pdo, $kata, $kategori, $page, $per_page);
}

$kategori_list = getKategori($pdo);
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hasil Pencarian: <?= htmlspecialchars($kata) ?></title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <div class="result-wrapper">
        <!-- Search Bar -->
        <div class="result-header">
            <a href="index.php" class="logo">Search Engine</a>
            <form action="hasil.php" method="GET" class="result-search-form">
                <input type="text" name="q" value="<?= htmlspecialchars($kata) ?>" placeholder="Cari lagi...">
                <input type="hidden" name="mode" value="<?= $mode ?>">
                <button type="submit">Cari</button>
            </form>
        </div>

        <!-- Info Hasil -->
        <div class="result-info">
            <p>Ditemukan <strong><?= $hasil['total'] ?></strong> hasil untuk "<strong><?= htmlspecialchars($kata) ?></strong>"
            <?php if ($kategori): ?>
                di kategori <strong><?= ucfirst($kategori) ?></strong>
            <?php endif; ?>
            </p>
        </div>

        <!-- Daftar Hasil -->
        <div class="result-list">
            <?php if (empty($hasil['data'])): ?>
                <div class="no-result">
                    <h3>Tidak ada hasil ditemukan</h3>
                    <p>Coba gunakan kata kunci lain atau perbaiki ejaan.</p>
                </div>
            <?php else: ?>
                <?php foreach ($hasil['data'] as $item): ?>
                    <div class="result-item">
                        <div class="result-category"><?= ucfirst($item['kategori']) ?></div>
                        <h2 class="result-title">
                            <?= highlight($item['judul'], $kata, 300) ?>
                        </h2>
                        <p class="result-snippet">
                            <?= highlight($item['isi'], $kata) ?>
                        </p>
                        <div class="result-meta">
                            <span>Penulis: <?= htmlspecialchars($item['penulis']) ?></span>
                            <span>Tanggal: <?= date('d/m/Y', strtotime($item['tanggal_post'])) ?></span>
                            <span>Views: <?= number_format($item['views']) ?></span>
                        </div>
                    </div>
                <?php endforeach; ?>
            <?php endif; ?>
        </div>

        <!-- Pagination -->
        <?php if ($hasil['total_pages'] > 1): ?>
            <div class="pagination">
                <?php
                $params = http_build_query([
                    'q' => $kata,
                    'kategori' => $kategori,
                    'mode' => $mode
                ]);

                if ($page > 1): ?>
                    <a href="?<?= $params ?>&page=<?= $page - 1 ?>" class="page-link">&laquo; Prev</a>
                <?php endif;

                for ($i = 1; $i <= $hasil['total_pages']; $i++): ?>
                    <a href="?<?= $params ?>&page=<?= $i ?>" class="page-link <?= $i === $page ? 'active' : '' ?>"><?= $i ?></a>
                <?php endfor;

                if ($page < $hasil['total_pages']): ?>
                    <a href="?<?= $params ?>&page=<?= $page + 1 ?>" class="page-link">Next &raquo;</a>
                <?php endif; ?>
            </div>
        <?php endif; ?>
    </div>
</body>
</html>

Langkah 7: Search Suggestion (AJAX)

Buat file suggest.php:

<?php
header('Content-Type: application/json');
require_once 'config/database.php';

$kata = trim($_GET['q'] ?? '');

if (strlen($kata) < 2) {
    echo json_encode([]);
    exit;
}

$stmt = $pdo->prepare('SELECT id, judul, kategori FROM artikel WHERE judul LIKE ? ORDER BY views DESC LIMIT 5');
$stmt->execute(['%' . $kata . '%']);
$hasil = $stmt->fetchAll();

echo json_encode($hasil, JSON_UNESCAPED_UNICODE);

Langkah 8: CSS Styling

Buat file css/style.css:

* { margin: 0; padding: 0; box-sizing: border-box; }

body {
    font-family: 'Segoe UI', Arial, sans-serif;
    background: #f9fafb;
    color: #1f2937;
}

/* Halaman Utama */
.search-wrapper {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 80vh;
    padding: 20px;
}

.search-box {
    max-width: 650px;
    width: 100%;
    text-align: center;
}

.search-box h1 {
    font-size: 36px;
    color: #1e293b;
    margin-bottom: 10px;
}

.subtitle {
    color: #6b7280;
    margin-bottom: 30px;
}

.search-form {
    text-align: left;
}

.search-input-group {
    display: flex;
    gap: 0;
    margin-bottom: 15px;
}

.search-input-group input {
    flex: 1;
    padding: 14px 18px;
    border: 2px solid #d1d5db;
    border-right: none;
    border-radius: 8px 0 0 8px;
    font-size: 16px;
    outline: none;
}

.search-input-group input:focus {
    border-color: #3b82f6;
}

.btn-search {
    padding: 14px 28px;
    background: #3b82f6;
    color: white;
    border: none;
    border-radius: 0 8px 8px 0;
    font-size: 16px;
    cursor: pointer;
}

.btn-search:hover { background: #2563eb; }

.search-filters {
    display: flex;
    gap: 10px;
    align-items: center;
    flex-wrap: wrap;
}

.search-filters label {
    font-size: 14px;
    color: #6b7280;
}

.search-filters select {
    padding: 8px 12px;
    border: 1px solid #d1d5db;
    border-radius: 6px;
    font-size: 14px;
}

/* Suggestions */
.suggestions {
    position: relative;
    z-index: 10;
}

.suggestion-item {
    background: white;
    padding: 10px 15px;
    border: 1px solid #e5e7eb;
    border-top: none;
    cursor: pointer;
    display: flex;
    justify-content: space-between;
    text-align: left;
}

.suggestion-item:hover { background: #f3f4f6; }
.suggestion-item small { color: #6b7280; }

/* Popular Searches */
.popular-searches {
    margin-top: 30px;
    text-align: left;
}

.popular-searches h3 {
    font-size: 14px;
    color: #6b7280;
    margin-bottom: 10px;
}

.tags { display: flex; gap: 8px; flex-wrap: wrap; }

.tags a {
    padding: 6px 14px;
    background: #e5e7eb;
    color: #374151;
    border-radius: 20px;
    text-decoration: none;
    font-size: 13px;
}

.tags a:hover { background: #d1d5db; }

/* Halaman Hasil */
.result-wrapper {
    max-width: 750px;
    margin: 0 auto;
    padding: 20px;
}

.result-header {
    display: flex;
    gap: 20px;
    align-items: center;
    margin-bottom: 20px;
    padding-bottom: 15px;
    border-bottom: 1px solid #e5e7eb;
}

.logo {
    font-size: 20px;
    font-weight: bold;
    color: #3b82f6;
    text-decoration: none;
    white-space: nowrap;
}

.result-search-form {
    display: flex;
    flex: 1;
}

.result-search-form input {
    flex: 1;
    padding: 10px 14px;
    border: 1px solid #d1d5db;
    border-radius: 6px 0 0 6px;
    font-size: 14px;
    outline: none;
}

.result-search-form button {
    padding: 10px 18px;
    background: #3b82f6;
    color: white;
    border: none;
    border-radius: 0 6px 6px 0;
    cursor: pointer;
}

.result-info {
    color: #6b7280;
    font-size: 14px;
    margin-bottom: 20px;
}

/* Result Item */
.result-item {
    background: white;
    padding: 20px;
    border-radius: 8px;
    margin-bottom: 15px;
    border: 1px solid #e5e7eb;
}

.result-category {
    display: inline-block;
    padding: 3px 10px;
    background: #dbeafe;
    color: #1d4ed8;
    border-radius: 12px;
    font-size: 12px;
    margin-bottom: 8px;
}

.result-title {
    font-size: 18px;
    margin-bottom: 8px;
}

.result-title a {
    color: #1d4ed8;
    text-decoration: none;
}

.result-title a:hover { text-decoration: underline; }

.result-snippet {
    color: #4b5563;
    font-size: 14px;
    line-height: 1.6;
    margin-bottom: 10px;
}

.result-snippet mark {
    background: #fef08a;
    padding: 1px 3px;
    border-radius: 2px;
}

.result-meta {
    display: flex;
    gap: 15px;
    font-size: 12px;
    color: #9ca3af;
}

.no-result {
    text-align: center;
    padding: 40px;
    color: #6b7280;
}

/* Pagination */
.pagination {
    display: flex;
    justify-content: center;
    gap: 5px;
    margin-top: 30px;
}

.page-link {
    padding: 8px 14px;
    border: 1px solid #d1d5db;
    border-radius: 4px;
    text-decoration: none;
    color: #374151;
    font-size: 14px;
}

.page-link:hover { background: #f3f4f6; }
.page-link.active { background: #3b82f6; color: white; border-color: #3b82f6; }

/* Responsive */
@media (max-width: 600px) {
    .result-header { flex-direction: column; }
    .search-input-group { flex-direction: column; }
    .search-input-group input { border-radius: 8px; border-right: 2px solid #d1d5db; }
    .btn-search { border-radius: 8px; }
}

LIKE vs FULLTEXT: Kapan Menggunakan yang Mana?

FiturLIKEFULLTEXT
KecepatanLambat untuk data besarCepat bahkan untuk data besar
AkurasiMencocokkan substringMencocokkan kata lengkap
RelevansiTidak adaAda skor relevansi
Wildcard%kata%+kata -kata kata*
Cocok untukData < 10.000 barisData > 10.000 baris
BahasaSemuaButuh parser (default English)

Tips: Untuk pencarian bahasa Indonesia, gunakan LIKE karena FULLTEXT default menggunakan parser bahasa Inggris. Atau gunakan library eksternal seperti Elasticsearch untuk hasil yang lebih baik.

Praktik Terbaik

Beberapa tips saat menulis kode PHP:

  1. Gunakan prepared statement — Hindari SQL injection dengan menggunakan PDO atau MySQLi prepared statement, jangan concatenate query secara langsung.
  2. Validasi input — Selalu validasi dan sanitasi data dari user menggunakan filter_var(), htmlspecialchars(), atau library validasi.
  3. Error reporting — Saat development, aktifkan error_reporting(E_ALL) dan display_errors untuk memudahkan debugging.
  4. Gunakan autoloading — Manfaatkan Composer autoload atau PSR-4 untuk mengelola file class secara otomatis.
  5. Pisahkan logic dan view — Gunakan pola MVC atau minimal pisahkan kode PHP dan HTML agar lebih rapi dan mudah dipelihara.

Dengan menerapkan praktik di atas, kode PHP Anda akan lebih aman, bersih, dan mudah dikembangkan.

Kesimpulan

Search engine dengan PHP dan MySQL bisa dibuat dengan beberapa pendekatan:

  1. LIKE query — sederhana, cocok untuk data kecil
  2. FULLTEXT — cepat dan akurat untuk data besar
  3. Highlight — menandai kata kunci di hasil pencarian
  4. Pagination — membagi hasil ke beberapa halaman
  5. AJAX suggestion — memberikan saran pencarian saat mengetik

Kombinasi semua fitur ini menghasilkan search engine yang user-friendly dan performant untuk website kamu.

Sigit N avatar
Tentang Sigit N
Full-stack developer & technical writer. Berpengalaman di PHP, Laravel, NodeJS, MySQL, dan Python. Aktif menulis tutorial pemrograman dan maintaining open-source projects di PemburuKode sejak 2021.