Integrasi PHP dengan MySQL

Ferry Febriansyah
Amikom Computer Club
11 min readMar 11, 2024

Haloo Gengss 🚀! Gimana kabarnya hari ini? Harus tetap semangat gengss 🔥walaupun lagi puasa gini, Gass teruss intinya mah jangan kasi kendoorrrr. Ga kerasa yak kita udah masuk Pelatihan ke-5 aja nih. Kalo di pelatihan sebelumnya kan kita udah belajar mengenai Database dan bagaimana cara kerjanya, nah hari ini kita akan lanjut belajar lagi gimana sih cara mengintegrasikan Database dengan PHP.

Langsung saja kita takiisss 🔥

Thumbnail Web Backend #5

Table of Content

1. Bagaimana PHP dan MySQL dapat terhubung?

2. Membuat Koneksi ke Database

3. Mengenal Prepare Statement

4. Menampilkan Data dari Database (READ)

5. Menambahkan Data ke Database (CREATE)

6. Studi Case: To-Do List App

1. Bagaimana PHP dan MySQL dapat terhubung?

PHP dan MySQL, bagaikan Romeo dan Juliet, pasangan serasi yang sering dijodohkan untuk membangun aplikasi web. MySQL berperan sebagai gudang penyimpanan data (basis data), sedangkan PHP bertindak sebagai program pengelola data.

Bukan berarti PHP hanya terikat dengan MySQL. Ia juga bisa menjalin hubungan dengan database lain seperti SQLite, PostgreSQL, MongoDB, Ms. Access, dan masih banyak lagi.

Ada 2 cara utama untuk dapat mengintegrasikan PHP dengan MySQL, yaitu MySQLi dan PDO (PHP Data Object).

  1. MySQLi

MySQLi adalah ekstensi PHP yang dikembangkan untuk berinteraksi dengan MySQL. MySQLi merupakan versi “improved” dari ekstensi PHP sebelumnya yaitu MySQL extension yang sudah tidak didukung atau dikembangkan lagi (deprecated) sejak PHP 5.5.0

Kelebihan:

  • Kinerja: MySQLi menawarkan kinerja yang lebih baik dibandingkan dengan ekstensi MySQL lama.
  • Fungsionalitas: MySQLi menawarkan fungsionalitas yang lebih kaya, seperti prepared statements dan stored procedures.
  • Keamanan: MySQLi menyediakan fitur keamanan yang kuat, seperti escape string, untuk membantu melindungi aplikasi Anda dari SQL injection.
  • Kompatibilitas: MySQLi kompatibel dengan semua versi MySQL 4.1 dan yang lebih baru.

Kekurangan:

  • Kompleksitas: MySQLi lebih kompleks daripada ekstensi MySQL lama dan mungkin memerlukan waktu untuk mempelajarinya.
  • Dependensi: MySQLi memerlukan ekstensi mysqli yang diinstal dan diaktifkan pada server PHP Anda.

2. PDO (PHP Data Object)

PDO adalah ekstensi PHP yang menyediakan antarmuka abstrak untuk mengakses database. PDO tidak hanya dapat terhubung dengan MySQL saja, tetapi dapat terhubung pula dengan database lain seperti PostgreSQL, SQL Server, dan Oracle, dengan menggunakan kode yang sama. Itulah salah satu kelebihan yang ditawarkan PDO.

Kelebihan:

  • Portabilitas: PDO dapat digunakan dengan berbagai database, sehingga Anda dapat dengan mudah beralih antar database tanpa perlu mengubah kode program Anda.
  • Keamanan: PDO menyediakan fitur keamanan yang kuat, seperti prepared statements, untuk membantu melindungi aplikasi Anda dari SQL injection.
  • Fleksibilitas: PDO menyediakan berbagai fitur dan metode untuk membantu Anda bekerja dengan database dengan mudah dan efisien.
  • Kinerja: PDO menawarkan kinerja yang sebanding dengan ekstensi database khusus, seperti MySQLi.

