kbbi kode

 <?php

// Koneksi ke database

$host = 'localhost';

$username = 'root';

$password = '';

$database = 'kkbi_dictionary';


$conn = new mysqli($host, $username, $password, $database);


if ($conn->connect_error) {

    die("Koneksi gagal: " . $conn->connect_error);

}


// Fungsi untuk membersihkan input

function cleanInput($data) {

    return htmlspecialchars(stripslashes(trim($data)));

}


// Fungsi untuk memproses data dari file teks

function processTextData($file_path) {

    global $conn;

    

    // Kosongkan tabel sebelum import data baru

    $conn->query("TRUNCATE TABLE kkbi");

    

    $content = file_get_contents($file_path);

    $lines = explode("\n", $content);

    

    $current_word = '';

    $current_type = '';

    $current_definition = '';

    $current_example = '';

    $word_count = 0;

    

    foreach ($lines as $line) {

        $line = trim($line);

        

        if (empty($line)) continue;

        

        // Skip header dan bagian metadata

        if (strpos($line, 'KAMUS') !== false || 

            strpos($line, 'PUSAT BAHASA') !== false ||

            strpos($line, 'TIM REDAKSI') !== false ||

            strpos($line, 'PRAKATA') !== false ||

            strpos($line, 'SAMBUTAN') !== false ||

            strpos($line, 'DAFTAR ISI') !== false ||

            strpos($line, 'PETUNJUK') !== false) {

            continue;

        }

        

        // Deteksi kata baru (format: kata n/v/a dll)

        if (preg_match('/^([a-zA-Z]+)\s+([nvaadvpronpnum]+)\s+(.+)/', $line, $matches)) {

            // Simpan data sebelumnya jika ada

            if (!empty($current_word)) {

                saveToDatabase($current_word, $current_type, $current_definition, $current_example);

                $word_count++;

            }

            

            // Reset untuk kata baru

            $current_word = $matches[1];

            $current_type = $matches[2];

            $current_definition = $matches[3];

            $current_example = '';

        }

        // Deteksi contoh penggunaan (dimulai dengan :)

        elseif (strpos($line, ':') !== false && !empty($current_word)) {

            $current_example .= $line . " ";

        }

        // Lanjutan definisi

        elseif (!empty($current_word)) {

            $current_definition .= " " . $line;

        }

    }

    

    // Simpan kata terakhir

    if (!empty($current_word)) {

        saveToDatabase($current_word, $current_type, $current_definition, $current_example);

        $word_count++;

    }

    

    return $word_count;

}


function saveToDatabase($word, $type, $definition, $example) {

    global $conn;

    

    $word = cleanInput($word);

    $type = cleanInput($type);

    $definition = cleanInput($definition);

    $example = cleanInput($example);

    

    // Batasi panjang definisi jika terlalu panjang

    if (strlen($definition) > 1000) {

        $definition = substr($definition, 0, 1000);

    }

    

    $sql = "INSERT INTO kkbi (kata, jenis_kata, definisi, contoh_penggunaan) 

            VALUES (?, ?, ?, ?)";

    

    $stmt = $conn->prepare($sql);

    $stmt->bind_param("ssss", $word, $type, $definition, $example);

    

    $stmt->execute();

    $stmt->close();

}


// Fungsi pencarian

function searchWord($search_term) {

    global $conn;

    

    $search_term = cleanInput($search_term);

    $sql = "SELECT * FROM kkbi WHERE kata LIKE ? ORDER BY kata";

    

    $stmt = $conn->prepare($sql);

    $search_param = "%$search_term%";

    $stmt->bind_param("s", $search_param);

    $stmt->execute();

    

    $result = $stmt->get_result();

    $words = [];

    

    while ($row = $result->fetch_assoc()) {

        $words[] = $row;

    }

    

    $stmt->close();

    return $words;

}


// Fungsi untuk mendapatkan statistik

function getStatistics() {

    global $conn;

    

    $stats = [

        'total_kata' => 0,

        'kata_terbaru' => []

    ];

    

    $result = $conn->query("SELECT COUNT(*) as total FROM kkbi");

    if ($result) {

        $stats['total_kata'] = $result->fetch_assoc()['total'];

    }

    

    $result = $conn->query("SELECT kata, jenis_kata FROM kkbi ORDER BY created_at DESC LIMIT 5");

    if ($result) {

        while ($row = $result->fetch_assoc()) {

            $stats['kata_terbaru'][] = $row;

        }

    }

    

    return $stats;

}


// Proses form

$search_results = [];

$import_message = '';

