การดึงข้อมูลด้วย 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();ดึงข้อมูลแถวแรกจากผลลัพธ์และเก็บไว้ในตัวแปร$rowif ($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 ของ arrayif ($rows) { ... }ตรวจสอบว่ามีข้อมูลหรือไม่ ถ้ามี จะวนลูปผ่านแต่ละแถวและแสดงผลข้อมูลในแต่ละคอลัมน์
การเลือก fetch mode
fetch() และ fetchAll() สามารถรับ parameter เป็น fetch mode เพื่อกำหนดรูปแบบของข้อมูลที่ต้องการให้คืนค่า Fetch mode ที่พบบ่อยมีดังนี้:
PDO::FETCH_ASSOC: คืนค่าเป็น array associative โดยใช้ชื่อคอลัมน์เป็น keyPDO::FETCH_NUM: คืนค่าเป็น array indexed โดยใช้ index ตัวเลขPDO::FETCH_BOTH: (default) คืนค่าเป็น array ที่มีทั้ง associative และ indexedPDO::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()เหมาะสำหรับกรณีที่ต้องการดึงข้อมูลเพียงแถวเดียว เช่น การดึงข้อมูลผู้ใช้ตาม IDfetchAll()เหมาะสำหรับกรณีที่ต้องการดึงข้อมูลหลายแถว เช่น การแสดงรายการสินค้าทั้งหมด
ข้อควรระวัง:
- ตรวจสอบเสมอว่า query ที่ execute ไปแล้วคืนค่าข้อมูลหรือไม่ ก่อนที่จะพยายามเข้าถึงข้อมูลใน
$rowหรือ$rowsเพื่อป้องกัน error - เมื่อใช้
fetchAll()กับตารางที่มีข้อมูลจำนวนมาก อาจทำให้ใช้ memory มากเกินไป ควรพิจารณาใช้ pagination หรือวิธีอื่นในการจัดการข้อมูลจำนวนมาก
ในบทเรียนนี้ เราได้เรียนรู้วิธีการดึงข้อมูลจากฐานข้อมูลด้วย fetch() และ fetchAll() พร้อมทั้งทำความเข้าใจเกี่ยวกับ fetch mode ต่างๆ ในบทเรียนต่อไป เราจะมาเรียนรู้เกี่ยวกับการสร้าง, อ่าน, แก้ไข, และลบข้อมูล (CRUD Operations) ด้วย PDO