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

[PHP สำหรับผู้เริ่มต้น] เวทมนตร์แห่งการจำสถานะ! วิธีสร้างการยืนยันตัวตนด้วยเซสชัน

เวลาที่เราท่องเว็บไซต์ เรามักจะเห็นฟังก์ชัน "ล็อกอิน" เป็นเรื่องปกติใช่ไหมครับ? เมื่อล็อกอินแล้ว แม้จะย้ายไปหน้าอื่น "สถานะการล็อกอิน" ของเราก็จะยังคงอยู่ ทำให้เราสามารถเข้าดูเนื้อหาสำหรับสมาชิกได้ แต่โดยปกติแล้ว การสื่อสารบนเว็บ (HTTP) มีคุณสมบัติ "ไม่จดจำสถานะ" (stateless) ซึ่งหมายความว่าแต่ละคำขอหน้าเว็บนั้นเป็นอิสระต่อกัน แล้วเว็บไซต์รักษาสถานะการล็อกอินไว้ได้อย่างไร?

ความลับนั้นอยู่ที่เทคโนโลยีของ PHP ที่เรียกว่า เซสชัน (Session) ครับ เซสชันเป็นกลไกที่ช่วยให้เซิร์ฟเวอร์สามารถจดจำ "รหัสผ่านลับ" ของผู้เยี่ยมชมแต่ละคนได้ว่า "คุณล็อกอินแล้ว" ในบทความนี้ เราจะใช้ฟังก์ชันเซสชันนี้เพื่ออธิบายวิธีการสร้าง "หน้าสำหรับสมาชิกเท่านั้น" ที่มีการยืนยันตัวตนด้วยรหัสผ่านอย่างง่ายๆ เพียงแค่สร้างไฟล์ 2 ไฟล์ คุณก็จะได้สัมผัสกับหัวใจหลักของฟังก์ชันล็อกอินที่จำเป็นสำหรับเว็บไซต์ ลองคัดลอกโค้ดไปรันดู แล้วคุณจะรู้สึกถึงเวทมนตร์แห่งการจำสถานะได้เลยครับ!

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

1. กลไกของเซสชัน: เทคนิคการจำของ PHP

เซสชันคือกลไกสำหรับบันทึกข้อมูลของผู้ใช้ที่เข้ามาเยี่ยมชมเว็บไซต์ไว้บนฝั่งเซิร์ฟเวอร์ชั่วคราว เปรียบได้กับการได้รับสายรัดข้อมือที่จุดลงทะเบียนของงานอีเวนต์ เมื่อได้รับสายรัดข้อมือแล้ว (เริ่มเซสชัน) ไม่ว่าคุณจะไปที่โซนไหน (หน้าไหน) ของงาน เจ้าหน้าที่ (เซิร์ฟเวอร์) ก็จะรับรู้ได้ว่าคุณคือผู้เข้าร่วมงานที่ถูกต้อง (ผู้ใช้ที่ล็อกอินแล้ว)

การจัดการเซสชันใน PHP นั้นง่ายมาก เพียงแค่จำคำสั่งหลักๆ 3 คำสั่งนี้ก็พอครับ

  1. session_start(): เป็นสัญญาณเริ่มต้นว่า "ฉันจะเริ่มใช้เซสชันแล้วนะ!" ซึ่งต้องเขียนไว้ที่ส่วนบนสุดของทุกหน้าที่ใช้เซสชัน
  2. $_SESSION: เป็นอาร์เรย์พิเศษสำหรับเก็บข้อมูลต่างๆ เช่น สถานะการล็อกอิน คุณสามารถบันทึกและตรวจสอบข้อมูลได้อย่างอิสระด้วยรูปแบบ $_SESSION['คีย์'] = ค่า;
  3. session_destroy(): ใช้สำหรับลบข้อมูลเซสชันที่บันทึกไว้บนเซิร์ฟเวอร์ทั้งหมด มักใช้ตอนล็อกเอาต์

เราจะใช้ 3 คำสั่งนี้ในการสร้างระบบล็อกอินกันครับ

2. ภาคปฏิบัติ! มาสร้างระบบล็อกอินกันเถอะ

ครั้งนี้ เราจะสร้างไฟล์ 2 ไฟล์ต่อไปนี้ครับ

ให้บันทึกไฟล์ทั้งสองนี้ไว้ในโฟลเดอร์เดียวกันนะครับ

ไฟล์ที่ 1: login.php (หน้าล็อกอิน)

ไฟล์นี้จะรวมทั้งฟอร์มสำหรับกรอกรหัสผ่านและตรรกะสำหรับตรวจสอบว่ารหัสผ่านที่ส่งมานั้นถูกต้องหรือไม่

<?php
// ① เริ่มเซสชัน
session_start();

