Statemen Prepare adalah fitur yang digunakan untuk menjalankan perintah query SQL yang sama secara berulang dengan lebih efisien. Sebagai contoh statemen Prepare digunakan saat kita menginsert beberapa record sekaligus dalam satu kali eksekusi. Memang ada fasilitas seperti Insert data multi menggunakan mysql_multi_query, namun dengan menggunakan metode Prepare akan diperoleh kecepatan eksekusi yang lebih baik.
Prinsip kerja Prepare secara singkat meliputi tiga tahapan, yaitu :
- Prepare, adalah proses menyiapkan statemen template perintah SQL dan mengirim kepada database. Nilai-nilai tertentu dibiarkan terbuka/kosong dan selanjutnya ini disebut parameter dn diberi label “?”. Contoh : INSERT INTO User VALUES(?,?,?).
- Memparsing database, mengkompile dan menjalankan optimasi query pada statemen template perintah SQL lalu menyimpan tanpa mengeksekusinya.
- Eksekusi, adalah proses menjalankan statemen perintah SQL yang sudah disiapkan tadi dengan data yang sudah diikat oleh aplikasi. Aplikasi kemudian mengeksekusi statemen perintah query sebanyak yang diinginkan dengan nilai yang berbeda.
Jika dibandingkan dengan menjalankan perintah SQL secara langsung, statemen Prepare memiliki beberapa keuntungan, yaitu :
- Statemen Prepare mengurangi waktu parsing karena persiapan perintah query hanya dilakukan sekali saja meskipun query dijalankan beberapa kali.
- Parameter yang sudah diikat oleh aplikasi akan mengurangi penggunaan bandwith koneksi ke server karena kita hanya mengirimkan nilainya saja tidak dengan perintah query secara utuh.
- Statemen Prepare juga berguna untuk mengatasi serangan berupa SQl Injection. Hal ini karena nilai parameter dikirim menggunakan protokol yang berbeda, jadi tidak perlu proses menggunakan escape karakter dengan benar. Jika template statemen perintah SQL asli tidak berasal dari input eksternal, serangan SQL Injection tidak dapat terjadi .
Berikut ini contoh script PHP untuk statemen Prepare MySQL
1. Statemen Prepare menggunakan MySQLI Extension
<?php
$dbHost = "localhost";
$dbUser = "root";
$dbPass = "123";
$dbName = "MySQLIDB2";
// membuat koneksi mysql
$conn = mysqli_connect($dbHost, $dbUser, $dbPass, $dbName);
// mengecek koneksi mysql
if ($conn->connect_error) die("Koneksi Gagal: " . $conn->connect_error);
else echo "Koneksi Database ".$dbName." Berhasil ...<br/><br/>";
// menyiapkan statemen prepare dan tautan parameter
$stmt = $conn->prepare("INSERT INTO User (nama, password, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $nama, $password, $email);
// mengeset parameter dan mengeksekusinya
$nama = "Agus";
$password = "123456";
$email = "agus@example.com";
$stmt->execute();
$nama = "Budi";
$password = "qwerty";
$email = "budi@example.com";
$stmt->execute();
$nama = "Candra";
$password = "abcdef";
$email = "agus@example.com";
$stmt->execute();
echo "Tiga Data baru berhasil dibuat";
//menutup statemen prepare
$stmt->close();
// menutup koneksi mysql
$conn->close();
?>
Note : “sss” pada fungsi bind_param adalah keterangan untuk string. Keterangan yang lain yang bisa dipakai adalah i untuk integer, b untuk blob dan d untuk double. Kita harus menyertakan parameter ini untuk setiap nilai.
2. Statemen Prepare menggunakan PDO
<?php
$dbHost = "localhost";
$dbUser = "root";
$dbPass = "123";
$dbName = "MyPDODB";
try {
$conn = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPass);
// set the PDO error mode untuk exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// menyiapkan sql dan tautan parameter
$stmt = $conn->prepare("INSERT INTO User (nama, password, email)
VALUES (:nama, :password, :email)");
$stmt->bindParam(':nama', $nama);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':email', $email);
// insert baris pertama
$nama = "Agus";
$password = "123456";
$email = "agus@example.com";
$stmt->execute();
// insert baris kedua
$nama = "Budi";
$password = "qwerty";
$email = "budi@example.com";
$stmt->execute();
// insert baris ketiga
$nama = "Candra";
$password = "abcdef";
$email = "agus@example.com";
$stmt->execute();
echo "Tiga Data baru berhasil dibuat";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
// menutup koneksi
$conn = null;
?>
Referensi :