การใช้ PDO กับ Auto-Increment
ในบทเรียนนี้ เราจะมาเรียนรู้วิธีการจัดการกับ Auto-Increment column ในฐานข้อมูล โดยใช้ PDO (PHP Data Objects) ซึ่งเป็นส่วนสำคัญในการจัดการข้อมูลที่ต้องการลำดับที่ไม่ซ้ำกัน และเพิ่มขึ้นเองโดยอัตโนมัติ ตัวอย่างเช่น การเก็บ ID ของผู้ใช้งาน หรือ ID ของสินค้าในระบบ
Auto-Increment column เป็นคุณสมบัติของ column ในตารางฐานข้อมูลที่ทำให้ค่าของ column นั้นเพิ่มขึ้นเองโดยอัตโนมัติเมื่อมีการเพิ่มข้อมูลใหม่เข้าไปในตาราง โดยส่วนใหญ่มักใช้กับ column ที่เป็น Primary Key เพื่อให้แต่ละ row ในตารางมี ID ที่ไม่ซ้ำกัน
การดึงค่า Auto-Increment
หลังจากที่เราทำการ INSERT ข้อมูลลงในตารางที่มี Auto-Increment column แล้ว เรามักต้องการทราบค่า ID ที่ถูกสร้างขึ้นล่าสุด เพื่อนำไปใช้ประโยชน์อื่นๆ เช่น การเชื่อมโยงข้อมูลในตารางอื่น หรือการแสดงผลข้อมูล
PDO มี method ที่ชื่อว่า lastInsertId() ซึ่งช่วยให้เราสามารถดึงค่า Auto-Increment ที่ถูกสร้างขึ้นล่าสุดได้ง่ายดาย
<?php
// สมมติว่าเรามีการเชื่อมต่อกับฐานข้อมูลแล้ว ($pdo)
try {
$sql = "INSERT INTO products (product_name, product_price) VALUES (:product_name, :product_price)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':product_name' => 'เสื้อยืด', ':product_price' => 250]);
// ดึงค่า ID ที่ถูกสร้างขึ้นล่าสุด
$product_id = $pdo->lastInsertId();
echo "เพิ่มสินค้าสำเร็จ ID คือ: " . $product_id;
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
คำอธิบาย:
- เราทำการ INSERT ข้อมูลลงในตาราง
productsโดยใช้ Prepared Statements - หลังจาก execute statement แล้ว เราเรียกใช้
$pdo->lastInsertId()เพื่อดึงค่า ID ที่ถูกสร้างขึ้นล่าสุด - ค่า ID ที่ได้จะถูกเก็บไว้ในตัวแปร
$product_idและสามารถนำไปใช้งานต่อได้
ข้อผิดพลาดที่พบบ่อย:
lastInsertId()จะคืนค่า 0 หากไม่มีการ INSERT ข้อมูลใหม่ หรือหาก column ที่ระบุไม่ได้เป็น Auto-Increment- ตรวจสอบให้แน่ใจว่าคุณได้ทำการ INSERT ข้อมูลลงในตารางที่มี Auto-Increment column ก่อนที่จะเรียกใช้
lastInsertId()
การใช้ LAST_INSERT_ID()
นอกจาก lastInsertId() แล้ว เรายังสามารถใช้ SQL function LAST_INSERT_ID() เพื่อดึงค่า Auto-Increment ได้โดยตรงจาก Query
<?php
// สมมติว่าเรามีการเชื่อมต่อกับฐานข้อมูลแล้ว ($pdo)
try {
$sql = "INSERT INTO products (product_name, product_price) VALUES (:product_name, :product_price); SELECT LAST_INSERT_ID();";
$stmt = $pdo->prepare($sql);
$stmt->execute([':product_name' => 'กางเกงยีนส์', ':product_price' => 500]);
// ดึงค่า ID ที่ถูกสร้างขึ้นล่าสุด
$product_id = $pdo->lastInsertId(); // วิธีนี้ก็ยังใช้ได้
// หรือจะดึงจาก query โดยตรง
$sql_get_id = "SELECT LAST_INSERT_ID() as last_id;";
$stmt_get_id = $pdo->prepare($sql_get_id);
$stmt_get_id->execute();
$result = $stmt_get_id->fetch(PDO::FETCH_ASSOC);
$product_id_from_query = $result['last_id'];
echo "เพิ่มสินค้าสำเร็จ ID (lastInsertId()): " . $product_id . "<br>";
echo "เพิ่มสินค้าสำเร็จ ID (Query): " . $product_id_from_query;
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
คำอธิบาย:
- ในตัวอย่างนี้ เราใช้
SELECT LAST_INSERT_ID()เพื่อดึงค่า ID ที่ถูกสร้างขึ้นล่าสุดโดยตรงจาก Query - เราใช้
fetch(PDO::FETCH_ASSOC)เพื่อดึงผลลัพธ์ออกมาในรูปแบบ associative array - ค่า ID ที่ได้จะอยู่ใน
$result['last_id']
ข้อควรระวัง:
LAST_INSERT_ID()เป็น SQL function ที่ขึ้นอยู่กับ Session ดังนั้นค่าที่ได้จะเป็นค่า Auto-Increment ที่ถูกสร้างขึ้นล่าสุดใน Session ปัจจุบันเท่านั้น- หากมีการ INSERT ข้อมูลจาก Session อื่น ค่า
LAST_INSERT_ID()จะไม่ถูกต้อง
การ Reset Auto-Increment
ในบางกรณี เราอาจต้องการ Reset ค่า Auto-Increment ของตาราง เช่น เมื่อเราต้องการเริ่มต้น ID ใหม่ หรือเมื่อเราลบข้อมูลทั้งหมดในตาราง
วิธีการ Reset Auto-Increment คือการใช้ SQL command TRUNCATE TABLE หรือ ALTER TABLE ... AUTO_INCREMENT = 1
<?php
// สมมติว่าเรามีการเชื่อมต่อกับฐานข้อมูลแล้ว ($pdo)
try {
// วิธีที่ 1: ใช้ TRUNCATE TABLE (ลบข้อมูลทั้งหมด)
// $sql = "TRUNCATE TABLE products";
// $pdo->exec($sql);
// วิธีที่ 2: ใช้ ALTER TABLE (ไม่ลบข้อมูล)
$sql = "ALTER TABLE products AUTO_INCREMENT = 1";
$pdo->exec($sql);
echo "Reset Auto-Increment สำเร็จ";
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
คำอธิบาย:
TRUNCATE TABLEจะลบข้อมูลทั้งหมดในตาราง และ Reset ค่า Auto-Increment กลับไปเป็นค่าเริ่มต้น (โดยปกติคือ 1)ALTER TABLE ... AUTO_INCREMENT = 1จะ Reset ค่า Auto-Increment โดยไม่ลบข้อมูลในตาราง
ข้อควรระวัง:
TRUNCATE TABLEเป็นคำสั่งที่อันตราย เพราะจะลบข้อมูลทั้งหมดในตาราง ดังนั้นควรใช้ด้วยความระมัดระวังALTER TABLE ... AUTO_INCREMENT = 1จะ Reset ค่า Auto-Increment เป็น 1 แต่ถ้ามีข้อมูลอยู่แล้ว อาจทำให้เกิด ID ที่ซ้ำกันได้ ดังนั้นควรตรวจสอบข้อมูลก่อนทำการ Reset
กรณีใช้งานจริง:
สมมติว่าคุณกำลังพัฒนา e-commerce website และคุณต้องการให้ order ID เริ่มต้นที่ 1 ใหม่ทุกปี คุณสามารถใช้ ALTER TABLE orders AUTO_INCREMENT = 1 ในช่วงต้นปี เพื่อ Reset order ID ให้เริ่มต้นใหม่ได้
สรุป:
ในบทเรียนนี้ เราได้เรียนรู้วิธีการจัดการกับ Auto-Increment column ในฐานข้อมูล โดยใช้ PDO ซึ่งเป็นส่วนสำคัญในการจัดการข้อมูลที่ต้องการลำดับที่ไม่ซ้ำกัน และเพิ่มขึ้นเองโดยอัตโนมัติ เราได้เรียนรู้วิธีการดึงค่า Auto-Increment ที่ถูกสร้างขึ้นล่าสุด, การใช้ LAST_INSERT_ID(), และวิธีการ Reset ค่า Auto-Increment ของตาราง
ในบทเรียนถัดไป เราจะมาเรียนรู้วิธีการใช้ PDO กับ BLOB Data ซึ่งเป็นข้อมูลที่มีขนาดใหญ่ เช่น รูปภาพ หรือไฟล์