$stats = getStatistics();


if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // Pencarian kata

    if (isset($_POST['search'])) {

        $search_term = $_POST['search_term'];

        $search_results = searchWord($search_term);

    }

    

    // Import data dari file upload

    if (isset($_POST['import_data']) && isset($_FILES['txt_file'])) {

        $file = $_FILES['txt_file'];

        

        if ($file['error'] === UPLOAD_ERR_OK) {

            $allowed_types = ['text/plain', 'text/html'];

            $file_type = mime_content_type($file['tmp_name']);

            

            if (in_array($file_type, $allowed_types)) {

                $file_path = $file['tmp_name'];

                $word_count = processTextData($file_path);

                $import_message = "<div class='alert alert-success'>Berhasil mengimport $word_count kata ke database!</div>";

                $stats = getStatistics(); // Update statistik

            } else {

                $import_message = "<div class='alert alert-danger'>File harus berupa file teks (.txt)</div>";

            }

        } else {

            $import_message = "<div class='alert alert-danger'>Error dalam upload file: " . $file['error'] . "</div>";

        }

    }

}

?>


<!DOCTYPE html>

<html lang="id">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Kamus KBBI</title>

    <style>

        body {

            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;

            max-width: 1200px;

            margin: 0 auto;

            padding: 20px;

            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

            min-height: 100vh;

        }

        .container {

            background: white;

            padding: 30px;

            border-radius: 15px;

            box-shadow: 0 10px 30px rgba(0,0,0,0.2);

        }

        h1 {

            color: #2c3e50;

            text-align: center;

            margin-bottom: 10px;

            font-size: 2.5em;

        }

        .subtitle {

            text-align: center;

            color: #7f8c8d;

            margin-bottom: 30px;

            font-size: 1.1em;

        }

        .search-form {

            display: flex;

            gap: 10px;

            margin-bottom: 30px;

        }

        .search-form input {

            flex: 1;

            padding: 15px;

            border: 2px solid #e0e0e0;

            border-radius: 8px;

            font-size: 16px;

            transition: border-color 0.3s;

        }

        .search-form input:focus {

            outline: none;

            border-color: #3498db;

        }

        .search-form button {

            padding: 15px 25px;

            background: #3498db;

            color: white;

            border: none;

            border-radius: 8px;

            cursor: pointer;

            font-size: 16px;

            transition: background 0.3s;

        }

        .search-form button:hover {

            background: #2980b9;

        }

        .word-card {

            background: #f8f9fa;

            border-left: 5px solid #3498db;

            padding: 20px;

            margin-bottom: 20px;

            border-radius: 8px;

            transition: transform 0.2s;

        }

        .word-card:hover {

            transform: translateX(5px);

        }

        .word-header {

            display: flex;

            justify-content: space-between;

            align-items: center;

            margin-bottom: 15px;

        }

        .word {

            font-size: 28px;

            font-weight: bold;

            color: #2c3e50;

        }

        .type {

            background: #3498db;

            color: white;

            padding: 8px 15px;

            border-radius: 20px;

            font-size: 14px;

            font-weight: bold;

        }

        .definition {

            margin-bottom: 15px;

            line-height: 1.7;

            color: #34495e;

            font-size: 16px;

        }

        .example {

            background: #e8f4fc;

            padding: 15px;

            border-radius: 8px;

            font-style: italic;

            border-left: 3px solid #3498db;

            color: #2c3e50;

        }

        .import-section {

            margin-top: 40px;

            padding: 25px;

            background: #e8f4fc;

            border-radius: 10px;

            border: 2px dashed #3498db;

        }

        .file-upload {

            margin: 15px 0;

        }

        .file-upload input {

            padding: 10px;

            border: 1px solid #ddd;

            border-radius: 5px;

            width: 100%;

        }

        .import-btn {

            background: #27ae60;

            color: white;

            padding: 12px 25px;

            border: none;

            border-radius: 8px;

            cursor: pointer;

            font-size: 16px;

            transition: background 0.3s;

        }

        .import-btn:hover {

            background: #219a52;

        }

        .alert {

            padding: 15px;

            border-radius: 8px;

            margin-bottom: 20px;

            font-weight: bold;

        }

        .alert-success {

            background: #d4edda;

            color: #155724;

            border: 1px solid #c3e6cb;

        }

        .alert-danger {

            background: #f8d7da;

            color: #721c24;

            border: 1px solid #f5c6cb;

        }

        .stats-section {

            display: grid;

            grid-template-columns: 1fr 1fr;

            gap: 20px;

            margin-bottom: 30px;

        }

        .stat-card {

            background: #f8f9fa;

            padding: 20px;

            border-radius: 10px;

            border-left: 4px solid #3498db;

        }

        .stat-number {

            font-size: 2em;

            font-weight: bold;

            color: #3498db;

        }

        .recent-words {

            list-style: none;

            padding: 0;

        }

        .recent-words li {

            padding: 8px 0;

            border-bottom: 1px solid #eee;

        }

        .no-results {

            text-align: center;

            padding: 40px;

            color: #7f8c8d;

            font-size: 1.2em;

        }

        .results-count {

            color: #7f8c8d;

            margin-bottom: 20px;

            font-style: italic;

        }

    </style>

