Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การเพิ่มข้อมูลลงในฐานข้อมูล

บทนี้กล่าวถึงวิธีการเพิ่มข้อมูลลงในฐานข้อมูล MySQL โดยใช้ PHP ผ่านคำสั่ง `INSERT` statement รวมถึงเน้นย้ำถึงความสำคัญของการป้องกัน SQL Injection ด้วย Prepared S...

การเพิ่มข้อมูลลงในฐานข้อมูล

หลังจากที่เราได้เรียนรู้วิธีการดึงข้อมูลจากฐานข้อมูลไปแล้ว ในบทนี้เราจะมาเรียนรู้วิธีการเพิ่มข้อมูลใหม่ลงในฐานข้อมูล 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 ที่สามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพ ในบทต่อไป เราจะมาเรียนรู้วิธีการแก้ไขข้อมูลในฐานข้อมูลกันครับ

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service