Dalam pengembangan web, interaksi dengan database sangat penting untuk mengelola data. Dua pustaka yang umum digunakan dalam PHP untuk berinteraksi dengan database MySQL adalah MySQLi (MySQL Improved) dan PDO (PHP Data Objects). Kedua pustaka ini menyediakan cara yang aman dan efisien untuk terhubung ke database, menjalankan query SQL, dan melindungi dari serangan SQL injection.
Pada artikel ini, kita akan membahas bagaimana menghubungkan PHP dengan database MySQL menggunakan MySQLi dan PDO, bagaimana melakukan eksekusi query SQL seperti SELECT, INSERT, UPDATE, DELETE, serta cara melindungi aplikasi dari serangan SQL injection.
Menghubungkan PHP dengan Database Menggunakan MySQLi
MySQLi adalah pustaka yang dikembangkan oleh MySQL untuk berinteraksi dengan database MySQL. Berikut adalah langkah-langkah untuk menghubungkan PHP dengan database MySQL menggunakan MySQLi:
Langkah 1: Menghubungkan ke Database
$host = "localhost";
$username = "username";
$password = "password";
$database = "nama_database";
$conn = new mysqli($host, $username, $password, $database);
if ($conn->connect_error) {
die("Koneksi gagal: " . $conn->connect_error);
}
Pada langkah pertama ini, kita mengatur parameter koneksi ke database MySQL. Variabel $host
, $username
, $password
, dan $database
diisi dengan informasi yang sesuai untuk mengakses database Anda. Kemudian kita menggunakan objek mysqli
untuk membuat koneksi ke database. Jika koneksi gagal, kita menampilkan pesan error.
Langkah 2: Eksekusi Query SELECT
$sql = "SELECT * FROM nama_tabel";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "Nama: " . $row["nama"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Tidak ada data.";
}
$conn->close();
Pada langkah ini, kita menjalankan query SQL untuk mengambil semua data dari tabel nama_tabel
. Hasil query disimpan dalam variabel $result
. Jika terdapat lebih dari 0 baris hasil, kita menggunakan loop while
untuk mengambil setiap baris data dengan menggunakan metode fetch_assoc()
, dan kemudian menampilkan hasilnya. Jika tidak ada data, kita menampilkan pesan “Tidak ada data.”
Langkah 3: Eksekusi Query INSERT
$nama = "John Doe";
$email = "johndoe@example.com";
$sql = "INSERT INTO nama_tabel (nama, email) VALUES ('$nama', '$email')";
if ($conn->query($sql) === TRUE) {
echo "Data berhasil ditambahkan.";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
Pada langkah ini, kita menjalankan query SQL untuk menyisipkan data baru ke dalam tabel nama_tabel
. Data yang ingin ditambahkan disimpan dalam variabel $nama
dan $email
. Kita menggunakan metode query()
dari objek koneksi $conn
untuk menjalankan query, dan kemudian kita memeriksa apakah query berhasil atau tidak dengan memeriksa nilai yang dikembalikan dan menampilkan pesan sesuai hasilnya.
Langkah 4: Eksekusi Query UPDATE
$newEmail = "newemail@example.com";
$id = 1;
$sql = "UPDATE nama_tabel SET email='$newEmail' WHERE id=$id";
if ($conn->query($sql) === TRUE) {
echo "Data berhasil diperbarui.";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
Pada langkah ini, kita menjalankan query SQL untuk memperbarui data dalam tabel nama_tabel
berdasarkan nilai ID yang diberikan. Data baru yang ingin diperbarui disimpan dalam variabel $newEmail
dan $id
. Kita menggunakan metode query()
untuk menjalankan query dan kemudian memeriksa hasilnya seperti pada langkah sebelumnya.
Langkah 5: Eksekusi Query DELETE
$id = 1;
$sql = "DELETE FROM nama_tabel WHERE id=$id";
if ($conn->query($sql) === TRUE) {
echo "Data berhasil dihapus.";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
Pada langkah terakhir ini, kita menjalankan query SQL untuk menghapus data dari tabel nama_tabel
berdasarkan nilai ID yang diberikan. Kita menggunakan metode query()
untuk menjalankan query dan memeriksa hasilnya seperti pada langkah sebelumnya.
Selain langkah-langkah di atas, sangat penting untuk memahami bahwa penggunaan query seperti yang ditunjukkan di atas rentan terhadap serangan SQL injection. Untuk menghindari risiko ini, disarankan untuk menggunakan prepared statements, khususnya saat memproses data input pengguna.
Melindungi dari Serangan SQL Injection menggunakan MySQLi
Untuk melindungi aplikasi dari serangan SQL injection saat menggunakan MySQLi, kita dapat menggunakan prepared statements. Prepared statements akan mengamankan query dengan memisahkan data input dari kode SQL.
Contoh Penggunaan Prepared Statements
<?php
$nama = $_POST["nama"];
$email = $_POST["email"];
$stmt = $conn->prepare("INSERT INTO nama_tabel (nama, email) VALUES (?, ?)");
$stmt->bind_param("ss", $nama, $email);
if ($stmt->execute()) {
echo "Data berhasil ditambahkan.";
} else {
echo "Error: " . $stmt->error;
}
$stmt->close();
$conn->close();
?>
- Mengambil data input dari pengguna (misalnya, melalui form) dan menyimpannya dalam variabel
$nama
dan$email
. - Membuat prepared statement dengan query
INSERT INTO nama_tabel (nama, email) VALUES (?, ?)
menggunakan metodeprepare()
dari objek koneksi. - Mengikat nilai parameter (
$nama
dan$email
) ke dalam prepared statement menggunakanbind_param()
. Tipe data “ss” menunjukkan bahwa kedua parameter adalah string. - Menjalankan prepared statement dengan
execute()
. Jika berhasil, tampilkan “Data berhasil ditambahkan.”. Jika gagal, tampilkan pesan error denganerror
dari objek prepared statement. - Menutup prepared statement dan koneksi database dengan
close()
.
Penggunaan prepared statements melindungi dari serangan SQL injection karena nilai parameter diikat ke dalam statement, mencegah manipulasi tidak sah terhadap query SQL.
Menghubungkan PHP dengan Database Menggunakan PDO
PDO (PHP Data Objects) adalah pustaka yang lebih abstrak dan fleksibel untuk berinteraksi dengan berbagai jenis database, termasuk MySQL. Berikut adalah langkah-langkah untuk menghubungkan PHP dengan database MySQL menggunakan PDO:
Langkah 1: Menghubungkan ke Database
$host = "localhost";
$username = "username";
$password = "password";
$database = "nama_database";
try {
$conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
- Pada langkah ini, kita membuat koneksi ke database menggunakan PDO (PHP Data Objects).
- Kode
new PDO("mysql:host=$host;dbname=$database", $username, $password)
membuat objek PDO dengan informasi koneksi yang diberikan. - Metode
setAttribute()
digunakan untuk mengatur atribut koneksi, di sini kita mengatur mode error menjadiERRMODE_EXCEPTION
, yang akan melemparkan pengecualian (exception) jika terjadi error. - Blok
try...catch
digunakan untuk menangani pengecualian jika koneksi gagal, dengan menampilkan pesan error yang diambil dari objekPDOException
.
Langkah 2: Eksekusi Query SELECT
$sql = "SELECT * FROM nama_tabel";
$stmt = $conn->query($sql);
while ($row = $stmt->fetch()) {
echo "Nama: " . $row["nama"] . " - Email: " . $row["email"] . "<br>";
}
$conn = null;
- Pada langkah ini, kita menjalankan query SQL untuk mengambil semua data dari tabel
nama_tabel
menggunakan metodequery()
dari objek koneksi PDO. - Dalam loop
while
, metodefetch()
digunakan untuk mengambil setiap baris hasil query dan mengakses data dalam bentuk array asosiatif. - Setelah selesai, kita menutup koneksi dengan
null
menggunakan$conn = null;
.
Langkah 3: Eksekusi Query INSERT
$nama = "John Doe";
$email = "johndoe@example.com";
$sql = "INSERT INTO nama_tabel (nama, email) VALUES (:nama, :email)";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':nama', $nama);
$stmt->bindParam(':email', $email);
if ($stmt->execute()) {
echo "Data berhasil ditambahkan.";
} else {
echo "Error: " . $stmt->errorInfo();
}
$conn = null;
- Pada langkah ini, kita membuat prepared statement untuk menjalankan query
INSERT
dengan placeholders:nama
dan:email
. - Metode
bindParam()
digunakan untuk mengikat nilai parameter ke dalam prepared statement. - Kita menjalankan prepared statement dengan metode
execute()
dan menampilkan pesan kesuksesan atau error.
Langkah 4: Eksekusi Query UPDATE
$newEmail = "newemail@example.com";
$id = 1;
$sql = "UPDATE nama_tabel SET email=:email WHERE id=:id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':email', $newEmail);
$stmt->bindParam(':id', $id);
if ($stmt->execute()) {
echo "Data berhasil diperbarui.";
} else {
echo "Error: " . $stmt->errorInfo();
}
$conn = null;
- Pada langkah ini, kita membuat prepared statement untuk menjalankan query
UPDATE
dengan placeholders:email
dan:id
. - Kita mengikat nilai parameter menggunakan
bindParam()
dan menjalankan prepared statement denganexecute()
, kemudian menampilkan pesan hasilnya.
Langkah 5: Eksekusi Query DELETE
$id = 1;
$sql = "DELETE FROM nama_tabel WHERE id=:id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $id);
if ($stmt->execute()) {
echo "Data berhasil dihapus.";
} else {
echo "Error: " . $stmt->errorInfo();
}
$conn = null;
- Pada langkah ini, kita membuat prepared statement untuk menjalankan query
DELETE
dengan placeholder:id
. - Kita mengikat nilai parameter menggunakan
bindParam()
dan menjalankan prepared statement denganexecute()
, kemudian menampilkan pesan hasilnya.
Penggunaan PDO dengan prepared statements memberikan lapisan perlindungan ekstra dari serangan SQL injection dan juga memberikan cara yang lebih aman dan efisien untuk berinteraksi dengan database MySQL.
Melindungi dari Serangan SQL Injection menggunakan PDO
PDO secara otomatis melindungi aplikasi dari serangan SQL injection ketika digunakan dengan benar, karena prepared statements adalah cara bawaan untuk menjalankan query dengan parameter. Parameter-parameter ini diikatkan ke dalam query dan dihindarkan dari penggabungan langsung dengan kode SQL.
Kesimpulan
Dalam artikel ini, kami telah membahas cara menghubungkan PHP dengan database MySQL menggunakan MySQLi dan PDO. Kami juga telah menjelaskan langkah-langkah untuk mengeksekusi query SELECT, INSERT, UPDATE, dan DELETE, serta cara melindungi aplikasi dari serangan SQL injection menggunakan prepared statements.
Pemilihan antara MySQLi dan PDO tergantung pada kebutuhan proyek dan preferensi pribadi. PDO lebih fleksibel dan dapat bekerja dengan berbagai jenis database, sementara MySQLi lebih spesifik untuk MySQL.
Penting untuk selalu memprioritaskan keamanan dalam pengembangan aplikasi web, terutama dalam interaksi dengan database yang mengandung data sensitif. Dengan menggunakan prepared statements, Anda dapat mengurangi risiko serangan SQL injection dan menjaga keamanan aplikasi Anda.