Kekurangan

  • Kompleksitas: PDO lebih kompleks daripada ekstensi database khusus, seperti MySQLi, dan mungkin memerlukan waktu untuk mempelajarinya.
  • Kompatibilitas: PDO tidak kompatibel dengan semua database, jadi Anda perlu memastikan bahwa database yang Anda gunakan kompatibel dengan PDO sebelum menggunakannya.

Terus lebih baik MySQLi atau PDO?

Tenang Gengs, memilih antara MySQLi atau PDO tak sesulit memilih pasangan hidup, nyuuaakkss. Berikut adalah tabel perbandingannya.

Tidak ada jawaban mutlak untuk memilih MySQLi atau PDO. Keduanya merupakan pilihan yang baik untuk berinteraksi dengan database dalam PHP. Pertimbangkan faktor-faktor seperti kompleksitas proyek, kebutuhan portabilitas, dan prioritas keamanan Anda saat membuat keputusan.

Pada pelatihan kali ini kita akan belajar menggunakan MySQLi, langsung saja kita praktikum, Lessgooww 🚀

2. Membuat Koneksi ke Database

Langkah pertama yaitu buat folder baru di local temen — temen dengan nama pelatihan-5. Jika menggunakan XAMPP bisa buat di C:\xampp\htdocs. Bagi yang menggunakan laragon bisa buat di C:\laragon\www.

Kemudian di folder pelatihan-5 kita bikin file dengan nama config.php yang berisi script berikut.

<?php

// [1] Informasi Database
$db_server = "localhost";
$db_username = "root";
$db_password = "";
$db_name = "todolist"; // sesuaikan dengan nama database

// [2] Membuat Koneksi
$conn = mysqli_connect($db_server, $db_username, $db_password, $db_name);

// [3] Cek Koneksi Database
if (!$conn) {
echo "Koneksi Gagal: " . mysqli_connect_error();
} else {
echo "Koneksi Berhasil";
}

Penjelasan:

Langkah ke-1 kita membuat variabel untuk menyimpan informasi database yang akan dikoneksikan. Berikut penjelasan dari masing — masing variabel

  • $db_server: alamat host/server database.
  • $db_username: Username database, DEFAULT: “root”.
  • $db_password: Password database, DEFAULT: “”.
  • $db_name: Nama database yang akan digunakan.

Langkah ke-2 kita membuat koneksi dengan menggunakan function mysqli_connect() dan memasukkan informasi database yang sudah dibuat sebelumnya kedalam parameter.

Langkah ke-3 kita cek apakah koneksi yang kita buat berhasil atau terjadi error dengan menggunakan fungsi mysqli_connect_error().

Setelah itu silahkan Start Apache dan MySQL temen — temen.

XAMPP

Bagi yang menggunakan Laragon bisa langsung klik Start All nya yak.

Laragon

Kemudian buka file config.php di browser, jika tampilannya seperti berikut maka koneksi sudah berhasil dibuat.

*note: sesuaikan URL dengan struktur folder temen — temen yak.

Jika koneksi gagal maka akan muncul pesan error seperti contoh berikut.

Error: Unknown database

Nah temen — temen jangan panik duluan kalo ketemu error yak, karena pesan error yang diberikan sudah sangat jelas. Inti dari error nya adalah “Unknown database ‘todolis’”. Jadi dia ga kenal tuh siapa sih todolis. Jika terjadi error seperti ini silahkan temen — temen cek kembali isi dari variabel $db_name pada file config.php dan pastikan valuenya sesuai dengan nama database yang temen — temen punya. Contohnya adalah sebagai berikut.

Struktur Database

3. Mengenal Prepare Statement

Prepared statement merupakan fitur yang digunakan dalam pemrograman database untuk mengeksekusi pernyataan SQL secara berulang dengan efisien dan aman. Dalam PHP, prepared statement biasanya digunakan untuk mencegah serangan SQL injection dan meningkatkan kinerja eksekusi query.

