メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

CRUD Operations: การแก้ไขข้อมูล (UPDATE)

บทความนี้อธิบายวิธีการแก้ไขข้อมูลในฐานข้อมูลโดยใช้ PDO และคำสั่ง SQL `UPDATE` ซึ่งเป็นส่วนหนึ่งของ CRUD operations โดยเน้นการใช้ Prepared Statements เพื่อป้องกั...

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 ในการแก้ไขข้อมูล โดยมีขั้นตอนดังนี้:

  1. เตรียม SQL Statement ที่มี Placeholder
  2. ผูกค่า (Bind Value) กับ Placeholder
  3. 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

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る