CRUD Operations: การลบข้อมูล (DELETE)
ในบทความนี้ เราจะมาเรียนรู้วิธีการลบข้อมูลออกจากฐานข้อมูลโดยใช้ PDO และคำสั่ง SQL DELETE ซึ่งเป็นส่วนหนึ่งของ CRUD operations (Create, Read, Update, Delete) หลังจากที่เราได้เรียนรู้วิธีการสร้าง, อ่าน, และแก้ไขข้อมูลไปแล้ว การลบข้อมูลก็เป็นส่วนสำคัญในการจัดการข้อมูลในฐานข้อมูลของเรา
การเขียน SQL DELETE statement
คำสั่ง SQL DELETE ใช้เพื่อลบแถว (row) หนึ่งแถวหรือมากกว่าออกจากตาราง (table) ในฐานข้อมูล รูปแบบพื้นฐานของคำสั่ง DELETE คือ:
DELETE FROM table_name WHERE condition;
DELETE FROM: ระบุว่าเราต้องการลบข้อมูลจากตารางtable_name: ชื่อของตารางที่เราต้องการลบข้อมูลWHERE condition: เงื่อนไขที่ระบุว่าแถวใดบ้างที่เราต้องการลบ หากไม่ระบุWHEREจะเป็นการลบข้อมูลทั้งหมดในตาราง (ซึ่งควรระมัดระวังอย่างยิ่ง!)
ตัวอย่างเช่น หากเราต้องการลบผู้ใช้ที่มี id เท่ากับ 5 จากตาราง users เราจะเขียนคำสั่ง SQL ดังนี้:
DELETE FROM users WHERE id = 5;
การใช้ Prepared Statement สำหรับการลบข้อมูล
เช่นเดียวกับการแก้ไขข้อมูล (UPDATE) การใช้ Prepared Statements เมื่อลบข้อมูล (DELETE) เป็นสิ่งสำคัญอย่างยิ่งในการป้องกัน SQL Injection Prepared Statements ช่วยให้เราแยกคำสั่ง SQL ออกจากข้อมูลที่ผู้ใช้ป้อนเข้ามา ทำให้ฐานข้อมูลของเราปลอดภัยยิ่งขึ้น
ขั้นตอนการใช้ Prepared Statement สำหรับการลบข้อมูลมีดังนี้:
- เตรียม (Prepare) คำสั่ง SQL
DELETEพร้อม placeholder - ผูก (Bind) ค่าให้กับ placeholder
- ดำเนินการ (Execute) คำสั่ง SQL
ต่อไปนี้เป็นตัวอย่างการใช้ Prepared Statement เพื่อลบข้อมูลผู้ใช้จากตาราง users โดยใช้ PDO:
<?php
// สมมติว่าเรามีการเชื่อมต่อฐานข้อมูล $pdo อยู่แล้ว
try {
// 1. เตรียมคำสั่ง SQL DELETE พร้อม placeholder
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
// 2. ผูกค่าให้กับ placeholder
$id = 5; // ID ของผู้ใช้ที่เราต้องการลบ
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // ระบุชนิดข้อมูลเป็น Integer
// 3. ดำเนินการคำสั่ง SQL
$stmt->execute();
echo "ลบข้อมูลผู้ใช้สำเร็จ";
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
ในตัวอย่างนี้:
- เราเตรียมคำสั่ง SQL
DELETE FROM users WHERE id = :idโดยใช้:idเป็น placeholder - เราผูกค่า
$id(ซึ่งมีค่าเป็น 5) กับ placeholder:idโดยใช้bindParam()และระบุชนิดข้อมูลเป็นPDO::PARAM_INTเพื่อให้แน่ใจว่าค่าที่ส่งไปยังฐานข้อมูลเป็นจำนวนเต็ม - เราดำเนินการคำสั่ง SQL โดยใช้
execute() - เราใช้
try-catchblock เพื่อจัดการกับ Exception ที่อาจเกิดขึ้นระหว่างการดำเนินการ
การใช้ execute() โดยตรงกับ Array
อีกวิธีหนึ่งในการใช้งาน Prepared Statements คือการส่งค่าเป็น array ไปยังเมธอด execute() โดยตรง:
<?php
// สมมติว่าเรามีการเชื่อมต่อฐานข้อมูล $pdo อยู่แล้ว
try {
// 1. เตรียมคำสั่ง SQL DELETE พร้อม placeholder
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
// 2. กำหนดค่าในรูปแบบ array
$params = array(':id' => 5);
// 3. ดำเนินการคำสั่ง SQL พร้อมส่งค่าใน array
$stmt->execute($params);
echo "ลบข้อมูลผู้ใช้สำเร็จ";
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
ในตัวอย่างนี้ เราสร้าง array $params ที่มี key คือชื่อ placeholder (:id) และ value คือค่าที่เราต้องการผูก (5) จากนั้นเราส่ง array นี้เป็น argument ให้กับเมธอด execute()
การตรวจสอบผลลัพธ์ของการลบข้อมูล
หลังจากที่เราดำเนินการคำสั่ง DELETE แล้ว เราสามารถตรวจสอบได้ว่ามีแถวใดถูกลบออกจากฐานข้อมูลหรือไม่ โดยใช้เมธอด rowCount()
<?php
// สมมติว่าเรามีการเชื่อมต่อฐานข้อมูล $pdo อยู่แล้ว
try {
// 1. เตรียมคำสั่ง SQL DELETE พร้อม placeholder
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
// 2. ผูกค่าให้กับ placeholder
$id = 5; // ID ของผู้ใช้ที่เราต้องการลบ
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
// 3. ดำเนินการคำสั่ง SQL
$stmt->execute();
// 4. ตรวจสอบจำนวนแถวที่ถูกลบ
$rowCount = $stmt->rowCount();
if ($rowCount > 0) {
echo "ลบข้อมูลผู้ใช้สำเร็จ จำนวนแถวที่ถูกลบ: " . $rowCount;
} else {
echo "ไม่พบผู้ใช้ที่มี ID ดังกล่าว หรือไม่มีแถวใดถูกลบ";
}
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
เมธอด rowCount() จะคืนค่าจำนวนแถวที่ได้รับผลกระทบจากการดำเนินการ DELETE หากค่าที่ได้มากกว่า 0 แสดงว่ามีแถวถูกลบออกจากฐานข้อมูล หากค่าที่ได้เป็น 0 แสดงว่าไม่มีแถวใดถูกลบ (อาจเป็นเพราะไม่มีผู้ใช้ที่มี ID ดังกล่าวอยู่ในฐานข้อมูล)
ข้อควรระวังในการลบข้อมูล
การลบข้อมูลเป็น operation ที่ควรทำด้วยความระมัดระวังอย่างยิ่ง เนื่องจากข้อมูลที่ถูกลบไปแล้วมักจะกู้คืนได้ยากหรือเป็นไปไม่ได้ ดังนั้น ก่อนที่จะดำเนินการลบข้อมูล ควรตรวจสอบให้แน่ใจว่า:
- คุณเข้าใจอย่างถ่องแท้ว่าข้อมูลใดที่คุณกำลังจะลบ
- คุณมี backup ของข้อมูลที่สำคัญ (หากจำเป็น)
- คุณได้รับอนุญาตให้ลบข้อมูลนั้น (โดยเฉพาะในระบบที่มีการจัดการสิทธิ์การเข้าถึง)
นอกจากนี้ ควรหลีกเลี่ยงการใช้คำสั่ง DELETE โดยไม่มี WHERE clause เพราะจะทำให้ข้อมูลทั้งหมดในตารางถูกลบ ซึ่งอาจก่อให้เกิดความเสียหายร้ายแรงได้
สรุป
ในบทความนี้ เราได้เรียนรู้วิธีการลบข้อมูลออกจากฐานข้อมูลโดยใช้ PDO และคำสั่ง SQL DELETE เราได้เน้นย้ำถึงความสำคัญของการใช้ Prepared Statements เพื่อป้องกัน SQL Injection และได้แสดงตัวอย่างการใช้งานทั้ง bindParam() และ execute() รวมถึงการตรวจสอบผลลัพธ์และจัดการกับ Exception ที่อาจเกิดขึ้น การเข้าใจวิธีการลบข้อมูลอย่างถูกต้องและปลอดภัยเป็นสิ่งสำคัญในการจัดการฐานข้อมูลอย่างมีประสิทธิภาพ