Kelebihan:

  • Keamanan: Prepare statement membantu mencegah SQL injection dengan memisahkan parameter dari query. Parameter di bind dengan nilai secara terpisah, sehingga input pengguna tidak dapat memanipulasi query.
  • Kinerja: Prepare statement dapat meningkatkan kinerja query dengan mengkompilasinya sekali dan menyimpannya di server. Query yang dikompilasi ini dapat dieksekusi berulang kali dengan parameter yang berbeda tanpa perlu dikompilasi ulang.
  • Fleksibilitas: Prepare statement memungkinkan untuk menggunakan parameter dalam query, sehingga dapat membuat query yang dinamis dan fleksibel.
  • Portabilitas: Prepare statement adalah fitur standar dalam database SQL, sehingga kode dapat diporting ke database lain dengan mudah.

Kekurangan:

  • Kompleksitas: Prepare statement lebih kompleks untuk digunakan dibandingkan dengan query SQL biasa. Perlu mempelajari cara membuat dan menggunakan prepared statement dengan benar.
  • Overhead: Pada aplikasi dengan volume query yang tinggi, prepare statement dapat menambah overhead karena proses kompilasi dan binding parameter.

Ketika tidak menggunakan prepare statement.

<?php

// [1] Menyisipkan file config.php
include "./config.php";

// [2] Menjalankan Query
$query = "SELECT * FROM users";
$result = mysqli_query($conn, $query);

$no = 1;
// [3] Fetching Data
while ($row = mysqli_fetch_assoc($result)) {
?>
<!-- [4] Displaying Data -->
<tr>
<td scope="row"><?= $no; ?></td>
<td><?= $row['username'] ?></td>
<td><?= $row['email'] ?></td>
</tr>
<?php
$no++;
}
?>

Ketika menggunakan prepare statement.

<?php

// [1] Menyisipkan file config.php
include "./config.php";

// [2] Membuat Prepared Statement
$stmt = mysqli_prepare($conn, "SELECT * FROM users where username = ?");

// [3] Bind Parameter
$name = "eren";
mysqli_stmt_bind_param($stmt, "s", $name);

// [4] Mengeksekusi Prepare Statement
mysqli_stmt_execute($stmt);

// [5] Fetching Data
$no = 1;
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
?>
<!-- [6] Displaying Data -->
<tr>
<td scope="row"><?= $no; ?></td>
<td><?= $row['username'] ?></td>
<td><?= $row['email'] ?></td>
</tr>
<?php
$no++;
}
?>

Langkah 1, kita menyisipkan file config.php agar dapat terkoneksi dengan database yang sudah kita buat.

Langkah 2, Making Prepare Statement. Dalam contoh ini, kita membuat prepare statement untuk menampilkan salah satu data user berdasarkan usernamenya. Untuk data value yang akan kita cari tidak langsung di tulis di dalam query, tetapi di query cukup menuliskan placeholder (?).

Langkah 3, Binding Parameter. Fungsi mysqli_stmt_bind_param() digunakan untuk mengikat parameter ke dalam prepared statement. Dalam contoh ini, kita menggunakan "s" untuk menandakan bahwa parameter tersebut adalah string.

Langkah 4, Execute. Fungsi mysqli_stmt_execute() digunakan untuk mengeksekusi prepared statement.

Langkah 5. Fetching Data. Setelah eksekusi prepared statement, kita dapat memproses hasilnya. Dalam contoh ini, kita menggunakan mysqli_fetch_assoc() untuk mengambil setiap baris hasil sebagai array asosiatif.

Langkah 6, Displaying Data. Kita akan menampilkan datanya menggunakan tabel dengan mengakses array keynya.

Kesimpulan:

Penggunaan prepare statement sangat dianjurkan untuk meningkatkan keamanan dan kinerja aplikasi web. Meskipun prepare statement lebih kompleks untuk digunakan, kelebihannya jauh lebih besar dibandingkan kekurangannya.

