การแก้ไขข้อมูลในฐานข้อมูล
สวัสดีครับ! ในบทที่ 18 ที่ผ่านมา เราได้เรียนรู้วิธีการเพิ่มข้อมูลใหม่ลงในฐานข้อมูล MySQL โดยใช้ PHP กันไปแล้ว ในบทนี้ เราจะมาเรียนรู้วิธีการแก้ไขข้อมูลที่มีอยู่แล้วในฐานข้อมูลกันครับ ซึ่งเป็นส่วนสำคัญของการทำ CRUD (Create, Read, Update, Delete) ให้สมบูรณ์แบบ
UPDATE Statement คืออะไร?
UPDATE statement เป็นคำสั่ง SQL ที่ใช้สำหรับแก้ไขข้อมูลในตาราง โดยเราจะระบุตารางที่ต้องการแก้ไข, คอลัมน์ที่ต้องการเปลี่ยนแปลง, และเงื่อนไขในการเลือกแถวที่จะแก้ไข
โครงสร้างของ UPDATE Statement
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
UPDATE table_name: ระบุชื่อตารางที่ต้องการแก้ไขSET column1 = value1, column2 = value2, ...: ระบุคอลัมน์และค่าใหม่ที่ต้องการกำหนดWHERE condition: ระบุเงื่อนไขในการเลือกแถวที่จะแก้ไข (สำคัญมาก!)
สำคัญ: หากคุณไม่ระบุ WHERE clause, ข้อมูลในทุกแถวของตารางจะถูกแก้ไข! ดังนั้นต้องระมัดระวังเป็นพิเศษ
ตัวอย่างการใช้งานจริง
สมมติว่าเรามีตาราง users ที่เก็บข้อมูลผู้ใช้งาน และเราต้องการแก้ไขอีเมลของผู้ใช้ที่มี id เท่ากับ 1 ให้เป็น new_email@example.com
โครงสร้างตาราง users:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
INSERT INTO users (username, email) VALUES
('john_doe', 'john.doe@example.com'),
('jane_doe', 'jane.doe@example.com');
โค้ด PHP สำหรับแก้ไขข้อมูล:
<?php
// ข้อมูลสำหรับการเชื่อมต่อฐานข้อมูล
$servername = "localhost";
$username = "your_username"; // แก้ไขเป็น username ของคุณ
$password = "your_password"; // แก้ไขเป็น password ของคุณ
$dbname = "your_database"; // แก้ไขเป็นชื่อ database ของคุณ
try {
// สร้างการเชื่อมต่อ
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// กำหนดให้ PDO แสดง error ทั้งหมด
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ข้อมูลที่ต้องการแก้ไข
$id = 1;
$newEmail = "new_email@example.com";
// คำสั่ง SQL สำหรับแก้ไขข้อมูล
$sql = "UPDATE users SET email = :email WHERE id = :id";
// เตรียม prepared statement
$stmt = $conn->prepare($sql);
// ผูกค่า parameter
$stmt->bindParam(':email', $newEmail);
$stmt->bindParam(':id', $id);
// execute the query
$stmt->execute();
// แสดงข้อความเมื่อแก้ไขข้อมูลสำเร็จ
echo "แก้ไขข้อมูลสำเร็จ";
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
- เชื่อมต่อกับฐานข้อมูล: สร้างการเชื่อมต่อกับฐานข้อมูล MySQL โดยใช้ PDO
- เตรียม
UPDATEstatement: สร้างคำสั่ง SQL สำหรับแก้ไขข้อมูล โดยใช้ placeholder (:emailและ:id) เพื่อป้องกัน SQL Injection - ผูกค่า parameter: ใช้
bindParam()เพื่อผูกค่าให้กับ placeholder - Execute query: สั่งให้ PDO execute คำสั่ง SQL
- จัดการ Error: ใช้
try...catchblock เพื่อจัดการกับข้อผิดพลาดที่อาจเกิดขึ้น
WHERE Clause: เงื่อนไขการแก้ไขข้อมูล
WHERE clause เป็นส่วนสำคัญของการแก้ไขข้อมูล เพราะมันกำหนดว่าเราจะแก้ไขข้อมูลในแถวไหนบ้าง โดยเราสามารถใช้เงื่อนไขต่างๆ เพื่อระบุแถวที่ต้องการแก้ไขได้
ตัวอย่างการใช้ WHERE Clause
แก้ไขอีเมลของผู้ใช้ที่มี username เป็น 'john_doe':
<?php
// ... (ส่วนของการเชื่อมต่อฐานข้อมูลเหมือนเดิม)
try {
// ... (ส่วนของการเชื่อมต่อฐานข้อมูลเหมือนเดิม)
// ข้อมูลที่ต้องการแก้ไข
$username = "john_doe";
$newEmail = "john.new@example.com";
// คำสั่ง SQL สำหรับแก้ไขข้อมูล
$sql = "UPDATE users SET email = :email WHERE username = :username";
// เตรียม prepared statement
$stmt = $conn->prepare($sql);
// ผูกค่า parameter
$stmt->bindParam(':email', $newEmail);
$stmt->bindParam(':username', $username);
// execute the query
$stmt->execute();
// แสดงข้อความเมื่อแก้ไขข้อมูลสำเร็จ
echo "แก้ไขข้อมูลสำเร็จ";
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
แก้ไขข้อมูลของผู้ใช้ที่สมัครสมาชิกก่อนวันที่ 2023-01-01 (สมมติว่ามีคอลัมน์ created_at):
<?php
// ... (ส่วนของการเชื่อมต่อฐานข้อมูลเหมือนเดิม)
try {
// ... (ส่วนของการเชื่อมต่อฐานข้อมูลเหมือนเดิม)
// ข้อมูลที่ต้องการแก้ไข
$cutoffDate = "2023-01-01";
$newEmail = "old_user@example.com";
// คำสั่ง SQL สำหรับแก้ไขข้อมูล
$sql = "UPDATE users SET email = :email WHERE created_at < :cutoffDate";
// เตรียม prepared statement
$stmt = $conn->prepare($sql);
// ผูกค่า parameter
$stmt->bindParam(':email', $newEmail);
$stmt->bindParam(':cutoffDate', $cutoffDate);
// execute the query
$stmt->execute();
// แสดงข้อความเมื่อแก้ไขข้อมูลสำเร็จ
echo "แก้ไขข้อมูลสำเร็จ";
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
การตรวจสอบ Error
การตรวจสอบ error เป็นสิ่งสำคัญในการพัฒนา API เพื่อให้เราสามารถจัดการกับปัญหาที่อาจเกิดขึ้นได้อย่างเหมาะสม
Error ที่พบบ่อยในการแก้ไขข้อมูล
- SQL Injection: เกิดจากการใช้ข้อมูลที่ไม่ได้ตรวจสอบจากผู้ใช้ในการสร้างคำสั่ง SQL (เราป้องกันได้ด้วย Prepared Statement)
- Connection Error: เกิดจากปัญหาในการเชื่อมต่อกับฐานข้อมูล (เช่น username/password ไม่ถูกต้อง, ฐานข้อมูลไม่พร้อมใช้งาน)
- Syntax Error: เกิดจากไวยากรณ์ของคำสั่ง SQL ไม่ถูกต้อง
- Data Type Error: เกิดจากการพยายามใส่ข้อมูลที่ไม่ตรงกับชนิดข้อมูลของคอลัมน์ (เช่น ใส่ string ในคอลัมน์ที่เป็น integer)
- Record Not Found: เกิดจากการพยายามแก้ไขข้อมูลที่ไม่มีอยู่ในฐานข้อมูล
ตัวอย่างการจัดการ Error
เราได้ใช้ try...catch block ในตัวอย่างก่อนหน้านี้แล้ว เพื่อดักจับข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการเชื่อมต่อและ execute คำสั่ง SQL
นอกจากนี้ เรายังสามารถตรวจสอบว่ามีแถวที่ถูกแก้ไขหรือไม่ โดยใช้ rowCount() method
<?php
// ... (ส่วนของการเชื่อมต่อฐานข้อมูลเหมือนเดิม)
try {
// ... (ส่วนของการเชื่อมต่อฐานข้อมูลเหมือนเดิม)
// ข้อมูลที่ต้องการแก้ไข
$id = 1;
$newEmail = "new_email@example.com";
// คำสั่ง SQL สำหรับแก้ไขข้อมูล
$sql = "UPDATE users SET email = :email WHERE id = :id";
// เตรียม prepared statement
$stmt = $conn->prepare($sql);
// ผูกค่า parameter
$stmt->bindParam(':email', $newEmail);
$stmt->bindParam(':id', $id);
// execute the query
$stmt->execute();
// ตรวจสอบว่ามีแถวที่ถูกแก้ไขหรือไม่
$rowCount = $stmt->rowCount();
if ($rowCount > 0) {
echo "แก้ไขข้อมูลสำเร็จ จำนวน " . $rowCount . " แถว";
} else {
echo "ไม่พบข้อมูลที่ต้องการแก้ไข";
}
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการแก้ไขข้อมูลในฐานข้อมูล MySQL โดยใช้ PHP ผ่านคำสั่ง UPDATE statement รวมถึงการใช้ WHERE clause เพื่อระบุแถวที่ต้องการแก้ไข และการตรวจสอบ error เพื่อให้ API ของเราทำงานได้อย่างถูกต้องและมีประสิทธิภาพ ในบทต่อไป เราจะมาเรียนรู้วิธีการลบข้อมูลออกจากฐานข้อมูลกันครับ