</head>

<body>

    <div class="container">

        <h1>📚 Kamus Besar Bahasa Indonesia</h1>

        <div class="subtitle">Kamus digital untuk pencarian kata dalam bahasa Indonesia</div>

        

        <!-- Statistik -->

        <div class="stats-section">

            <div class="stat-card">

                <h3>Total Kata</h3>

                <div class="stat-number"><?php echo number_format($stats['total_kata']); ?></div>

                <p>kata dalam database</p>

            </div>

            <div class="stat-card">

                <h3>Kata Terbaru</h3>

                <ul class="recent-words">

                    <?php foreach ($stats['kata_terbaru'] as $word): ?>

                        <li><strong><?php echo htmlspecialchars($word['kata']); ?></strong> <span class="type"><?php echo htmlspecialchars($word['jenis_kata']); ?></span></li>

                    <?php endforeach; ?>

                </ul>

            </div>

        </div>


        <!-- Form Pencarian -->

        <form method="POST" class="search-form">

            <input type="text" name="search_term" placeholder="Masukkan kata yang ingin dicari..." 

                   value="<?php echo isset($_POST['search_term']) ? htmlspecialchars($_POST['search_term']) : ''; ?>" 

                   required>

            <button type="submit" name="search">🔍 Cari</button>

        </form>


        <?php echo $import_message; ?>


        <!-- Hasil Pencarian -->

        <?php if (!empty($search_results)): ?>

            <div class="results-count">

                Ditemukan <?php echo count($search_results); ?> hasil untuk "<?php echo htmlspecialchars($_POST['search_term']); ?>"

            </div>

            <?php foreach ($search_results as $result): ?>

                <div class="word-card">

                    <div class="word-header">

                        <span class="word"><?php echo htmlspecialchars($result['kata']); ?></span>

                        <span class="type"><?php echo htmlspecialchars($result['jenis_kata']); ?></span>

                    </div>

                    <div class="definition"><?php echo nl2br(htmlspecialchars($result['definisi'])); ?></div>

                    <?php if (!empty($result['contoh_penggunaan'])): ?>

                        <div class="example">

                            <strong>Contoh:</strong> <?php echo htmlspecialchars($result['contoh_penggunaan']); ?>

                        </div>

                    <?php endif; ?>

                </div>

            <?php endforeach; ?>

        <?php elseif ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['search'])): ?>

            <div class="no-results">

                ❌ Kata "<?php echo htmlspecialchars($_POST['search_term']); ?>" tidak ditemukan dalam kamus.

            </div>

        <?php endif; ?>


        <!-- Section Import Data -->

        <div class="import-section">

            <h3>📥 Import Data KBBI</h3>

            <p>Upload file teks KBBI untuk mengimport data ke database.</p>

            <form method="POST" enctype="multipart/form-data">

                <div class="file-upload">

                    <input type="file" name="txt_file" accept=".txt" required>

                </div>

                <button type="submit" name="import_data" class="import-btn" 

                        onclick="return confirm('Data lama akan dihapus dan diganti dengan data baru. Lanjutkan?')">

                    📤 Upload & Import Data

                </button>

            </form>

            <p style="margin-top: 15px; font-size: 0.9em; color: #666;">

                <strong>Note:</strong> File harus berformat .txt. Data lama akan diganti dengan data baru.

            </p>

        </div>

    </div>


    <script>

        // Auto-focus pada input pencarian

        document.querySelector('input[name="search_term"]').focus();

        

        // Konfirmasi sebelum import

        document.querySelector('form[enctype="multipart/form-data"]').addEventListener('submit', function(e) {

            const fileInput = this.querySelector('input[type="file"]');

            if (fileInput.files.length === 0) {

                alert('Pilih file terlebih dahulu!');

                e.preventDefault();

            }

        });

    </script>

</body>

</html>


<?php

$conn->close();

?>