4. Menampilkan Data dari Database (READ)

BTW udah pada kenal lah ya dengan kang Bootstrap? Kalo ada yang belum tahu, jadi Bootstrap adalah salah satu Framework CSS yang dapat membantu kita mempercepat dalam proses pengembangan sebuah website. Apalagi bagi kita sebagai warga Backend, jadi kita bisa berfokus kepada bagaimana data itu diolah, urusan tampilan mah dah ada tetangga sebelah 😂 tapi akan jauh lebih mantep lagi kalo kita juga paham.

Sebelum itu pastikan tabel users sudah terisi dengan beberapa data. Contohnya sebagai berikut.

Isi dari tabel Users

Kemudian buat file baru dengan nama list_users.php yang akan kita gunakan untuk menampilkan data users. Tulislah script dibawah ini di dalam file list_users.php.

<!doctype html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>List Users</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>

<div class="container mt-5">
<div class="row justify-content-center g-3">
<div class="col-md-6 text-center">
<h2>List Users</h2>
</div>
<div class="col-md-6 text-center">
<button type="button" class="btn btn-primary"><a href="./add_user.php" class="text-white">Add User</a></button>
</div>
<div class="col-md-7">
<table class="table">
<thead class="table-primary">
<tr>
<th scope="col">No</th>
<th scope="col">Username</th>
<th scope="col">Email</th>
</tr>
</thead>
<tbody>
<?php

// [1] Menyisipkan file config.php
include "./config.php";

// [2] Menjalankan Query
$query = "SELECT * FROM users";
$result = mysqli_query($conn, $query);

$no = 1;

// [3] Fetching Data
while ($row = mysqli_fetch_assoc($result)) {
?>
<!-- [4] Displaying Data -->
<tr>
<td scope="row"><?= $no; ?></td>
<td><?= $row['username'] ?></td>
<td><?= $row['email'] ?></td>
</tr>
<?php
$no++;
}
?>
</tbody>
</table>
</div>

</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>
</body>

</html>

Berikut adalah penjelasan script PHP yang kita sisipkan pada HTML diatas.

Langkah 1, kita harus menyisipkan file config.php agar dapat terhubung dengan Database yang sudah kita buat sebelumnya.

Langkah 2, kita menulis query dan kemudian menjalankannya menggunakan function mysqli_query() yang digunakan untuk mengeksekusi query pada database.

Langkah 3, kita melakukan fetching data dari database dengan menggunakan perulangan. Kita membuat variabel $row yang berisi function mysqli_fetch_assoc() yang berfungsi untuk mengambil data dari hasil query ke database dan data yang dikembalikan bertipe array asosiatif.

Langkah 4, kita menampilkan data yang sudah didapatkan dari database yang ditampung dalam variabel $row, kemudian kita bisa mendapatkan valuenya dengan cara mengakses key nya, seperti $row[‘username’] dan $row[‘email’].

Setelah itu silahkan temen — temen akses file list_users.php di browser. Jika berhasil maka tampilannya akan menjadi seperti berikut.

Nahh kita udah berhasil nampilin data yang ada di Database menggunakan PHP, sangat mudah bukann? 😁

5. Menambahkan Data ke Database (CREATE)

Sekuyy kita lanjut Gengss, tadi kita udah berhasil tuh untuk menampilkan data yang ada di Database menggunakan PHP dan Bootstrap. Sekarang kita akan belajar gimana sih caranya menambahkan data ke Database menggunakan PHP dan sekaligus menerapkan Prepare Statement yang sudah kita pelajari diatas.

Pertama, buatlah file add_user.php pada folder proyek temen — temen. Sehingga sekarang struktur file kita menjadi seperti ini.

Kemudian isikan file add_user.php dengan script dibawah ini.

<!doctype html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Add Users</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>

