Skip to main content

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

System guide Content reviewed

CRUD Operations: การอ่านข้อมูล (READ)

บทความนี้อธิบายวิธีการอ่านข้อมูลจากฐานข้อมูลโดยใช้ PDO และ SQL SELECT statement ซึ่งเป็นส่วนหนึ่งของ CRUD operations โดยเน้นการใช้ prepared statement เพื่อป้องก...

CRUD Operations: การอ่านข้อมูล (READ)

ในบทที่แล้ว เราได้เรียนรู้วิธีการสร้างข้อมูลใหม่ในฐานข้อมูลด้วย PDO และ SQL INSERT statement ในบทนี้ เราจะมาเรียนรู้วิธีการอ่านข้อมูลที่มีอยู่ในฐานข้อมูล (READ) ซึ่งเป็นอีกหนึ่งส่วนสำคัญของ CRUD operations

การอ่านข้อมูลจากฐานข้อมูลนั้น มักจะใช้ SQL SELECT statement ร่วมกับ PDO เพื่อดึงข้อมูลที่ต้องการออกมา

SQL SELECT Statement

SQL SELECT statement คือคำสั่งที่ใช้สำหรับดึงข้อมูลจากตารางในฐานข้อมูล รูปแบบพื้นฐานของ SELECT statement คือ:

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • SELECT column1, column2, ...: ระบุคอลัมน์ที่ต้องการดึงข้อมูล หากต้องการดึงทุกคอลัมน์ สามารถใช้ SELECT *
  • FROM table_name: ระบุชื่อตารางที่ต้องการดึงข้อมูล
  • WHERE condition: (Optional) ระบุเงื่อนไขในการเลือกข้อมูล เฉพาะแถวที่ตรงตามเงื่อนไขเท่านั้นที่จะถูกดึงออกมา

ตัวอย่างเช่น หากเรามีตารางชื่อ users ที่มีคอลัมน์ id, username, และ email หากเราต้องการดึงข้อมูลทั้งหมดจากตาราง users เราจะใช้คำสั่ง:

SELECT * FROM users;

หากเราต้องการดึงเฉพาะคอลัมน์ username และ email เราจะใช้คำสั่ง:

SELECT username, email FROM users;

หากเราต้องการดึงข้อมูลเฉพาะผู้ใช้ที่มี id เท่ากับ 1 เราจะใช้คำสั่ง:

SELECT * FROM users WHERE id = 1;

การใช้ Prepared Statement สำหรับการอ่านข้อมูล

เช่นเดียวกับการสร้างข้อมูล การใช้ prepared statement สำหรับการอ่านข้อมูลเป็นสิ่งสำคัญเพื่อป้องกัน SQL Injection

ขั้นตอนการใช้งาน prepared statement สำหรับการอ่านข้อมูลมีดังนี้:

  1. เตรียม SQL SELECT statement ด้วย PDO prepare() method
  2. (Optional) ผูกค่า (bind values) เข้ากับ parameter ใน SQL statement ด้วย bindParam()
  3. Execute prepared statement ด้วย execute() method
  4. ดึงข้อมูลที่ได้จาก prepared statement ด้วย fetch() หรือ fetchAll()

ตัวอย่าง: การอ่านข้อมูลผู้ใช้จากฐานข้อมูล

สมมติว่าเรามีฐานข้อมูล MySQL ชื่อ mydatabase และตารางชื่อ users ที่มีโครงสร้างดังนี้:

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL
);

เราจะเขียนโค้ด PHP เพื่อเชื่อมต่อกับฐานข้อมูลและอ่านข้อมูลผู้ใช้ที่มี id เท่ากับ 1:

<?php
// ข้อมูลสำหรับการเชื่อมต่อฐานข้อมูล
$host = 'localhost';
$dbname = 'mydatabase';
$username = 'root';
$password = '';

