본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

การใช้ PDO กับ Auto-Increment

บทความนี้อธิบายวิธีการจัดการกับคอลัมน์ Auto-Increment ในฐานข้อมูลโดยใช้ PDO ใน PHP โดยเน้นที่การดึงค่า ID ล่าสุดหลังจากการ INSERT ข้อมูลด้วยเมธอด `lastInsertId(...

การใช้ 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 ซึ่งเป็นข้อมูลที่มีขนาดใหญ่ เช่น รูปภาพ หรือไฟล์

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기