ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การดึงข้อมูลด้วย PDO: fetch(), fetchAll()

บทความนี้อธิบายวิธีการดึงข้อมูลจากฐานข้อมูลด้วย PDO โดยใช้เมธอด `fetch()` สำหรับดึงข้อมูลแถวเดียว และ `fetchAll()` สำหรับดึงข้อมูลทั้งหมด พร้อมทั้งอธิบายถึง fet...

การดึงข้อมูลด้วย PDO: fetch(), fetchAll()

ในบทเรียนที่ผ่านมา เราได้เรียนรู้เกี่ยวกับการเชื่อมต่อฐานข้อมูลด้วย PDO และการใช้ Prepared Statements เพื่อป้องกัน SQL Injection ในบทนี้ เราจะมาเรียนรู้วิธีการดึงข้อมูลจากฐานข้อมูลโดยใช้เมธอด fetch() และ fetchAll() ของ PDO พร้อมทั้งทำความเข้าใจเกี่ยวกับ fetch mode ต่างๆ

การใช้งาน fetch()

เมธอด fetch() ใช้สำหรับดึงข้อมูลแถวเดียวจากผลลัพธ์ของ query ที่ execute ไปแล้ว โดยจะคืนค่าเป็น array ที่มีข้อมูลของแถวนั้น หรือ false หากไม่มีข้อมูลเหลืออยู่

รูปแบบการใช้งาน:

$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = ?");
$stmt->execute([1]); // สมมติว่าต้องการดึงข้อมูล user ที่มี id = 1

$row = $stmt->fetch();

if ($row) {
    echo "ID: " . $row['id'] . "<br>";
    echo "Name: " . $row['name'] . "<br>";
    echo "Email: " . $row['email'] . "<br>";
} else {
    echo "ไม่พบข้อมูล";
}

อธิบายโค้ด:

  • $stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = ?"); เตรียม prepared statement สำหรับดึงข้อมูล id, name, และ email จากตาราง users โดยใช้ WHERE clause เพื่อระบุ id ที่ต้องการ
  • $stmt->execute([1]); execute prepared statement โดยส่งค่า id = 1 เป็น parameter
  • $row = $stmt->fetch(); ดึงข้อมูลแถวแรกจากผลลัพธ์และเก็บไว้ในตัวแปร $row
  • if ($row) { ... } ตรวจสอบว่ามีข้อมูลหรือไม่ ถ้ามี จะแสดงผลข้อมูลในแต่ละคอลัมน์

การใช้งาน fetchAll()

เมธอด fetchAll() ใช้สำหรับดึงข้อมูลทั้งหมดจากผลลัพธ์ของ query ที่ execute ไปแล้ว โดยจะคืนค่าเป็น array ของ array ซึ่งแต่ละ array แทนข้อมูลในแต่ละแถว หรือ array ว่างเปล่าหากไม่มีข้อมูล

รูปแบบการใช้งาน:

$stmt = $pdo->prepare("SELECT id, name, email FROM users");
$stmt->execute();

$rows = $stmt->fetchAll();

if ($rows) {
    foreach ($rows as $row) {
        echo "ID: " . $row['id'] . "<br>";
        echo "Name: " . $row['name'] . "<br>";
        echo "Email: " . $row['email'] . "<br>";
        echo "<hr>";
    }
} else {
    echo "ไม่พบข้อมูล";
}

อธิบายโค้ด:

  • $stmt = $pdo->prepare("SELECT id, name, email FROM users"); เตรียม prepared statement สำหรับดึงข้อมูล id, name, และ email จากตาราง users
  • $stmt->execute(); execute prepared statement โดยไม่มี parameter
  • $rows = $stmt->fetchAll(); ดึงข้อมูลทั้งหมดจากผลลัพธ์และเก็บไว้ในตัวแปร $rows ซึ่งเป็น array ของ array
  • if ($rows) { ... } ตรวจสอบว่ามีข้อมูลหรือไม่ ถ้ามี จะวนลูปผ่านแต่ละแถวและแสดงผลข้อมูลในแต่ละคอลัมน์

