Database adalah komponen penting dalam pengembangan web dinamis. Pelajari cara menghubungkan PHP dengan MySQL untuk menyimpan, mengambil, dan mengelola data aplikasi web Anda.
Persiapan Database
Sebelum menghubungkan PHP dengan MySQL, pastikan Anda sudah memiliki database dan tabel yang akan digunakan.
Membuat Database dan Tabel
-- Membuat database
CREATE DATABASE belajar_php;
-- Menggunakan database
USE belajar_php;
-- Membuat tabel users
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
umur INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Menambahkan data contoh
INSERT INTO users (nama, email, umur) VALUES
('Ahmad Wijaya', 'ahmad@email.com', 25),
('Siti Nurhaliza', 'siti@email.com', 22),
('Budi Santoso', 'budi@email.com', 28);
Metode Koneksi PHP ke MySQL
PHP menyediakan beberapa cara untuk terhubung ke MySQL:
- MySQLi (MySQL Improved) - Extension khusus untuk MySQL
- PDO (PHP Data Objects) - Interface universal untuk berbagai database
Aspek |
MySQLi |
PDO |
Database Support |
Hanya MySQL |
12+ database |
Interface |
Procedural & OOP |
Hanya OOP |
Prepared Statements |
Ya |
Ya |
Performance |
Sedikit lebih cepat |
Sedikit lebih lambat |
Portabilitas |
Rendah |
Tinggi |
Konfigurasi Database
Buat file konfigurasi untuk menyimpan kredensial database:
<?php
// config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'belajar_php');
// Atau menggunakan array
$config = [
'host' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'belajar_php',
'charset' => 'utf8mb4'
];
?>
Menggunakan MySQLi
MySQLi menyediakan interface procedural dan object-oriented untuk berinteraksi dengan MySQL.
MySQLi Object-Oriented
<?php
require_once 'config.php';
// Membuat koneksi
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// Periksa koneksi
if ($mysqli->connect_error) {
die("Koneksi gagal: " . $mysqli->connect_error);
}
// Set charset untuk menghindari masalah encoding
$mysqli->set_charset("utf8mb4");
echo "Koneksi berhasil!";
// Tutup koneksi
$mysqli->close();
?>
Menjalankan Query SELECT
<?php
require_once 'config.php';
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error) {
die("Koneksi gagal: " . $mysqli->connect_error);
}
// Query SELECT
$sql = "SELECT id, nama, email, umur FROM users";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
echo "<table border='1'>";
echo "<tr><th>ID</th><th>Nama</th><th>Email</th><th>Umur</th></tr>";
// Mengambil data baris per baris
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["id"] . "</td>";
echo "<td>" . $row["nama"] . "</td>";
echo "<td>" . $row["email"] . "</td>";
echo "<td>" . $row["umur"] . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "Tidak ada data ditemukan";
}
$mysqli->close();
?>
Menjalankan Query INSERT
<?php
require_once 'config.php';
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error) {
die("Koneksi gagal: " . $mysqli->connect_error);
}
// Data yang akan diinsert
$nama = "Dewi Lestari";
$email = "dewi@email.com";
$umur = 24;
// Query INSERT (TIDAK AMAN - rentan SQL injection)
$sql = "INSERT INTO users (nama, email, umur) VALUES ('$nama', '$email', $umur)";
if ($mysqli->query($sql) === TRUE) {
echo "Data berhasil ditambahkan dengan ID: " . $mysqli->insert_id;
} else {
echo "Error: " . $sql . "<br>" . $mysqli->error;
}
$mysqli->close();
?>
Prepared Statements (Aman dari SQL Injection)
<?php
require_once 'config.php';
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error) {
die("Koneksi gagal: " . $mysqli->connect_error);
}
// INSERT dengan prepared statement
$nama = "Rini Susilawati";
$email = "rini@email.com";
$umur = 27;
// Siapkan statement
$stmt = $mysqli->prepare("INSERT INTO users (nama, email, umur) VALUES (?, ?, ?)");
$stmt->bind_param("ssi", $nama, $email, $umur);
// Eksekusi statement
if ($stmt->execute()) {
echo "Data berhasil ditambahkan dengan ID: " . $mysqli->insert_id;
} else {
echo "Error: " . $stmt->error;
}
$stmt->close();
// SELECT dengan prepared statement
$umur_min = 25;
$stmt = $mysqli->prepare("SELECT id, nama, email, umur FROM users WHERE umur >= ?");
$stmt->bind_param("i", $umur_min);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row['id'] . " - Nama: " . $row['nama'] . " - Umur: " . $row['umur'] . "<br>";
}
$stmt->close();
$mysqli->close();
?>
UPDATE dan DELETE
<?php
require_once 'config.php';
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error) {
die("Koneksi gagal: " . $mysqli->connect_error);
}
// UPDATE dengan prepared statement
$id = 1;
$nama_baru = "Ahmad Wijaya Updated";
$umur_baru = 26;
$stmt = $mysqli->prepare("UPDATE users SET nama = ?, umur = ? WHERE id = ?");
$stmt->bind_param("sii", $nama_baru, $umur_baru, $id);
if ($stmt->execute()) {
echo "Data berhasil diupdate. Rows affected: " . $stmt->affected_rows . "<br>";
} else {
echo "Error update: " . $stmt->error . "<br>";
}
$stmt->close();
// DELETE dengan prepared statement
$id_hapus = 3;
$stmt = $mysqli->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id_hapus);
if ($stmt->execute()) {
echo "Data berhasil dihapus. Rows affected: " . $stmt->affected_rows;
} else {
echo "Error delete: " . $stmt->error;
}
$stmt->close();
$mysqli->close();
?>
MySQLi Procedural
<?php
require_once 'config.php';
// Membuat koneksi
$connection = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// Periksa koneksi
if (!$connection) {
die("Koneksi gagal: " . mysqli_connect_error());
}
// Set charset
mysqli_set_charset($connection, "utf8mb4");
// Query SELECT
$sql = "SELECT id, nama, email FROM users";
$result = mysqli_query($connection, $sql);
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"]. " - Nama: " . $row["nama"]. " - Email: " . $row["email"]. "<br>";
}
} else {
echo "Tidak ada hasil";
}
// Tutup koneksi
mysqli_close($connection);
?>
Menggunakan PDO
PDO (PHP Data Objects) adalah interface yang konsisten untuk mengakses database di PHP. PDO mendukung banyak database dan menggunakan prepared statements secara default.
Koneksi dengan PDO
<?php
require_once 'config.php';
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$pdo = new PDO($dsn, DB_USER, DB_PASS);
// Set error mode ke exception
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Koneksi PDO berhasil!";
} catch(PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
?>
Query SELECT dengan PDO
<?php
require_once 'config.php';
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$pdo = new PDO($dsn, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Query SELECT sederhana
$sql = "SELECT id, nama, email, umur FROM users";
$stmt = $pdo->query($sql);
echo "<table border='1'>";
echo "<tr><th>ID</th><th>Nama</th><th>Email</th><th>Umur</th></tr>";
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "<td>" . $row['umur'] . "</td>";
echo "</tr>";
}
echo "</table>";
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
Prepared Statements dengan PDO
<?php
require_once 'config.php';
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$pdo = new PDO($dsn, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// INSERT dengan named placeholders
$nama = "Lisa Permata";
$email = "lisa@email.com";
$umur = 23;
$sql = "INSERT INTO users (nama, email, umur) VALUES (:nama, :email, :umur)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':nama' => $nama,
':email' => $email,
':umur' => $umur
]);
echo "Data berhasil ditambahkan dengan ID: " . $pdo->lastInsertId() . "<br>";
// SELECT dengan parameter
$umur_min = 25;
$sql = "SELECT * FROM users WHERE umur >= :umur_min ORDER BY nama";
$stmt = $pdo->prepare($sql);
$stmt->execute([':umur_min' => $umur_min]);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo "Nama: " . $user['nama'] . " - Umur: " . $user['umur'] . "<br>";
}
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
UPDATE dan DELETE dengan PDO
<?php
require_once 'config.php';
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$pdo = new PDO($dsn, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// UPDATE
$id = 2;
$nama_baru = "Siti Nurhaliza Updated";
$umur_baru = 23;
$sql = "UPDATE users SET nama = :nama, umur = :umur WHERE id = :id";
$stmt = $pdo->prepare($sql);
$result = $stmt->execute([
':nama' => $nama_baru,
':umur' => $umur_baru,
':id' => $id
]);
if ($result) {
echo "Data berhasil diupdate. Rows affected: " . $stmt->rowCount() . "<br>";
}
// DELETE
$id_hapus = 4;
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$result = $stmt->execute([':id' => $id_hapus]);
if ($result) {
echo "Data berhasil dihapus. Rows affected: " . $stmt->rowCount();
}
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
Transaksi dengan PDO
<?php
require_once 'config.php';
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
$pdo = new PDO($dsn, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Mulai transaksi
$pdo->beginTransaction();
try {
// Query 1: Insert user baru
$sql1 = "INSERT INTO users (nama, email, umur) VALUES (:nama, :email, :umur)";
$stmt1 = $pdo->prepare($sql1);
$stmt1->execute([
':nama' => 'Andi Setiawan',
':email' => 'andi@email.com',
':umur' => 29
]);
// Query 2: Update user lain
$sql2 = "UPDATE users SET umur = umur + 1 WHERE id = :id";
$stmt2 = $pdo->prepare($sql2);
$stmt2->execute([':id' => 1]);
// Jika semua berhasil, commit transaksi
$pdo->commit();
echo "Transaksi berhasil!";
} catch (Exception $e) {
// Jika ada error, rollback transaksi
$pdo->rollback();
throw $e;
}
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
Class Database Helper
<?php
class Database {
private $pdo;
private $host = DB_HOST;
private $db_name = DB_NAME;
private $username = DB_USER;
private $password = DB_PASS;
public function __construct() {
$this->connect();
}
private function connect() {
try {
$dsn = "mysql:host=" . $this->host . ";dbname=" . $this->db_name . ";charset=utf8mb4";
$this->pdo = new PDO($dsn, $this->username, $this->password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
}
public function query($sql, $params = []) {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
}
public function fetchAll($sql, $params = []) {
$stmt = $this->query($sql, $params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function fetchOne($sql, $params = []) {
$stmt = $this->query($sql, $params);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
public function insert($table, $data) {
$columns = implode(', ', array_keys($data));
$placeholders = ':' . implode(', :', array_keys($data));
$sql = "INSERT INTO {$table} ({$columns}) VALUES ({$placeholders})";
$this->query($sql, $data);
return $this->pdo->lastInsertId();
}
public function update($table, $data, $where, $whereParams = []) {
$set = [];
foreach (array_keys($data) as $column) {
$set[] = "{$column} = :{$column}";
}
$setClause = implode(', ', $set);
$sql = "UPDATE {$table} SET {$setClause} WHERE {$where}";
$params = array_merge($data, $whereParams);
$stmt = $this->query($sql, $params);
return $stmt->rowCount();
}
public function delete($table, $where, $params = []) {
$sql = "DELETE FROM {$table} WHERE {$where}";
$stmt = $this->query($sql, $params);
return $stmt->rowCount();
}
}
// Penggunaan Database Class
$db = new Database();
// Insert
$newId = $db->insert('users', [
'nama' => 'Toni Kurniawan',
'email' => 'toni@email.com',
'umur' => 30
]);
// Select
$users = $db->fetchAll("SELECT * FROM users WHERE umur > :umur", [':umur' => 25]);
// Update
$updated = $db->update('users',
['nama' => 'Toni K. Updated'],
'id = :id',
[':id' => $newId]
);
// Delete
$deleted = $db->delete('users', 'id = :id', [':id' => $newId]);
?>