try {
  // สร้าง PDO instance
  $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);

  // ตั้งค่าให้ PDO throw exception เมื่อเกิด error
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // เตรียม SQL SELECT statement
  $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");

  // ผูกค่า id เข้ากับ parameter :id
  $id = 1;
  $stmt->bindParam(':id', $id, PDO::PARAM_INT);

  // Execute prepared statement
  $stmt->execute();

  // ดึงข้อมูลผู้ใช้
  $user = $stmt->fetch(PDO::FETCH_ASSOC);

  // ตรวจสอบว่าพบผู้ใช้หรือไม่
  if ($user) {
    // แสดงข้อมูลผู้ใช้
    echo "ID: " . $user['id'] . "<br>";
    echo "Username: " . $user['username'] . "<br>";
    echo "Email: " . $user['email'] . "<br>";
  } else {
    echo "ไม่พบผู้ใช้ที่มี ID = " . $id;
  }

} catch (PDOException $e) {
  echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>

คำอธิบายโค้ด:

  • เราสร้าง PDO instance และตั้งค่าให้ PDO throw exception เมื่อเกิด error
  • เราเตรียม SQL SELECT statement โดยใช้ prepare() method และใช้ named parameter :id เพื่อแทนค่า id ที่เราต้องการดึง
  • เราผูกค่า id เข้ากับ parameter :id ด้วย bindParam() method โดยระบุ type เป็น PDO::PARAM_INT เพื่อให้ PDO รู้ว่าค่าที่ผูกเป็น integer
  • เรา execute prepared statement ด้วย execute() method
  • เราดึงข้อมูลผู้ใช้ด้วย fetch(PDO::FETCH_ASSOC) method ซึ่งจะ return ข้อมูลในรูปแบบ associative array
  • เราตรวจสอบว่าพบผู้ใช้หรือไม่ โดยการตรวจสอบว่า $user ไม่เป็น false
  • หากพบผู้ใช้ เราจะแสดงข้อมูลผู้ใช้
  • หากไม่พบผู้ใช้ เราจะแสดงข้อความว่าไม่พบผู้ใช้
  • เราใช้ try-catch block เพื่อจัดการ exception ที่อาจเกิดขึ้นระหว่างการเชื่อมต่อฐานข้อมูลและการ query ข้อมูล

การดึงข้อมูลหลายแถวด้วย fetchAll()

หากเราต้องการดึงข้อมูลหลายแถวจากฐานข้อมูล เราสามารถใช้ fetchAll() method แทน fetch() method

ตัวอย่างเช่น หากเราต้องการดึงข้อมูลผู้ใช้ทั้งหมดจากตาราง users เราจะใช้คำสั่ง:

SELECT * FROM users;

และโค้ด PHP จะเป็นดังนี้:

<?php
// ข้อมูลสำหรับการเชื่อมต่อฐานข้อมูล (เหมือนเดิม)
$host = 'localhost';
$dbname = 'mydatabase';
$username = 'root';
$password = '';

try {
  // สร้าง PDO instance (เหมือนเดิม)
  $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);

  // ตั้งค่าให้ PDO throw exception เมื่อเกิด error (เหมือนเดิม)
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // เตรียม SQL SELECT statement
  $stmt = $pdo->prepare("SELECT * FROM users");

  // Execute prepared statement
  $stmt->execute();

  // ดึงข้อมูลผู้ใช้ทั้งหมด
  $users = $stmt->fetchAll(PDO::FETCH_ASSOC);

  // ตรวจสอบว่ามีผู้ใช้หรือไม่
  if ($users) {
    // แสดงข้อมูลผู้ใช้ทั้งหมด
    foreach ($users as $user) {
      echo "ID: " . $user['id'] . "<br>";
      echo "Username: " . $user['username'] . "<br>";
      echo "Email: " . $user['email'] . "<br>";
      echo "<hr>"; // เส้นแบ่งระหว่างผู้ใช้แต่ละคน
    }
  } else {
    echo "ไม่มีข้อมูลผู้ใช้";
  }

} catch (PDOException $e) {
  echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
?>

คำอธิบายโค้ด:

  • โค้ดส่วนใหญ่เหมือนกับตัวอย่างก่อนหน้า ยกเว้นในส่วนของการดึงข้อมูล
  • เราใช้ fetchAll(PDO::FETCH_ASSOC) method เพื่อดึงข้อมูลผู้ใช้ทั้งหมด ซึ่งจะ return array ของ associative array โดยแต่ละ associative array แทนข้อมูลของผู้ใช้แต่ละคน
  • เราใช้ foreach loop เพื่อวนรอบ array ของผู้ใช้และแสดงข้อมูลของผู้ใช้แต่ละคน

สรุป

ในบทนี้ เราได้เรียนรู้วิธีการอ่านข้อมูลจากฐานข้อมูลด้วย PDO โดยใช้ SQL SELECT statement และ prepared statement เราได้เรียนรู้วิธีการใช้ fetch() และ fetchAll() method เพื่อดึงข้อมูล และวิธีการแสดงข้อมูลที่ดึงออกมา

ในบทต่อไป เราจะเรียนรู้วิธีการแก้ไขข้อมูลที่มีอยู่ในฐานข้อมูล (UPDATE) ซึ่งเป็นส่วนหนึ่งของ CRUD operations

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