Tutorial PHP #26: PHP & MySQL: Koneksi Database dengan MySQLi

1. Kenapa Database Penting?

Hampir semua aplikasi web nyata membutuhkan database untuk menyimpan data secara persisten - user, artikel, produk, transaksi, dan lainnya. PHP punya dua cara utama untuk koneksi ke MySQL: MySQLi dan PDO. Tutorial ini membahas MySQLi.

2. Persiapan Database

Sebelum koneksi, buat database dan tabel di phpMyAdmin atau via SQL:

CREATE DATABASE db_belajar;
USE db_belajar;

CREATE TABLE users (
    id       INT AUTO_INCREMENT PRIMARY KEY,
    nama     VARCHAR(100) NOT NULL,
    email    VARCHAR(150) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

3. Koneksi MySQLi (Procedural)

<?php
// config.php
$host   = "localhost";
$user   = "root";
$pass   = "";
$dbname = "db_belajar";

$conn = mysqli_connect($host, $user, $pass, $dbname);

if (!$conn) {
    die("Koneksi gagal: " . mysqli_connect_error());
}

// Set charset untuk mendukung karakter Unicode / bahasa Indonesia
mysqli_set_charset($conn, "utf8mb4");

echo "Koneksi berhasil!";
?>

4. Koneksi MySQLi (OOP)

<?php
// config_oop.php
$mysqli = new mysqli("localhost", "root", "", "db_belajar");

// Cek error
if ($mysqli->connect_errno) {
    die("Koneksi gagal: " . $mysqli->connect_error);
}

$mysqli->set_charset("utf8mb4");
echo "Koneksi OOP berhasil!";
?>

5. Menjalankan Query

<?php
require_once "config.php";

// SELECT query
$result = mysqli_query($conn, "SELECT * FROM users ORDER BY id DESC");

if ($result) {
    $jumlah = mysqli_num_rows($result);
    echo "Ditemukan $jumlah user <br>";

    while ($row = mysqli_fetch_assoc($result)) {
        echo "- {$row['nama']} ({$row['email']}) <br>";
    }
    
    mysqli_free_result($result);   // bebaskan memory
} else {
    echo "Query error: " . mysqli_error($conn);
}

mysqli_close($conn);   // tutup koneksi
?>

6. Prepared Statement untuk Keamanan

Selalu gunakan prepared statement untuk query yang melibatkan input user - ini mencegah SQL Injection.

<?php
require_once "config.php";

$searchEmail = $_GET["email"] ?? "";

// JANGAN lakukan ini - rentan SQL Injection!
// $result = mysqli_query($conn, "SELECT * FROM users WHERE email = '$searchEmail'");

// Gunakan prepared statement:
$stmt = mysqli_prepare($conn, "SELECT id, nama, email FROM users WHERE email = ?");
mysqli_stmt_bind_param($stmt, "s", $searchEmail);   // "s" = string
mysqli_stmt_execute($stmt);

$result = mysqli_stmt_get_result($stmt);

if ($row = mysqli_fetch_assoc($result)) {
    echo "Ditemukan: {$row['nama']}";
} else {
    echo "User tidak ditemukan";
}

mysqli_stmt_close($stmt);
?>

Karakter dalam bind_param: s = string, i = integer, d = double/float, b = blob.

7. File Konfigurasi Koneksi

<?php
// db.php - file koneksi yang bisa di-include di semua halaman
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "db_belajar");

$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

if (!$conn) {
    http_response_code(500);
    die(json_encode(["error" => "Koneksi database gagal"]));
}

mysqli_set_charset($conn, "utf8mb4");
?>

8. Ringkasan

  • MySQLi tersedia dalam dua gaya: procedural dan OOP
  • Selalu cek hasil koneksi sebelum menjalankan query
  • Gunakan prepared statement untuk query dengan input user - mencegah SQL Injection
  • Set charset ke utf8mb4 untuk mendukung semua karakter Unicode

Tutorial berikutnya membahas CRUD dasar dengan PHP native.