การเพิ่มข้อมูลลงในฐานข้อมูล
หลังจากที่เราได้เรียนรู้วิธีการดึงข้อมูลจากฐานข้อมูลไปแล้ว ในบทนี้เราจะมาเรียนรู้วิธีการเพิ่มข้อมูลใหม่ลงในฐานข้อมูล MySQL โดยใช้ PHP กันครับ การเพิ่มข้อมูลเป็นส่วนสำคัญของ API ที่ช่วยให้ผู้ใช้สามารถสร้างข้อมูลใหม่ๆ ผ่าน API ของเราได้
INSERT Statement คืออะไร?
INSERT statement เป็นคำสั่ง SQL ที่ใช้สำหรับเพิ่มข้อมูลใหม่ลงในตารางในฐานข้อมูล MySQL รูปแบบพื้นฐานของ INSERT statement มีดังนี้:
INSERT INTO ชื่อตาราง (คอลัมน์1, คอลัมน์2, คอลัมน์3, ...)
VALUES (ค่า1, ค่า2, ค่า3, ...);
โดยที่:
ชื่อตารางคือชื่อของตารางที่คุณต้องการเพิ่มข้อมูลลงไปคอลัมน์1, คอลัมน์2, คอลัมน์3, ...คือชื่อของคอลัมน์ที่คุณต้องการใส่ค่าค่า1, ค่า2, ค่า3, ...คือค่าที่คุณต้องการใส่ลงในแต่ละคอลัมน์
ตัวอย่างเช่น ถ้าเรามีตารางชื่อ users ที่มีคอลัมน์ id, name, และ email เราสามารถเพิ่มข้อมูลใหม่ได้ดังนี้:
INSERT INTO users (name, email)
VALUES ('John Doe', 'john.doe@example.com');
ในตัวอย่างนี้ เรากำลังเพิ่มข้อมูลใหม่ให้กับคอลัมน์ name และ email โดยที่ค่า id จะถูกกำหนดโดยอัตโนมัติ (auto-increment) ถ้ามีการตั้งค่าไว้
การเพิ่มข้อมูลด้วย PHP
ต่อไปเราจะมาดูวิธีการใช้ PHP เพื่อเพิ่มข้อมูลลงในฐานข้อมูล MySQL กันครับ สมมติว่าเรามีการเชื่อมต่อกับฐานข้อมูล MySQL เรียบร้อยแล้ว (เหมือนในบทที่แล้ว) เราสามารถใช้ฟังก์ชัน mysqli_query() เพื่อส่งคำสั่ง INSERT ไปยังฐานข้อมูลได้
<?php
// ข้อมูลสำหรับการเพิ่ม
$name = 'Jane Smith';
$email = 'jane.smith@example.com';
// สร้างคำสั่ง SQL
$sql = "INSERT INTO users (name, email) VALUES ('$name', '$email')";
// ส่งคำสั่ง SQL ไปยังฐานข้อมูล
if (mysqli_query($conn, $sql)) {
echo "เพิ่มข้อมูลสำเร็จ";
} else {
echo "เกิดข้อผิดพลาด: " . mysqli_error($conn);
}
?>
โค้ดด้านบนจะทำการเพิ่มข้อมูลใหม่ลงในตาราง users โดยใช้ค่า $name และ $email ที่เรากำหนดไว้ ถ้าการเพิ่มข้อมูลสำเร็จ ระบบจะแสดงข้อความ "เพิ่มข้อมูลสำเร็จ" แต่ถ้าเกิดข้อผิดพลาด ระบบจะแสดงข้อความแสดงข้อผิดพลาดที่เกิดจาก MySQL
ข้อควรระวัง: โค้ดตัวอย่างด้านบนมีความเสี่ยงต่อ SQL Injection ซึ่งเป็นช่องโหว่ด้านความปลอดภัยที่ร้ายแรง เราจะมาเรียนรู้วิธีการป้องกัน SQL Injection ในหัวข้อถัดไป
การป้องกัน SQL Injection
SQL Injection เป็นเทคนิคการโจมตีที่ผู้ไม่ประสงค์ดีสามารถแทรกคำสั่ง SQL ที่เป็นอันตรายเข้าไปในคำสั่ง SQL ของเราได้ ตัวอย่างเช่น ถ้าผู้ใช้ใส่ค่า ' OR 1=1 -- ในช่อง name ในตัวอย่างก่อนหน้า คำสั่ง SQL ของเราจะกลายเป็น:
INSERT INTO users (name, email) VALUES (' OR 1=1 --', 'jane.smith@example.com');
ซึ่งอาจทำให้ผู้โจมตีสามารถเข้าถึงข้อมูลในฐานข้อมูลของเราได้
เพื่อป้องกัน SQL Injection เราควรใช้ Prepared Statement ซึ่งเป็นเทคนิคที่ช่วยให้เราสามารถส่งคำสั่ง SQL และข้อมูลแยกจากกันได้ ทำให้ฐานข้อมูลสามารถตรวจสอบและป้องกันการแทรกแซงคำสั่ง SQL ที่เป็นอันตรายได้
ตัวอย่างการใช้ Prepared Statement ใน PHP:
<?php
// ข้อมูลสำหรับการเพิ่ม
$name = 'Jane Smith';
$email = 'jane.smith@example.com';
// สร้างคำสั่ง SQL ที่มี placeholder
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
// เตรียม statement
$stmt = mysqli_prepare($conn, $sql);
// ตรวจสอบว่าเตรียม statement สำเร็จหรือไม่
if ($stmt === false) {
die("Prepare failed: " . htmlspecialchars(mysqli_error($conn)));
}
// ผูกค่ากับ placeholder โดยระบุชนิดข้อมูล
mysqli_stmt_bind_param($stmt, "ss", $name, $email); // "ss" หมายถึง string, string
// execute statement
if (mysqli_stmt_execute($stmt)) {
echo "เพิ่มข้อมูลสำเร็จ";
} else {
echo "เกิดข้อผิดพลาด: " . mysqli_stmt_error($stmt);
}
// ปิด statement
mysqli_stmt_close($stmt);
?>
อธิบายโค้ด:
mysqli_prepare($conn, $sql): เตรียมคำสั่ง SQL โดยใช้ placeholder?แทนค่าที่เราจะใส่mysqli_stmt_bind_param($stmt, "ss", $name, $email): ผูกค่า$nameและ$emailกับ placeholder โดยระบุชนิดข้อมูลเป็น string ("ss")mysqli_stmt_execute($stmt): ส่งคำสั่ง SQL ที่เตรียมไว้ไปยังฐานข้อมูลmysqli_stmt_close($stmt): ปิด statement เพื่อคืนทรัพยากร
การใช้ Prepared Statement ช่วยให้เราป้องกัน SQL Injection ได้อย่างมีประสิทธิภาพ เนื่องจากข้อมูลที่เราส่งไปจะไม่ถูกตีความว่าเป็นส่วนหนึ่งของคำสั่ง SQL
การตรวจสอบ Error
ในการพัฒนา API เราควรตรวจสอบ error ที่อาจเกิดขึ้นระหว่างการเพิ่มข้อมูล เพื่อให้เราสามารถแจ้ง error ให้กับผู้ใช้ได้อย่างถูกต้อง
ตัวอย่างการตรวจสอบ error:
<?php
// ข้อมูลสำหรับการเพิ่ม
$name = 'Jane Smith';
$email = 'jane.smith@example.com';
// สร้างคำสั่ง SQL ที่มี placeholder
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
// เตรียม statement
$stmt = mysqli_prepare($conn, $sql);
// ตรวจสอบว่าเตรียม statement สำเร็จหรือไม่
if ($stmt === false) {
// ส่ง HTTP Status Code 500 (Internal Server Error)
http_response_code(500);
echo json_encode(array("message" => "ไม่สามารถเตรียมคำสั่ง SQL ได้: " . htmlspecialchars(mysqli_error($conn))));
exit;
}
// ผูกค่ากับ placeholder โดยระบุชนิดข้อมูล
mysqli_stmt_bind_param($stmt, "ss", $name, $email); // "ss" หมายถึง string, string
// execute statement
if (mysqli_stmt_execute($stmt)) {
// ส่ง HTTP Status Code 201 (Created)
http_response_code(201);
echo json_encode(array("message" => "เพิ่มข้อมูลสำเร็จ", "id" => mysqli_insert_id($conn))); // ดึง ID ที่ถูกสร้างขึ้น
} else {
// ส่ง HTTP Status Code 500 (Internal Server Error)
http_response_code(500);
echo json_encode(array("message" => "เกิดข้อผิดพลาดในการเพิ่มข้อมูล: " . mysqli_stmt_error($stmt)));
}
// ปิด statement
mysqli_stmt_close($stmt);
?>
อธิบายโค้ด:
http_response_code(500): กำหนด HTTP Status Code เป็น 500 (Internal Server Error) เมื่อเกิดข้อผิดพลาดhttp_response_code(201): กำหนด HTTP Status Code เป็น 201 (Created) เมื่อเพิ่มข้อมูลสำเร็จjson_encode(array("message" => "ข้อความแสดงข้อผิดพลาด")): สร้าง JSON response ที่มีข้อความแสดงข้อผิดพลาดmysqli_insert_id($conn): ดึง ID ของข้อมูลที่ถูกเพิ่มเข้าไปล่าสุด (auto-increment)
การส่ง HTTP Status Code ที่ถูกต้องและ JSON response ที่มีรายละเอียดข้อผิดพลาด ช่วยให้ผู้ใช้ API สามารถเข้าใจและแก้ไขปัญหาได้ง่ายขึ้น
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง:
- การเพิ่มข้อมูลผู้ใช้ใหม่เมื่อผู้ใช้ลงทะเบียน
- การเพิ่มข้อมูลสินค้าใหม่เมื่อผู้ดูแลระบบเพิ่มสินค้า
- การเพิ่มความคิดเห็นใหม่ในบทความ
ข้อผิดพลาดที่พบบ่อย:
- SQL Injection: ไม่ได้ใช้ Prepared Statement
- Data Type Mismatch: พยายามใส่ข้อมูลชนิดหนึ่งลงในคอลัมน์ที่มีชนิดข้อมูลต่างกัน (เช่น ใส่ string ลงในคอลัมน์ integer)
- Missing Required Fields: ไม่ได้ใส่ค่าในคอลัมน์ที่ถูกกำหนดให้เป็น NOT NULL
- Duplicate Key: พยายามใส่ค่าที่ซ้ำกับค่าที่มีอยู่แล้วในคอลัมน์ที่ถูกกำหนดให้เป็น UNIQUE
- Connection Error: ไม่สามารถเชื่อมต่อกับฐานข้อมูลได้
การเข้าใจกรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย จะช่วยให้คุณสามารถเขียนโค้ดที่ robust และ handle error ได้อย่างมีประสิทธิภาพ
สรุป
ในบทนี้เราได้เรียนรู้วิธีการเพิ่มข้อมูลลงในฐานข้อมูล MySQL โดยใช้ PHP ตั้งแต่การใช้ INSERT statement, การป้องกัน SQL Injection ด้วย Prepared Statement, และการตรวจสอบ error การเพิ่มข้อมูลเป็นส่วนสำคัญของการสร้าง API ที่สามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพ ในบทต่อไป เราจะมาเรียนรู้วิธีการแก้ไขข้อมูลในฐานข้อมูลกันครับ