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

[PHP สำหรับผู้เริ่มต้น] สลับหน้าได้อย่างอิสระ! มาสร้างเราเตอร์อย่างง่ายเพื่อทำความเข้าใจกลไกกันเถอะ

จากการเรียนรู้ที่ผ่านมา เราสามารถใช้ PHP เพื่อดึงข้อมูลจากฐานข้อมูลและสร้างหน้าเว็บแบบไดนามิกได้แล้ว แต่โดยปกติแล้ว เว็บไซต์มักจะมีหลายหน้า เช่น "หน้าแรก", "เกี่ยวกับเรา", "ติดต่อเรา" เป็นต้น เราจะจัดการหน้าเหล่านี้อย่างมีประสิทธิภาพโดยใช้ส่วนหัว (header) และส่วนท้าย (footer) ร่วมกันได้อย่างไร?

คำตอบนั้นอยู่ในแนวคิดที่เรียกว่า "การทำเส้นทาง (Routing)" ครับ การทำเส้นทางคือกลไกที่ทำหน้าที่ "จัดการจราจร" โดยจะสลับเนื้อหาที่จะแสดงตาม URL ที่ผู้ใช้เข้าถึง ในบทความนี้ เราจะสร้างเราเตอร์อย่างง่ายด้วย PHP โดยใช้พารามิเตอร์ URL เช่น `index.php?page=about` การได้สัมผัสกับส่วนสำคัญของสิ่งที่เฟรมเวิร์กเต็มรูปแบบอย่าง Laravel ทำงานอยู่เบื้องหลัง จะช่วยให้เราเข้าใจโครงสร้างของเว็บแอปพลิเคชันได้ลึกซึ้งยิ่งขึ้น และเป็นก้าวสำคัญสำหรับการเรียนรู้ในขั้นต่อไปครับ!

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

1. กลไกการทำเส้นทางคืออะไร? การจัดการจราจรด้วย PHP

กลไกการทำเส้นทางสามารถเปรียบได้กับพนักงานต้อนรับในอาคารขนาดใหญ่ ผู้เยี่ยมชม (ผู้ใช้) ทุกคนจะมาถึงทางเข้าหลักเดียวกันก่อน (index.php) จากนั้นก็จะแจ้งกับพนักงานต้อนรับ (เราเตอร์) ว่า "ต้องการไปที่แผนก XX (?page=about)" พนักงานต้อนรับก็จะนำทางไปยังแผนกที่เหมาะสม (about.php) ตามจุดหมายปลายทางนั้นๆ

เพื่อที่จะสร้างกลไกนี้ เราจะใช้องค์ประกอบ 3 อย่างของ PHP ดังนี้ครับ

  1. ตัวแปร $_GET: เป็นตัวแปรพิเศษของ PHP สำหรับรับค่าของ `page` (ในกรณีนี้คือ `about`) จาก "สตริงคิวรี" เช่น ?page=about ที่ต่อท้าย URL
  2. คำสั่ง include: เป็นคำสั่งสำหรับอ่านและรวมเนื้อหาของไฟล์ PHP อื่นเข้ามาในตำแหน่งที่ระบุ ซึ่งช่วยให้เราสามารถใช้ส่วนหัวและส่วนท้ายร่วมกันได้
  3. ฟังก์ชัน file_exists(): เป็นฟังก์ชันที่สำคัญมากในด้านความปลอดภัย ใช้สำหรับตรวจสอบว่าไฟล์ที่เราพยายามจะโหลดนั้นมีอยู่จริงบนเซิร์ฟเวอร์หรือไม่ เพื่อป้องกันกรณีที่มีการระบุ URL ที่เป็นอันตราย

การผสมผสานส่วนประกอบเหล่านี้เข้าด้วยกัน จะทำให้เราเตอร์ที่สามารถสลับเนื้อหาตาม URL ได้เสร็จสมบูรณ์

2. ภาคปฏิบัติ! มาสร้างเราเตอร์อย่างง่ายด้วย 3 ไฟล์กันเถอะ

ต่อไป เรามาสร้างเราเตอร์อย่างง่ายกันจริงๆ เลยครับ ครั้งนี้เราจะเตรียมไฟล์ 3 ไฟล์ต่อไปนี้ และบันทึกทั้งหมดไว้ในโฟลเดอร์เดียวกัน

