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 สำหรับการอ่านข้อมูลมีดังนี้:
- เตรียม SQL SELECT statement ด้วย PDO
prepare()method - (Optional) ผูกค่า (bind values) เข้ากับ parameter ใน SQL statement ด้วย
bindParam() - Execute prepared statement ด้วย
execute()method - ดึงข้อมูลที่ได้จาก 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-catchblock เพื่อจัดการ 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 แทนข้อมูลของผู้ใช้แต่ละคน - เราใช้
foreachloop เพื่อวนรอบ array ของผู้ใช้และแสดงข้อมูลของผู้ใช้แต่ละคน
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการอ่านข้อมูลจากฐานข้อมูลด้วย PDO โดยใช้ SQL SELECT statement และ prepared statement เราได้เรียนรู้วิธีการใช้ fetch() และ fetchAll() method เพื่อดึงข้อมูล และวิธีการแสดงข้อมูลที่ดึงออกมา
ในบทต่อไป เราจะเรียนรู้วิธีการแก้ไขข้อมูลที่มีอยู่ในฐานข้อมูล (UPDATE) ซึ่งเป็นส่วนหนึ่งของ CRUD operations