<div class="container mt-5">
<div class="row justify-content-center g-3">
<div class="col-md-12 text-center">
<h2>Add User</h2>
</div>
<div class="col-md-4">
<form method="POST" action="./add_user_action.php">
<div class="mb-3">
<label for="username" class="form-label">Username</label>
<input type="text" class="form-control" id="username" name="username" aria-describedby="emailHelp">
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" name="email" aria-describedby="emailHelp">
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password">
</div>
<button type="submit" class="btn btn-primary" name="add-button">Add</button>
</form>
</div>
</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>
</body>

</html>

Pada script diatas kita menggunakan component Form yang sudah disediakan oleh Bootstrap agar kita dapat menambahkan data baru melalui web.

Setelah itu, silahkan buat file baru bernama add_user_action.php yang mana file ini akan digunakan untuk memproses data hasil inputan user pada form di atas agar dapat diteruskan ke database.

Sehingga stuktur file kita sekarang menjadi seperti ini.

Berikut isi dari file add_user_action.php.

<?php

// [1] Menyisipkan file config.php
include "./config.php";

// [2] Mengecek apakah tombol add-button sudah di klik
if (isset($_POST['add-button'])) {

// [3] menampung value yang diinputkan oleh user ke dalam variabel baru
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$hashed_password = password_hash($password, PASSWORD_BCRYPT);

// [4] Membuat prepare statement
$stmt = mysqli_prepare($conn, "INSERT INTO users (username, email, password) VALUES (?, ?, ?)");

// [5] Binding variabel
mysqli_stmt_bind_param($stmt, "sss", $username, $email, $hashed_password);

// [6] Execute Query
mysqli_stmt_execute($stmt);

// [7] Cek Query
if (mysqli_stmt_affected_rows($stmt) > 0) {
header("Location: list_users.php");
exit();
} else {
echo "Data gagal disimpan";
}
}

Langkah 1, kita menyisipkan file config.php agar kita dapat terhubung dengan database yang sudah kita buat.

Langkah 2, kita menggunakan isset() untuk memeriksa apakah tombol dengan nama “add-button” telah diklik, yang menunjukkan bahwa user telah mengirimkan formulir.

Langkah 3, mendapatkan nilai yang diinputkan oleh user dari form HTML menggunakan $_POST dan menyimpannya ke dalam variabel yang sesuai. Saat menyimpan password pengguna ke dalam database, penting untuk melakukan hashing pada password tersebut, dalam hal ini kita menggunakan function password_hash(). Ini membantu meningkatkan keamanan karena nilai hash tidak dapat dikembalikan ke nilai aslinya, sehingga mengurangi risiko kebocoran informasi sensitif.

Langkah 4, membuat prepared statement dengan menggunakan mysqli_prepare() untuk menghindari serangan SQL injection.

Langkah 5, mengikat variabel ke prepared statement menggunakan mysqli_stmt_bind_param() untuk menghindari SQL injection dan menggantikan tanda tanya (?) dalam query SQL dengan nilai yang diikat.

Langkah 6, mengeksekusi prepared statement menggunakan mysqli_stmt_execute() untuk menambahkan data user baru ke dalam database.

Langkah 7, menggunakan mysqli_stmt_affected_rows() untuk memeriksa apakah baris telah terpengaruh oleh eksekusi query. Jika ada baris yang terpengaruh (data berhasil dimasukkan), maka pengguna diarahkan ke halaman list_users.php. Jika tidak, pesan “Data gagal disimpan” akan ditampilkan.

6. Studi Case: To-Do List App

Selanjutnya silahkan temen — temen coba buat aplikasi sederhana yaitu To-Do List dengan menggunakan schema database yang sudah dibuat pada pelatihan-4.

Schema Database To-Do List

Tenang Genggss, karena di Github sudah ada Starter-kit nya, jadi temen — temen tinggal lanjutin aja. Langsung aja di gasss di link berikut:

Silahkan dikerjakan dengan sebaik — baiknya Gengss, karena nanti bakal ada hadiahnya lohh bagi kamu yang beruntung🔥

--

--