Home » PHP » Prepare MySQL di PHP: Fungsi Contoh dan Codenya

Prepare MySQL di PHP: Fungsi Contoh dan Codenya

by Hanifah Nurbaeti
by Hanifah Nurbaeti

Pernyataan prepare sangat berguna untuk melawan injeksi SQL.

Pernyataan Prepare dan Parameter Bound

Pernyataan prepare adalah fitur yang digunakan untuk menjalankan pernyataan SQL yang sama (atau serupa) berulang kali dengan efisiensi tinggi.

Pernyataan prepare pada dasarnya bekerja seperti ini:

  1. Prepare: Template pernyataan SQL dibuat dan dikirim ke database. Nilai tertentu dibiarkan tidak ditentukan, disebut parameter (berlabel “?”). Contoh: INSERT INTO MyGuests VALUES (?,?,?)
  2. Database mem-parsing, mengompilasi dan melakukan pengoptimalan kueri pada template pernyataan SQL, dan menyimpan hasilnya tanpa menjalankannya
  3. Exsekusi: Di lain waktu, aplikasi mengikat nilai ke parameter dan database menjalankan pernyataan tersebut. Aplikasi dapat mengeksekusi pernyataan tersebut sebanyak yang diinginkannya dengan nilai yang berbeda

Dibandingkan dengan menjalankan pernyataan SQL secara langsung, pernyataan prepare memiliki tiga keunggulan utama:

  • Pernyataan statement mengurangi waktu penguraian karena persiapan pada kueri dilakukan hanya sekali (meskipun pernyataan tersebut dijalankan beberapa kali)
  • Parameter bound meminimalkan bandwidth ke server karena kita hanya perlu mengirim parameter setiap kali dan bukan seluruh kueri
  • Pernyataan yang disiapkan sangat berguna terhadap injeksi SQL, karena nilai parameter, yang dikirim nanti menggunakan protokol yang berbeda, tidak perlu di-escape dengan benar. Jika template pernyataan asli tidak berasal dari input eksternal, injeksi SQL tidak dapat terjadi.

Pernyataan Prepare di MySQLi

Contoh berikut menggunakan pernyataan prepare dan parameter bound di MySQLi:

Contoh (MySQLi dengan Pernyataan Disiapkan):

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Buat Koneksi
$conn = new mysqli($servername, $username, $password, $dbname);

// Periksa Koneksi
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// persiapkan dan ikat
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// atur parameter dan eksekusi
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

Baris kode yang akan dijelaskan dari contoh di atas:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

Dalam SQL kita memasukkan tanda tanya (?) Di mana kita ingin mengganti nilai integer, string, double atau blob.

Kemudian, lihat fungsi bind_param ():

$stmt->bind_param("sss", $firstname, $lastname, $email);

Fungsi ini mengikat parameter ke kueri SQL dan memberi tahu database apa saja parameternya. Argumen “sss” mencantumkan jenis data yang menjadi parameternya. Karakter s memberitahu mysql bahwa parameternya adalah string.

Argumennya mungkin salah satu dari empat jenis di bawah ini:

  • i – integer
  • d – ganda
  • s – string
  • b – BLOB

Kita harus memiliki salah satunya untuk setiap parameter.

Dengan memberi tahu mysql jenis data apa yang diharapkan, kita bisa meminimalkan risiko injeksi SQL.

Catatan: Jika kita ingin memasukkan data apa pun dari sumber eksternal (seperti input pengguna), sangat penting jika data dibersihkan dan divalidasi.

Pernyataan Disiapkan di PDO

Contoh berikut menggunakan pernyataan yang disiapkan dan parameter terikat di PDO:

Contoh (PDO dengan Pernyataan Disiapkan):

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // atur mode error PDO ke exceptions
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // siapkan parameter sql dan bind
  $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  VALUES (:firstname, :lastname, :email)");
  $stmt->bindParam(':firstname', $firstname);
  $stmt->bindParam(':lastname', $lastname);
  $stmt->bindParam(':email', $email);

  // masukkan baris lain
  $firstname = "John";
  $lastname = "Doe";
  $email = "john@example.com";
  $stmt->execute();

  // masukkan baris lain
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "mary@example.com";
  $stmt->execute();

  // masukkan baris lain
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "julie@example.com";
  $stmt->execute();

  echo "New records created successfully";
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>

You may also like