การเตรียมพร้อม (MySQL Prepared)

MySQL Prepared คือการเตรียมคำสั่งไว้ ซึ่งเป็นคุณลักษณะที่ใช้ในการดำเนินการคำสั่ง SQL ที่คล้ายๆกัน หรือซ้ำกันอย่างมีประสิทธิภาพ ซึ่งการเตรียมพร้อมประกอบไปด้วย 

  1. รูปแบบคำสั่ง SQL ที่ไม่มีการกำหนดค่าพารามิเตอร์ใดๆ โดยใช้ “?” เป็นตัวกำหนด
  2. ฐานข้อมูลจะทำการวิเคราะห์ แยกแยะข้อมูลแล้วพักไว้เพื่อรอดำเนินการขั้นต่อไป
  3. ต่อมาคือขั้นการดำเนินการ โดยแอปพลิเคชั่นจะทำการผูกค่ากับพารามิเตอร์ และดำเนินการหลายอย่าง โดยที่ค่าพารามิเตอร์แตกต่างกัน

เมื่อเปรียบเทียบกับการใช้งานคำสั่ง SQL ที่มีการระบุค่าพารามิเตอร์โดยตรงแล้วได้ความแตกต่างดังนี้

SQL เตรียมพร้อม (SQL Prepared) SQL กำหนดค่าพารามิเตอร์
มีการวิเเคราะห์แยกแยกพารามิเตอร์ ทำให้เกิดความล่าช้าเพิ่มขึ้น ลดระยะเวลาในการวิเคราะห์แยกแยะข้อมูล
ใช้ระยะเวลาในการส่งค่าไปยังเซิร์ฟเวอร์มากขึ้น ลดระยะเวลาในการส่งข้อมูลไปยังเซิร์ฟเวอร์ เนื่องจากมีพารามิเตอร์ที่มีค่าชัดเจน

 

1.ตัวอย่างโค้ด MySQLi Prepared

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

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

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

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

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();

echo "New records created successfully";

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

ไฟล์ที่ 1 mysqli_prepared.php

อธิบายเพิ่มเติมจากไฟล์ที่ 1

ในส่วนของ

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

จากตัวอย่างโค้ดด้านบนเครื่องหมาย “?” คือการเตรียมพร้อมพารามิเตอร์ที่ไม่มีการดำหนดค่าที่แน่นอน จะต้องแทนค่าด้วย จำนวนตัวเลข หรือสตริงเป็นต้น

จากนั้นฟังก์ชั่น bind_param()

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

ฟังก์ชั่น bind_param() จะทำการผูกค่าพารามิเตอร์และทำการ query sql ด้วย รวมทั้งบอกว่าค่าพารามิเตอร์นั้นคือข้อมูลประเภทอะไร ซึ่งจากตัวอย่าง คือ “sss” หมายถึงค่าพารามิเตอร์ที่เป็นสตริง ซึ่งสามารถกำหนดเป็นค่าอื่นได้โดยการใช้อักขระที่ต่างกันดังนี้

  • i คือ ตัวเลข จำนวนเต็ม (integer)
  • d  คือ เลขทศนิยมที่มีค่าเป้นสองเท่า (double)
  • s คือ อักขระ (string)
  • b : BLOB

 

2.ตัวอย่างโค้ด PDO

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

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // prepare sql and bind parameters
  $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);

  // insert a row
  $firstname = "John";
  $lastname = "Doe";
  $email = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "[email protected]";
  $stmt->execute();

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

ไฟล์ที่ 2 pdo_prepared.php