Koneksi Database MySQL
Database adalah tempat menyimpan data secara permanen dan terstruktur. MySQL adalah salah satu database paling populer dan sering dipasangkan dengan PHP.
Konsep Database
Bayangkan database seperti spreadsheet Excel:
Database = File Excel
Tabel = Sheet
Kolom = Header kolom
Baris = Data per baris
Contoh tabel siswa:
Setup MySQL dengan Laravel Herd
Herd Pro (dengan MySQL)
Jika kamu menggunakan Herd Pro, MySQL sudah termasuk:
- Klik icon Herd di menu bar
- Pergi ke Services → aktifkan MySQL
- MySQL akan berjalan di
localhost:3306
Herd Free (tanpa MySQL)
Jika menggunakan Herd versi gratis, kamu perlu install MySQL secara terpisah.
macOS (Homebrew)
# Install MySQL via Homebrew
brew install mysql
# Jalankan MySQL
brew services start mysql
# Login ke MySQL (default tanpa password)
mysql -u root
Windows / Linux
Pakai OS selain macOS?
Langkah install MySQL berbeda di setiap sistem operasi. Beberapa opsi:
- Windows — Download installer dari dev.mysql.com/downloads dan ikuti wizard-nya
- Linux (Ubuntu/Debian) — Jalankan
sudo apt install mysql-server
- Semua OS — Bisa juga pakai XAMPP yang sudah include MySQL
Cari tutorial spesifik untuk OS kamu di Google: "install MySQL [nama OS kamu]".
Atau tanya langsung ke NotebookLM yang sudah disiapkan khusus untuk materi ini:
👉 Buka NotebookLM — kamu bisa bertanya step-by-step sesuai OS yang kamu pakai.
Membuat Database
Buka terminal dan login ke MySQL:
Ketik perintah SQL berikut:
-- Membuat database baru
CREATE DATABASE belajar_web;
-- Gunakan database tersebut
USE belajar_web;
-- Membuat tabel buku_tamu
CREATE TABLE buku_tamu (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
pesan TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Cek tabel sudah dibuat
SHOW TABLES;
-- Lihat struktur tabel
DESCRIBE buku_tamu;
Penjelasan kolom:
Koneksi PHP ke MySQL (PDO)
PHP menyediakan beberapa cara koneksi ke database. Kita akan menggunakan PDO (PHP Data Objects) — cara yang paling modern dan aman.
File Koneksi
Buat file config/database.php:
<?php
// config/database.php — Koneksi ke database
$host = 'localhost';
$dbname = 'belajar_web';
$username = 'root';
$password = ''; // Default Herd/XAMPP kosong
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
} catch (PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
Penjelasan opsi PDO:
Test Koneksi
Buat file test-koneksi.php:
<?php
require 'config/database.php';
echo "<h1>✅ Koneksi Berhasil!</h1>";
echo "<p>Database: $dbname</p>";
echo "<p>Server: $host</p>";
// Test query sederhana
$stmt = $pdo->query("SELECT NOW() as waktu");
$row = $stmt->fetch();
echo "<p>Waktu server: " . $row['waktu'] . "</p>";
Buka http://belajar.test/test-koneksi.php — kalau muncul "Koneksi Berhasil", berarti sudah benar!
Query Dasar SQL
INSERT — Menambah Data
<?php
require 'config/database.php';
// ❌ JANGAN PERNAH seperti ini (SQL Injection!)
// $pdo->query("INSERT INTO buku_tamu (nama) VALUES ('$nama')");
// ✅ Gunakan Prepared Statement (AMAN)
$stmt = $pdo->prepare("INSERT INTO buku_tamu (nama, email, pesan) VALUES (?, ?, ?)");
$stmt->execute(["Ahmad", "ahmad@mail.com", "Halo, ini pesan pertama!"]);
echo "Data berhasil ditambahkan! ID: " . $pdo->lastInsertId();
SELECT — Mengambil Data
<?php
require 'config/database.php';
// Ambil semua data
$stmt = $pdo->query("SELECT * FROM buku_tamu ORDER BY created_at DESC");
$semua = $stmt->fetchAll();
foreach ($semua as $row) {
echo "<p><strong>{$row['nama']}</strong>: {$row['pesan']}</p>";
}
// Ambil satu data berdasarkan ID
$stmt = $pdo->prepare("SELECT * FROM buku_tamu WHERE id = ?");
$stmt->execute([1]);
$satu = $stmt->fetch();
if ($satu) {
echo "Nama: " . $satu['nama'];
} else {
echo "Data tidak ditemukan";
}
// Hitung jumlah data
$stmt = $pdo->query("SELECT COUNT(*) as total FROM buku_tamu");
$total = $stmt->fetch()['total'];
echo "Total data: $total";
UPDATE — Mengubah Data
<?php
require 'config/database.php';
$stmt = $pdo->prepare("UPDATE buku_tamu SET nama = ?, email = ? WHERE id = ?");
$stmt->execute(["Ahmad Fauzi", "fauzi@mail.com", 1]);
echo "Data berhasil diupdate! Baris terubah: " . $stmt->rowCount();
DELETE — Menghapus Data
<?php
require 'config/database.php';
$stmt = $pdo->prepare("DELETE FROM buku_tamu WHERE id = ?");
$stmt->execute([1]);
echo "Data berhasil dihapus! Baris terhapus: " . $stmt->rowCount();
Prepared Statement
SQL Injection
Prepared statement wajib digunakan untuk mencegah SQL Injection — serangan di mana pengguna memasukkan kode SQL berbahaya lewat input form.
// ❌ BAHAYA — SQL Injection
$nama = $_POST['nama'];
$pdo->query("SELECT * FROM users WHERE nama = '$nama'");
// Pengguna bisa input: ' OR 1=1 --
// Query menjadi: SELECT * FROM users WHERE nama = '' OR 1=1 --
// Ini akan menampilkan SEMUA data!
// ✅ AMAN — Prepared Statement
$stmt = $pdo->prepare("SELECT * FROM users WHERE nama = ?");
$stmt->execute([$nama]);
// Input pengguna diperlakukan sebagai DATA, bukan kode SQL
Dua Cara Prepared Statement
// Cara 1: Positional parameters (?)
$stmt = $pdo->prepare("INSERT INTO buku_tamu (nama, email) VALUES (?, ?)");
$stmt->execute([$nama, $email]);
// Cara 2: Named parameters (:nama)
$stmt = $pdo->prepare("INSERT INTO buku_tamu (nama, email) VALUES (:nama, :email)");
$stmt->execute([
':nama' => $nama,
':email' => $email,
]);
Latihan: Menampilkan Data dari Database
Buat file buku-tamu.php:
<?php
require 'config/database.php';
// Insert dummy data jika tabel kosong
$count = $pdo->query("SELECT COUNT(*) FROM buku_tamu")->fetchColumn();
if ($count == 0) {
$data = [
["Ahmad", "ahmad@mail.com", "Website-nya bagus!"],
["Siti", "siti@mail.com", "Terima kasih informasinya."],
["Budi", "budi@mail.com", "Kapan ada artikel baru?"],
];
$stmt = $pdo->prepare("INSERT INTO buku_tamu (nama, email, pesan) VALUES (?, ?, ?)");
foreach ($data as $d) {
$stmt->execute($d);
}
}
// Ambil semua data
$stmt = $pdo->query("SELECT * FROM buku_tamu ORDER BY created_at DESC");
$bukuTamu = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Buku Tamu</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'Segoe UI', sans-serif; background: #f0f2f5; padding: 40px 20px; }
.container { max-width: 700px; margin: 0 auto; }
h1 { text-align: center; color: #667eea; margin-bottom: 25px; }
table { width: 100%; border-collapse: collapse; background: white;
border-radius: 10px; overflow: hidden;
box-shadow: 0 2px 10px rgba(0,0,0,0.08); }
th { background: #667eea; color: white; padding: 12px 15px; text-align: left; }
td { padding: 12px 15px; border-bottom: 1px solid #eee; }
tr:last-child td { border-bottom: none; }
tr:hover { background: #f8f9fe; }
.badge { display: inline-block; background: #e8eaf6; color: #667eea;
padding: 2px 8px; border-radius: 4px; font-size: 13px; }
</style>
</head>
<body>
<div class="container">
<h1>📖 Buku Tamu</h1>
<table>
<thead>
<tr>
<th>No</th>
<th>Nama</th>
<th>Pesan</th>
<th>Waktu</th>
</tr>
</thead>
<tbody>
<?php if (empty($bukuTamu)): ?>
<tr><td colspan="4" style="text-align:center">Belum ada data</td></tr>
<?php else: ?>
<?php foreach ($bukuTamu as $i => $row): ?>
<tr>
<td><?= $i + 1 ?></td>
<td>
<strong><?= htmlspecialchars($row['nama']) ?></strong>
<br>
<small style="color:#999"><?= htmlspecialchars($row['email']) ?></small>
</td>
<td><?= htmlspecialchars($row['pesan']) ?></td>
<td><span class="badge"><?= date('d M Y H:i', strtotime($row['created_at'])) ?></span></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
<p style="text-align:center; margin-top:15px; color:#999">
Total: <?= count($bukuTamu) ?> pesan
</p>
</div>
</body>
</html>
Selanjutnya
Sekarang kamu sudah bisa menghubungkan PHP dengan MySQL dan melakukan query dasar. Mari lanjut ke CRUD Lengkap → — membuat fitur Create, Read, Update, dan Delete yang terintegrasi dalam satu aplikasi.
❓ Error Umum Pemula
:::warning Sering Terjadi!
Access denied for user 'root'@'localhost':
Penyebab: Password database salah. Di Laravel Herd / XAMPP, default passwordnya adalah kosong ''. Tapi di beberapa aplikasi (seperti MAMP), password defaultnya adalah 'root'.
Unknown database 'belajar_web':
Penyebab: Kamu belum menjalankan perintah SQL CREATE DATABASE belajar_web; di dalam MySQL, atau ada typo (salah ketik) nama database di file database.php.
SQLSTATE[HY000] [2002] No connection could be made...:
Penyebab: MySQL Server di komputermu belum jalan! Pastikan service MySQL di Laravel Herd sudah di-Start dan berstatus aktif/hijau.
:::