🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[PHP สำหรับผู้เริ่มต้น] พื้นฐานการเชื่อมต่อ PHP กับฐานข้อมูล (SQL) เพื่อแสดงผลเป็นรายการ

ในบทความที่ผ่านมา เราได้เรียนรู้ไวยากรณ์พื้นฐานของ PHP เช่น อาร์เรย์, ลูป และฟังก์ชันไปแล้ว แต่ในเว็บไซต์จริง ข้อมูลอย่างประกาศหรือรายการสินค้าโดยทั่วไปไม่ได้ถูกเขียนลงในไฟล์ PHP โดยตรง แต่จะถูกจัดการในคลังข้อมูลพิเศษที่เรียกว่า ฐานข้อมูล (database)

"จะเชื่อมต่อ PHP กับฐานข้อมูลได้อย่างไร?", "จะแสดงข้อมูลที่ดึงมาจาก SQL บนหน้าเว็บได้อย่างไร?" นี่คืออุปสรรคสำคัญที่นักสร้างเว็บหลายคนต้องเจอ ในบทความนี้ เราจะมาไขข้อสงสัยนั้นกัน มาลองสัมผัสประสบการณ์การเขียนโค้ดที่สมบูรณ์แบบที่สามารถคัดลอกและวางเพื่อใช้งานได้ทันที ตั้งแต่การเชื่อมต่อฐานข้อมูลจาก PHP, การใช้ `foreach` ลูปเพื่อแสดงข้อมูลที่ดึงมาจาก SQL ในรูปแบบตาราง รับรองว่าเมื่อคุณได้สัมผัสกับความมหัศจรรย์ในช่วงเวลาที่ PHP และ SQL เชื่อมต่อกันแล้ว คุณจะต้องอยากลองทำกับข้อมูลของคุณเองแน่นอน!

สำหรับการเตรียมตัวเพื่อรัน PHP (สภาพแวดล้อมการพัฒนา) หากคุณยังไม่ได้ติดตั้ง XAMPP โปรดอ้างอิงจาก [PHP สำหรับผู้เริ่มต้น] คู่มือฉบับสมบูรณ์เกี่ยวกับการดาวน์โหลดและติดตั้ง XAMPP! หลังจากติดตั้งแล้ว เพียงแค่วางไฟล์ PHP ของคุณในโฟลเดอร์ที่กำหนด (เช่น `htdocs`) ก็พร้อมใช้งานแล้วครับ!

1. 3 ขั้นตอนในการเชื่อมต่อ PHP และฐานข้อมูล

ขั้นตอนการทำงานระหว่าง PHP กับฐานข้อมูล แบ่งออกเป็น 3 ขั้นตอนหลักๆ ดังนี้

  1. เชื่อมต่อ (Connect): PHP ทักทายฐานข้อมูลว่า "สวัสดี ขอคุยด้วยได้ไหม?" และสร้างการเชื่อมต่อ
  2. สั่งการ (Execute Query): PHP สั่งการฐานข้อมูลด้วยภาษาที่เรียกว่า SQL ว่า "ขอดูข้อมูลนี้จากตารางนี้หน่อย"
  3. แสดงผล (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` ขอให้สนุกกับการทดลองใช้กับตารางและข้อมูลที่คุณสร้างขึ้นเองนะครับ!