[PHP สำหรับผู้เริ่มต้น] พื้นฐานการเชื่อมต่อ PHP กับฐานข้อมูล (SQL) เพื่อแสดงผลเป็นรายการ
ในบทความที่ผ่านมา เราได้เรียนรู้ไวยากรณ์พื้นฐานของ PHP เช่น อาร์เรย์, ลูป และฟังก์ชันไปแล้ว แต่ในเว็บไซต์จริง ข้อมูลอย่างประกาศหรือรายการสินค้าโดยทั่วไปไม่ได้ถูกเขียนลงในไฟล์ PHP โดยตรง แต่จะถูกจัดการในคลังข้อมูลพิเศษที่เรียกว่า ฐานข้อมูล (database)
"จะเชื่อมต่อ PHP กับฐานข้อมูลได้อย่างไร?", "จะแสดงข้อมูลที่ดึงมาจาก SQL บนหน้าเว็บได้อย่างไร?" นี่คืออุปสรรคสำคัญที่นักสร้างเว็บหลายคนต้องเจอ ในบทความนี้ เราจะมาไขข้อสงสัยนั้นกัน มาลองสัมผัสประสบการณ์การเขียนโค้ดที่สมบูรณ์แบบที่สามารถคัดลอกและวางเพื่อใช้งานได้ทันที ตั้งแต่การเชื่อมต่อฐานข้อมูลจาก PHP, การใช้ `foreach` ลูปเพื่อแสดงข้อมูลที่ดึงมาจาก SQL ในรูปแบบตาราง รับรองว่าเมื่อคุณได้สัมผัสกับความมหัศจรรย์ในช่วงเวลาที่ PHP และ SQL เชื่อมต่อกันแล้ว คุณจะต้องอยากลองทำกับข้อมูลของคุณเองแน่นอน!
สำหรับการเตรียมตัวเพื่อรัน PHP (สภาพแวดล้อมการพัฒนา) หากคุณยังไม่ได้ติดตั้ง XAMPP โปรดอ้างอิงจาก [PHP สำหรับผู้เริ่มต้น] คู่มือฉบับสมบูรณ์เกี่ยวกับการดาวน์โหลดและติดตั้ง XAMPP! หลังจากติดตั้งแล้ว เพียงแค่วางไฟล์ PHP ของคุณในโฟลเดอร์ที่กำหนด (เช่น `htdocs`) ก็พร้อมใช้งานแล้วครับ!
1. 3 ขั้นตอนในการเชื่อมต่อ PHP และฐานข้อมูล
ขั้นตอนการทำงานระหว่าง PHP กับฐานข้อมูล แบ่งออกเป็น 3 ขั้นตอนหลักๆ ดังนี้
- เชื่อมต่อ (Connect): PHP ทักทายฐานข้อมูลว่า "สวัสดี ขอคุยด้วยได้ไหม?" และสร้างการเชื่อมต่อ
- สั่งการ (Execute Query): PHP สั่งการฐานข้อมูลด้วยภาษาที่เรียกว่า SQL ว่า "ขอดูข้อมูลนี้จากตารางนี้หน่อย"
- แสดงผล (Display Results): PHP นำข้อมูลที่ได้รับจากฐานข้อมูลมาแปลงเป็น HTML แล้วแสดงผลบนหน้าเว็บไซต์
ครั้งนี้ เราจะใช้กลไกที่เรียกว่า PDO (PHP Data Objects) ซึ่งเป็นวิธีการที่ปลอดภัยและทันสมัยในการทำ 3 ขั้นตอนนี้ PDO เป็นฟังก์ชันมาตรฐานของ PHP ที่สามารถรองรับฐานข้อมูลได้หลากหลายประเภท และมีความปลอดภัยสูง จึงเป็นความรู้ที่จำเป็นอย่างยิ่งในการพัฒนา PHP ในปัจจุบัน
2. ภาคปฏิบัติ! แสดงรายการสินค้าจากฐานข้อมูล
ต่อไป เรามาเขียนโค้ดเพื่อดึงข้อมูลรายการสินค้าจากฐานข้อมูลมาแสดงผลกันจริงๆ เลยครับ
ขั้นตอน A: การเตรียมฐานข้อมูลและตาราง
ก่อนอื่น คุณต้องเตรียมตารางสำหรับเก็บข้อมูลก่อน โดยใช้เครื่องมือจัดการฐานข้อมูลอย่าง phpMyAdmin แล้วรันคำสั่ง SQL ต่อไปนี้เพื่อสร้างตาราง `products` และเพิ่มข้อมูลตัวอย่าง 3 รายการ
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO products (name, price) VALUES
('โน้ตบุ๊กประสิทธิภาพสูง', 120000),
('หูฟังไร้สาย', 15000),
('จอภาพ 4K', 45000);
ขั้นตอน B: การดึงและแสดงข้อมูลด้วย PHP
เมื่อเตรียมตารางเสร็จแล้ว ก็ถึงตาของ PHP แล้วครับ โค้ดด้านล่างนี้เป็นตัวอย่างที่สมบูรณ์แบบ ซึ่งรวมทุกอย่างตั้งแต่การเชื่อมต่อฐานข้อมูล, การดึงข้อมูล, ไปจนถึงการแสดงผลด้วย HTML หากคุณอัปโหลดไฟล์นี้ขึ้นเซิร์ฟเวอร์ ก็จะสามารถเห็นผลลัพธ์ผ่านเบราว์เซอร์ได้ทันที
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<title>รายการสินค้า</title>
<style>
body { font-family: sans-serif; padding: 20px; }
h1 { border-bottom: 2px solid #0056b3; }
.product-table { width: 100%; border-collapse: collapse; margin-top: 20px; }
.product-table th, .product-table td { border: 1px solid #ddd; padding: 12px; text-align: left; }
.product-table th { background-color: #f2f2f2; }
.product-table tr:nth-child(even) { background-color: #f9f9f9; }
.error-message { color: red; font-weight: bold; border: 1px solid red; padding: 10px; }
</style>
</head>
<body>
<h1>รายการสินค้า</h1>
<?php
// --- 1. การเชื่อมต่อฐานข้อมูล ---
$db_host = 'localhost'; // ชื่อโฮสต์ของเซิร์ฟเวอร์ฐานข้อมูล
$db_name = 'your_database_name'; // ชื่อฐานข้อมูล
$db_user = 'your_username'; // ชื่อผู้ใช้ฐานข้อมูล
$db_pass = 'your_password'; // รหัสผ่านฐานข้อมูล
try {
// สร้างอ็อบเจ็กต์ PDO เพื่อเชื่อมต่อฐานข้อมูล
$pdo = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_pass);
// ตั้งค่าให้ throw exception เมื่อเกิด error
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// --- 2. การรัน SQL ---
// คำสั่งคิวรีเพื่อดึงข้อมูลทั้งหมดจากตาราง products
$stmt = $pdo->prepare("SELECT id, name, price FROM products ORDER BY id");
$stmt->execute();
// --- 3. การดึงและแสดงผลลัพธ์ ---
// ดึงข้อมูลทั้งหมดในรูปแบบอาร์เรย์แบบ Assoiative
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($products) {
echo '<table class="product-table">';
echo '<tr><th>รหัสสินค้า</th><th>ชื่อสินค้า</th><th>ราคา</th></tr>';
// วนลูปด้วย foreach
foreach ($products as $product) {
echo '<tr>';
echo '<td>' . htmlspecialchars($product['id']) . '</td>';
echo '<td>' . htmlspecialchars($product['name']) . '</td>';
echo '<td>฿' . number_format($product['price']) . '</td>';
echo '</tr>';
}
echo '</table>';
} else {
echo '<p>ไม่พบข้อมูลสินค้า</p>';
}
} catch (PDOException $e) {
// การจัดการเมื่อเกิดข้อผิดพลาดในการเชื่อมต่อหรือคิวรี
echo '<div class="error-message">ข้อผิดพลาดของฐานข้อมูล: ' . htmlspecialchars($e->getMessage()) . '</div>';
}
?>
</body>
</html>
สำคัญ: ก่อนที่จะรันโค้ดข้างต้น อย่าลืมแก้ไข `your_database_name`, `your_username`, และ `your_password` ให้ตรงกับข้อมูลของสภาพแวดล้อมของคุณ
เมื่อเข้าถึงไฟล์นี้ผ่านเบราว์เซอร์แล้วเห็นรายการสินค้าแสดงในตารางก็ถือว่าสำเร็จ! นี่คือช่วงเวลาที่ PHP ได้พูดคุยกับฐานข้อมูลและสร้างผลลัพธ์เป็น HTML แบบไดนามิกขึ้นมา
3. ข้อควรระวัง
การเชื่อมต่อกับฐานข้อมูลมีประโยชน์อย่างมาก แต่ก็มีข้อควรระวังบางประการ โดยเฉพาะเรื่องความปลอดภัยและการจัดการข้อผิดพลาด
การจัดการข้อผิดพลาด (try...catch)
หากรหัสผ่านฐานข้อมูลผิดหรือไวยากรณ์ SQL มีข้อผิดพลาด โปรแกรมจะหยุดทำงานพร้อมกับแสดงข้อผิดพลาด การครอบโค้ดทั้งหมดด้วย `try...catch` จะช่วยให้เราสามารถดักจับข้อผิดพลาดเหล่านั้นและแสดงข้อความที่เรากำหนดเองได้ แทนที่จะปล่อยให้หน้าเว็บขาวโพลน
<?php
try {
// โค้ดที่เชื่อมต่อและดึงข้อมูลจากฐานข้อมูล
// หากเกิดข้อผิดพลาดขึ้นในส่วนนี้...
$pdo = new PDO("mysql:host=localhost;dbname=wrong_db;charset=utf8", "user", "pass");
} catch (PDOException $e) {
// ...โค้ดในส่วนนี้จะทำงานแทน
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
// ในเว็บไซต์จริง เราจะแสดงข้อความง่ายๆ ให้ผู้ใช้เห็น
// และบันทึกรายละเอียดของข้อผิดพลาดลงในไฟล์ log
// exit(); // หยุดการทำงานของโปรแกรม
}
?>
กลไกนี้ช่วยไม่ให้ผู้ใช้สับสนเมื่อเกิดข้อผิดพลาดที่ไม่คาดคิด และช่วยให้นักพัฒนาสามารถระบุสาเหตุของข้อผิดพลาดได้ง่ายขึ้น
การป้องกัน SQL Injection
เมื่อคุณสร้างคำสั่ง SQL จากข้อมูลที่ผู้ใช้ป้อนเข้ามา (เช่น คำค้นหา) มีความเสี่ยงที่จะถูกโจมตีแบบที่อันตรายมากที่เรียกว่า **SQL Injection** ซึ่งเป็นการฉีดคำสั่ง SQL ที่ประสงค์ร้ายเข้ามาเพื่อควบคุมฐานข้อมูลอย่างไม่ถูกต้อง
การใช้ **Prepared Statements** ของ PDO (วิธีที่ใช้ `prepare()` และ `execute()`) เป็นมาตรการป้องกัน SQL Injection ที่มีประสิทธิภาพที่สุด ถึงแม้ว่าในครั้งนี้จะไม่มีข้อมูลจากผู้ใช้ แต่ควรสร้างนิสัยให้ใช้วิธีนี้อยู่เสมอ
4. สรุป
ครั้งนี้ เราได้เรียนรู้ 3 ขั้นตอนพื้นฐานในการเชื่อมต่อ PHP และฐานข้อมูล (เชื่อมต่อ, สั่งการ, แสดงผล) แบบครบวงจรโดยใช้ PDO การที่เราสามารถดึงข้อมูลจากคลังข้อมูลภายนอกอย่างฐานข้อมูลมาแสดงผลแบบไดนามิกได้ แทนการเขียนข้อมูลลงในไฟล์ PHP โดยตรง ถือเป็นก้าวสำคัญในการพัฒนาเว็บแอปพลิเคชัน
เมื่อคุณเข้าใจรูปแบบพื้นฐานนี้แล้ว คุณจะสามารถประยุกต์ใช้ได้หลากหลาย เช่น การเพิ่ม `WHERE` clause เพื่อกรองข้อมูลตามเงื่อนไข หรือการเชื่อมต่อกับฟอร์มเพื่อลงทะเบียนข้อมูลด้วยคำสั่ง `INSERT` ขอให้สนุกกับการทดลองใช้กับตารางและข้อมูลที่คุณสร้างขึ้นเองนะครับ!