본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

การดึงข้อมูลด้วย 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는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기