$error_message = '';
// ② กรณีที่มีการร้องขอแบบ POST (ส่งฟอร์ม)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ③ ตรวจสอบกับรหัสผ่านที่ฮาร์ดโค้ดไว้
    $correct_password = 'password123'; // จริงๆ แล้วควรจัดการในฐานข้อมูล
    $input_password = $_POST['password'];

    if ($input_password === $correct_password) {
        // ④ กรณีรหัสผ่านถูกต้อง
        $_SESSION['is_logged_in'] = true; // บันทึกสถานะการล็อกอินลงในเซสชัน
        header('Location: member_page.php'); // เปลี่ยนเส้นทางไปยังหน้าสมาชิก
        exit;
    } else {
        // กรณีรหัสผ่านไม่ถูกต้อง
        $error_message = 'รหัสผ่านไม่ถูกต้อง';
    }
}
?>
<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <title>ล็อกอิน</title>
    <style>
        body { font-family: sans-serif; padding: 20px; text-align: center; }
        .login-form { max-width: 300px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; }
        input[type="password"] { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; }
        button { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        .error { color: red; margin-bottom: 10px; }
    </style>
</head>
<body>
    <div class="login-form">
        <h1>ล็อกอิน</h1>
        <?php if ($error_message): ?>
            <p class="error"><?php echo $error_message; ?></p>
        <?php endif; ?>
        <form action="login.php" method="POST">
            <input type="password" name="password" placeholder="รหัสผ่าน" required>
            <button type="submit">ล็อกอิน</button>
        </form>
    </div>
</body>
</html>

ไฟล์ที่ 2: member_page.php (หน้าสำหรับสมาชิกเท่านั้น)

หน้านี้จะตรวจสอบว่ามีหลักฐานการ "ล็อกอินแล้ว" (ข้อมูลเซสชัน) อยู่หรือไม่เมื่อมีการเข้าถึง หากไม่มีหลักฐาน ก็จะถูกส่งกลับไปยังหน้าล็อกอินโดยไม่มีข้อแม้

<?php
// ① เริ่มเซสชัน
session_start();

// ② ตรวจสอบสถานะการล็อกอิน
//    หากไม่มี $_SESSION['is_logged_in'] หรือมีค่าเป็น false ให้เปลี่ยนเส้นทางไปยังหน้าล็อกอิน
if (!isset($_SESSION['is_logged_in']) || $_SESSION['is_logged_in'] !== true) {
    header('Location: login.php');
    exit;
}
?>
<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <title>หน้าสำหรับสมาชิก</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        .content { border: 2px dashed #007bff; padding: 20px; background: #f0f8ff; }
        a { color: #d9534f; }
    </style>
</head>
<body>
    <h1>ยินดีต้อนรับ, สมาชิก!</h1>
    <div class="content">
        <p>ที่นี่คือเนื้อหาพิเศษที่เฉพาะผู้ที่ล็อกอินแล้วเท่านั้นที่สามารถดูได้</p>
        <p>(ข้อมูลสำหรับสมาชิกเท่านั้นจะแสดงที่นี่)</p>
    </div>
    <p><a href="logout.php">ออกจากระบบ</a></p>
</body>
</html>

เท่านี้ก็พร้อมแล้วครับ! ลองเข้า `login.php` ผ่านเบราว์เซอร์ แล้วกรอกรหัสผ่านเป็น "`password123`" ดูนะครับ ถ้าถูกต้อง คุณจะถูกพาไปยังหน้าสมาชิก แต่ถ้าผิด ก็จะแสดงข้อความผิดพลาดขึ้นมา นอกจากนี้ คุณยังสามารถทดลองเข้า `member_page.php` โดยตรงโดยไม่ล็อกอิน แล้วจะพบว่าคุณจะถูกส่งกลับมาที่หน้า `login.php` ทันที

3. ข้อควรระวังและตัวอย่างการประยุกต์ใช้

กลไกง่ายๆ นี้มีประสิทธิภาพมาก แต่ในการใช้งานจริง เราจำเป็นต้องเพิ่มความปลอดภัยให้มากขึ้น

การเก็บรหัสผ่านอย่างปลอดภัย

ในตัวอย่างนี้ เราเขียนรหัสผ่านเป็น `'password123'` ลงในโค้ดโดยตรง (hard-coding) ซึ่งอันตรายมาก ในการพัฒนาจริง รหัสผ่านจะต้องถูกนำไปผ่านกระบวนการที่เรียกว่า **การแฮช (hashing)** เพื่อจัดเก็บในรูปแบบที่ไม่สามารถถอดรหัสกลับเป็นรหัสผ่านเดิมได้ แล้วจึงบันทึกลงในฐานข้อมูล

PHP มีฟังก์ชัน `password_hash()` และ `password_verify()` เตรียมไว้ให้สำหรับเรื่องนี้โดยเฉพาะ

<?php
// ทำการแฮชรหัสผ่านเพื่อบันทึก (เช่น ตอนลงทะเบียนผู้ใช้)
$hashed_password = password_hash('password123', PASSWORD_DEFAULT);

// ตรวจสอบว่ารหัสผ่านที่กรอกตอนล็อกอินตรงกับแฮชที่บันทึกไว้หรือไม่
if (password_verify('password123', $hashed_password)) {
    echo 'รหัสผ่านถูกต้อง!';
} else {
    echo 'รหัสผ่านไม่ถูกต้อง';
}
?>

การประมวลผลการออกจากระบบ

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

<?php
session_start();

// ล้างค่าตัวแปรเซสชันทั้งหมด
$_SESSION = array();

// ทำลายเซสชัน
session_destroy();

// หลังจากออกจากระบบแล้ว ให้เปลี่ยนเส้นทางกลับไปยังหน้าล็อกอิน
header('Location: login.php');
exit;
?>

การใช้ `session_destroy()` เพื่อทำลายเซสชันโดยสมบูรณ์ จะทำให้การออกจากระบบเสร็จสิ้น

4. สรุป

ครั้งนี้ เราได้เรียนรู้วิธีใช้ฟังก์ชันเซสชันของ PHP เพื่อทำให้เว็บไซต์ "จดจำสถานะ" และสร้างระบบล็อกอินอย่างง่ายๆ คุณพอจะเข้าใจขั้นตอนการทำงาน ตั้งแต่การเริ่มเซสชันด้วย `session_start()`, การเก็บข้อมูลในอาร์เรย์ `$_SESSION`, และการที่ข้อมูลนั้นยังคงอยู่แม้จะย้ายไปหน้าอื่นแล้วหรือยังครับ?

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