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();
?>