ไฟล์ที่ 1: index.php (เราเตอร์และเลย์เอาต์)

ไฟล์นี้คือ "ประตูหน้า" ของเว็บไซต์ของเรา ประกอบด้วยส่วนที่ใช้ร่วมกัน เช่น เมนูนำทาง และพื้นที่แสดงเนื้อหาที่เปลี่ยนไปตาม URL นี่จะเป็น "ตัวอย่าง HTML ที่ทำงานได้ครบวงจร" ของเราครับ

<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <title>เว็บไซต์เราเตอร์อย่างง่าย</title>
    <style>
        body { font-family: sans-serif; line-height: 1.8; }
        .container { max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; }
        nav { background: #f0f0f0; padding: 10px; margin-bottom: 20px; }
        nav a { margin-right: 15px; text-decoration: none; color: #0056b3; }
        nav a:hover { text-decoration: underline; }
        .content { border-top: 2px solid #eee; padding-top: 20px; }
        footer { margin-top: 30px; text-align: center; font-size: 0.9em; color: #777; }
        .not-found { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>เว็บไซต์ตัวอย่างเราเตอร์อย่างง่าย</h1>
        </header>
        <nav>
            <a href="index.php?page=home">หน้าแรก</a>
            <a href="index.php?page=about">เกี่ยวกับเว็บไซต์นี้</a>
        </nav>

        <div class="content">
            <?php
            // 1. รับชื่อหน้าที่จะแสดงจากพารามิเตอร์ URL
            //    หากไม่มีพารามิเตอร์ ให้ใช้ 'home' เป็นค่าเริ่มต้น
            $page = $_GET['page'] ?? 'home';

            // 2. รายการหน้าที่อนุญาตให้แสดง (Whitelist)
            $allowed_pages = ['home', 'about'];

            // 3. ตรวจสอบว่าชื่อหน้าอยู่ในรายการที่อนุญาตหรือไม่
            if (in_array($page, $allowed_pages)) {
                // 4. สร้างเส้นทางไฟล์ที่สอดคล้องกัน
                $file_path = $page . '.php';

                // 5. ตรวจสอบครั้งสุดท้ายว่าไฟล์มีอยู่จริงหรือไม่ก่อนที่จะโหลด
                if (file_exists($file_path)) {
                    include($file_path);
                } else {
                    echo '<p class="not-found">ข้อผิดพลาด: ไม่พบไฟล์</p>';
                }
            } else {
                // กรณีที่ระบุหน้าที่ไม่ได้รับอนุญาต
                echo '<p class="not-found">404 Not Found: ไม่พบหน้าที่ระบุ</p>';
            }
            ?>
        </div>

        <footer>
            <p>© 2025 Simple Router Inc.</p>
        </footer>
    </div>
</body>
</html>

ไฟล์ที่ 2: home.php (เนื้อหาหน้าแรก)

นี่คือไฟล์ที่มีเพียงเนื้อหาของหน้าแรก (top page) ซึ่งจะถูกโหลดเข้ามาใน `index.php` ครับ

<h2>ยินดีต้อนรับ!</h2>
<p>ที่นี่คือหน้าแรก</p>
<p>เมื่อคุณคลิกที่เมนูด้านบน ค่าของ ?page= ใน URL จะเปลี่ยนไป และเนื้อหาที่แสดงก็จะสลับตามไปด้วย</p>

ไฟล์ที่ 3: about.php (เนื้อหาเกี่ยวกับเว็บไซต์)

เช่นเดียวกัน นี่คือเนื้อหาที่จะถูกโหลดเมื่อมีการระบุ `index.php?page=about`

<h2>เกี่ยวกับเว็บไซต์นี้</h2>
<p>เว็บไซต์นี้เป็นตัวอย่างสำหรับการเรียนรู้กลไกการทำเส้นทางอย่างง่ายใน PHP</p>
<p>index.php ทำหน้าที่เป็นโครงสร้างพื้นฐาน และจะโหลดเนื้อหาของไฟล์ต่างๆ เช่น about.php นี้แบบไดนามิกตามพารามิเตอร์ของ URL</p>

เท่านี้ก็พร้อมแล้วครับ ลองเข้าถึง `index.php` ในเบราว์เซอร์ของคุณดู คุณจะสามารถยืนยันได้ว่าทุกครั้งที่คลิกที่ลิงก์ในเมนูนำทาง จะมีเพียงเนื้อหาส่วนกลางเท่านั้นที่สลับไปมาระหว่าง "หน้าแรก" และ "เกี่ยวกับเว็บไซต์นี้"

3. ข้อควรระวัง: การโจมตีแบบ Directory Traversal

ในการสร้างเราเตอร์อย่างง่ายด้วยตัวเอง สิ่งหนึ่งที่คุณต้องรู้อย่างแน่นอนคือการโจมตีที่เรียกว่า **Directory Traversal** หากคุณเขียนโค้ดดังต่อไปนี้โดยไม่มีมาตรการรักษาความปลอดภัย จะเป็นอันตรายอย่างยิ่ง

<?php
// ตัวอย่างที่ไม่ดี: ห้ามทำตามเด็ดขาด!
$page = $_GET['page'];
include($page . '.php'); // ใช้ข้อมูลที่ผู้ใช้ป้อนเข้ามาโดยไม่มีการตรวจสอบ
?>

ด้วยโค้ดนี้ ผู้โจมตีสามารถระบุสตริงพิเศษใน URL เช่น `?page=../../../../etc/passwd` ซึ่งอาจทำให้พวกเขาสามารถอ่านไฟล์การตั้งค่าที่สำคัญของเซิร์ฟเวอร์ซึ่งไม่ควรเข้าถึงได้

เพื่อป้องกันการโจมตีนี้ ในตัวอย่าง `index.php` ของเราได้ใส่การตรวจสอบไว้ 2 ขั้นตอน

  1. วิธีการใช้ Whitelist: สร้างรายการที่อนุญาตที่ชื่อว่า `$allowed_pages` และตรวจสอบว่าชื่อหน้าที่ระบุนั้นอยู่ในรายการหรือไม่ด้วย `in_array()`
  2. การตรวจสอบการมีอยู่ของไฟล์: แม้ว่าจะผ่านรายการที่อนุญาตแล้ว เพื่อความแน่ใจ ให้ตรวจสอบอีกครั้งว่าไฟล์นั้นมีอยู่จริงหรือไม่ด้วย `file_exists()`

มาตรการนี้ช่วยป้องกันไม่ให้มีการโหลดไฟล์ที่ไม่พึงประสงค์และเพิ่มความปลอดภัยครับ

4. สรุปและขั้นตอนต่อไป

ครั้งนี้ เราได้เรียนรู้กลไกการทำเส้นทางอย่างง่ายที่ใช้พารามิเตอร์ URL และคำสั่ง `include` ของ PHP เพื่อสลับเนื้อหาที่จะแสดง คุณพอจะเข้าใจความรู้สึกที่ว่าเว็บไซต์ทั้งหมดสามารถถูกสร้างขึ้นจากทางเข้าเดียวคือ `index.php` ซึ่งทำหน้าที่จัดการจราจรตาม URL แล้วหรือยังครับ?

จริงๆ แล้ว เฟรมเวิร์ก PHP สมัยใหม่ที่เราใช้กันอยู่เป็นประจำอย่าง Laravel หรือ Symfony ก็คือการนำกลไกการทำเส้นทางนี้มาพัฒนาให้มีความซับซ้อนและปลอดภัยมากยิ่งขึ้นนั่นเอง ความรู้ในครั้งนี้จึงเป็นพื้นฐานสำคัญที่จะช่วยให้คุณเข้าใจว่าทำไมเฟรมเวิร์กเหล่านั้นจึงจำเป็น และเบื้องหลังการทำงานของมันคืออะไร

สำหรับขั้นตอนต่อไป การลองท้าทายตัวเองด้วยการสร้าง "**Pretty URL**" โดยใช้ไฟล์ `.htaccess` เพื่อแปลง URL อย่าง `index.php?page=about` ให้สวยงามขึ้นเป็น `/about` ก็เป็นเรื่องที่น่าสนใจ ซึ่งจะทำให้คุณเข้าใจกลไกของเว็บได้ลึกซึ้งยิ่งขึ้นไปอีกครับ