การเลือก fetch mode

fetch() และ fetchAll() สามารถรับ parameter เป็น fetch mode เพื่อกำหนดรูปแบบของข้อมูลที่ต้องการให้คืนค่า Fetch mode ที่พบบ่อยมีดังนี้:

  • PDO::FETCH_ASSOC: คืนค่าเป็น array associative โดยใช้ชื่อคอลัมน์เป็น key
  • PDO::FETCH_NUM: คืนค่าเป็น array indexed โดยใช้ index ตัวเลข
  • PDO::FETCH_BOTH: (default) คืนค่าเป็น array ที่มีทั้ง associative และ indexed
  • PDO::FETCH_OBJ: คืนค่าเป็น object โดยมี property เป็นชื่อคอลัมน์

ตัวอย่างการใช้งาน fetch mode:

// FETCH_ASSOC
$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = ?");
$stmt->execute([1]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row) {
    echo "Name: " . $row['name'] . "<br>";
}

// FETCH_NUM
$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = ?");
$stmt->execute([1]);
$row = $stmt->fetch(PDO::FETCH_NUM);

if ($row) {
    echo "Name: " . $row[1] . "<br>"; // index 1 คือคอลัมน์ name
}

// FETCH_OBJ
$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = ?");
$stmt->execute([1]);
$row = $stmt->fetch(PDO::FETCH_OBJ);

if ($row) {
    echo "Name: " . $row->name . "<br>";
}

อธิบายโค้ด:

  • แต่ละตัวอย่างใช้ fetch() ร่วมกับ fetch mode ที่แตกต่างกัน เพื่อแสดงให้เห็นว่าข้อมูลที่คืนค่ามามีรูปแบบที่แตกต่างกัน
  • PDO::FETCH_ASSOC ทำให้เราเข้าถึงข้อมูลด้วยชื่อคอลัมน์ (เช่น $row['name'])
  • PDO::FETCH_NUM ทำให้เราเข้าถึงข้อมูลด้วย index ตัวเลข (เช่น $row[1])
  • PDO::FETCH_OBJ ทำให้เราเข้าถึงข้อมูลผ่าน property ของ object (เช่น $row->name)

การเลือก fetch mode ที่เหมาะสม ขึ้นอยู่กับความต้องการและความสะดวกในการใช้งานของแต่ละโปรเจกต์ โดยทั่วไป PDO::FETCH_ASSOC เป็นที่นิยมเนื่องจากอ่านง่ายและเข้าใจง่าย

การใช้งาน fetch() vs fetchAll()

  • fetch() เหมาะสำหรับกรณีที่ต้องการดึงข้อมูลเพียงแถวเดียว เช่น การดึงข้อมูลผู้ใช้ตาม ID
  • fetchAll() เหมาะสำหรับกรณีที่ต้องการดึงข้อมูลหลายแถว เช่น การแสดงรายการสินค้าทั้งหมด

ข้อควรระวัง:

  • ตรวจสอบเสมอว่า query ที่ execute ไปแล้วคืนค่าข้อมูลหรือไม่ ก่อนที่จะพยายามเข้าถึงข้อมูลใน $row หรือ $rows เพื่อป้องกัน error
  • เมื่อใช้ fetchAll() กับตารางที่มีข้อมูลจำนวนมาก อาจทำให้ใช้ memory มากเกินไป ควรพิจารณาใช้ pagination หรือวิธีอื่นในการจัดการข้อมูลจำนวนมาก

ในบทเรียนนี้ เราได้เรียนรู้วิธีการดึงข้อมูลจากฐานข้อมูลด้วย fetch() และ fetchAll() พร้อมทั้งทำความเข้าใจเกี่ยวกับ fetch mode ต่างๆ ในบทเรียนต่อไป เราจะมาเรียนรู้เกี่ยวกับการสร้าง, อ่าน, แก้ไข, และลบข้อมูล (CRUD Operations) ด้วย PDO

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์