CRUD Operations: การแก้ไขข้อมูล (UPDATE)
ในบทเรียนนี้ เราจะมาเรียนรู้วิธีการแก้ไขข้อมูลที่มีอยู่ในฐานข้อมูลของเรา โดยใช้ PDO และคำสั่ง SQL UPDATE ซึ่งเป็นส่วนหนึ่งของ CRUD operations (Create, Read, Update, Delete) การแก้ไขข้อมูลเป็นสิ่งสำคัญในการจัดการข้อมูลให้เป็นปัจจุบันและถูกต้องอยู่เสมอ
เช่นเดียวกับการอ่านข้อมูล เราจะเน้นการใช้ Prepared Statements เพื่อป้องกัน SQL Injection และรักษาความปลอดภัยให้กับแอปพลิเคชันของเรา
SQL UPDATE Statement
คำสั่ง SQL UPDATE ใช้เพื่อแก้ไขข้อมูลในตาราง โดยมีรูปแบบพื้นฐานดังนี้:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
table_nameคือชื่อตารางที่เราต้องการแก้ไขข้อมูลcolumn1,column2, ... คือชื่อคอลัมน์ที่เราต้องการแก้ไขvalue1,value2, ... คือค่าใหม่ที่เราต้องการกำหนดให้กับคอลัมน์WHERE conditionคือเงื่อนไขที่ใช้ระบุแถวที่เราต้องการแก้ไข หากไม่ระบุเงื่อนไขWHEREจะทำการแก้ไขข้อมูลทุกแถวในตาราง (ซึ่งโดยทั่วไปไม่แนะนำ)
การใช้ Prepared Statement กับ UPDATE
เพื่อป้องกัน SQL Injection เราจะใช้ Prepared Statement ในการแก้ไขข้อมูล โดยมีขั้นตอนดังนี้:
- เตรียม SQL Statement ที่มี Placeholder
- ผูกค่า (Bind Value) กับ Placeholder
- Execute Statement
ตัวอย่าง: สมมติว่าเรามีตาราง users ที่มีคอลัมน์ id, username, และ email เราต้องการแก้ไขอีเมลของผู้ใช้ที่มี id เท่ากับ 1
<?php
// ข้อมูลการเชื่อมต่อฐานข้อมูล (แก้ไขให้ถูกต้อง)
$host = 'localhost';
$db = 'your_database';
$user = 'your_username';
$pass = 'your_password';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// ข้อมูลที่ต้องการแก้ไข
$userId = 1;
$newEmail = 'new.email@example.com';
// 1. เตรียม SQL Statement
$sql = "UPDATE users SET email = ? WHERE id = ?";
// 2. เตรียม Prepared Statement
$stmt = $pdo->prepare($sql);
// 3. ผูกค่ากับ Placeholder
$stmt->bindParam(1, $newEmail, PDO::PARAM_STR); // ผูกค่าอีเมล
$stmt->bindParam(2, $userId, PDO::PARAM_INT); // ผูกค่า ID
// 4. Execute Statement
$stmt->execute();
// แสดงจำนวนแถวที่ได้รับผลกระทบ
echo "แก้ไขข้อมูลสำเร็จ จำนวน " . $stmt->rowCount() . " แถว";
?>
คำอธิบายโค้ด:
- เราสร้าง PDO instance เพื่อเชื่อมต่อกับฐานข้อมูล MySQL
- เราเตรียม SQL Statement
UPDATE users SET email = ? WHERE id = ?โดยใช้?เป็น Placeholder สำหรับค่าที่เราจะใส่เข้าไป - เราใช้
$pdo->prepare($sql)เพื่อสร้าง Prepared Statement จาก SQL Statement - เราใช้
$stmt->bindParam()เพื่อผูกค่ากับ Placeholder โดยระบุตำแหน่งของ Placeholder (เริ่มจาก 1) และค่าที่จะผูก รวมถึงประเภทของข้อมูล (PDO::PARAM_STRสำหรับ String และPDO::PARAM_INTสำหรับ Integer) - เราใช้
$stmt->execute()เพื่อ Execute Prepared Statement - เราใช้
$stmt->rowCount()เพื่อตรวจสอบจำนวนแถวที่ได้รับผลกระทบจากการ Execute คำสั่ง (ในกรณีนี้คือจำนวนแถวที่ถูกแก้ไข)
การใช้ execute() แทน bindParam()
นอกจาก bindParam() แล้ว เรายังสามารถใช้ execute() โดยส่งค่าเป็น Array ได้ ซึ่งให้ผลลัพธ์เหมือนกันและอาจจะสะดวกกว่าในบางกรณี:
<?php
// ... (โค้ดเชื่อมต่อฐานข้อมูลเหมือนเดิม)
// ข้อมูลที่ต้องการแก้ไข
$userId = 1;
$newEmail = 'new.email@example.com';
// 1. เตรียม SQL Statement
$sql = "UPDATE users SET email = ? WHERE id = ?";
// 2. เตรียม Prepared Statement
$stmt = $pdo->prepare($sql);
// 3. Execute Statement โดยส่งค่าเป็น Array
$stmt->execute([$newEmail, $userId]);
// แสดงจำนวนแถวที่ได้รับผลกระทบ
echo "แก้ไขข้อมูลสำเร็จ จำนวน " . $stmt->rowCount() . " แถว";
?>
ในกรณีนี้ เราส่ง Array [$newEmail, $userId] ให้กับ execute() โดยค่าใน Array จะถูกแทนที่ Placeholder ตามลำดับ
การตรวจสอบผลลัพธ์
หลังจาก Execute Statement แล้ว เราควรตรวจสอบผลลัพธ์เพื่อให้แน่ใจว่าการแก้ไขข้อมูลสำเร็จหรือไม่ โดยเราสามารถใช้ $stmt->rowCount() เพื่อตรวจสอบจำนวนแถวที่ได้รับผลกระทบได้:
- หาก
$stmt->rowCount()คืนค่า0แสดงว่าไม่มีแถวใดถูกแก้ไข (อาจเป็นเพราะidที่ระบุไม่มีอยู่ในตาราง หรือค่าemailที่กำหนดเหมือนกับค่าเดิม) - หาก
$stmt->rowCount()คืนค่า1แสดงว่ามี 1 แถวถูกแก้ไข (ซึ่งเป็นกรณีที่เราต้องการในตัวอย่างนี้) - หาก
$stmt->rowCount()คืนค่ามากกว่า1แสดงว่ามีหลายแถวถูกแก้ไข (ซึ่งอาจเกิดขึ้นได้หากเงื่อนไขWHEREไม่เฉพาะเจาะจง)
นอกจากนี้ เรายังสามารถใช้ try-catch block เพื่อจัดการกับ Exception ที่อาจเกิดขึ้นระหว่างการ Execute Statement:
<?php
// ... (โค้ดเชื่อมต่อฐานข้อมูลเหมือนเดิม)
// ข้อมูลที่ต้องการแก้ไข
$userId = 1;
$newEmail = 'new.email@example.com';
// 1. เตรียม SQL Statement
$sql = "UPDATE users SET email = ? WHERE id = ?";
try {
// 2. เตรียม Prepared Statement
$stmt = $pdo->prepare($sql);
// 3. Execute Statement โดยส่งค่าเป็น Array
$stmt->execute([$newEmail, $userId]);
// แสดงจำนวนแถวที่ได้รับผลกระทบ
echo "แก้ไขข้อมูลสำเร็จ จำนวน " . $stmt->rowCount() . " แถว";
} catch (PDOException $e) {
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>
การใช้ try-catch block จะช่วยให้เราสามารถจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นได้อย่างเหมาะสม และป้องกันไม่ให้โปรแกรมหยุดทำงานโดยไม่คาดคิด
สรุป
ในบทเรียนนี้ เราได้เรียนรู้วิธีการแก้ไขข้อมูลในฐานข้อมูลโดยใช้ PDO และคำสั่ง SQL UPDATE เราได้เน้นการใช้ Prepared Statements เพื่อป้องกัน SQL Injection และแสดงตัวอย่างการแก้ไขข้อมูลโดยใช้ทั้ง bindParam() และ execute() นอกจากนี้ เรายังได้เรียนรู้วิธีการตรวจสอบผลลัพธ์และจัดการกับ Exception ที่อาจเกิดขึ้น
ในบทเรียนต่อไป เราจะเรียนรู้วิธีการลบข้อมูลออกจากฐานข้อมูล (DELETE) ซึ่งเป็นส่วนสุดท้ายของ CRUD operations