[PHP สำหรับผู้เริ่มต้น] เวทมนตร์แห่งการจำสถานะ! วิธีสร้างการยืนยันตัวตนด้วยเซสชัน
เวลาที่เราท่องเว็บไซต์ เรามักจะเห็นฟังก์ชัน "ล็อกอิน" เป็นเรื่องปกติใช่ไหมครับ? เมื่อล็อกอินแล้ว แม้จะย้ายไปหน้าอื่น "สถานะการล็อกอิน" ของเราก็จะยังคงอยู่ ทำให้เราสามารถเข้าดูเนื้อหาสำหรับสมาชิกได้ แต่โดยปกติแล้ว การสื่อสารบนเว็บ (HTTP) มีคุณสมบัติ "ไม่จดจำสถานะ" (stateless) ซึ่งหมายความว่าแต่ละคำขอหน้าเว็บนั้นเป็นอิสระต่อกัน แล้วเว็บไซต์รักษาสถานะการล็อกอินไว้ได้อย่างไร?
ความลับนั้นอยู่ที่เทคโนโลยีของ PHP ที่เรียกว่า เซสชัน (Session) ครับ เซสชันเป็นกลไกที่ช่วยให้เซิร์ฟเวอร์สามารถจดจำ "รหัสผ่านลับ" ของผู้เยี่ยมชมแต่ละคนได้ว่า "คุณล็อกอินแล้ว" ในบทความนี้ เราจะใช้ฟังก์ชันเซสชันนี้เพื่ออธิบายวิธีการสร้าง "หน้าสำหรับสมาชิกเท่านั้น" ที่มีการยืนยันตัวตนด้วยรหัสผ่านอย่างง่ายๆ เพียงแค่สร้างไฟล์ 2 ไฟล์ คุณก็จะได้สัมผัสกับหัวใจหลักของฟังก์ชันล็อกอินที่จำเป็นสำหรับเว็บไซต์ ลองคัดลอกโค้ดไปรันดู แล้วคุณจะรู้สึกถึงเวทมนตร์แห่งการจำสถานะได้เลยครับ!
สำหรับการเตรียมตัวเพื่อรัน PHP (สภาพแวดล้อมการพัฒนา) หากคุณยังไม่ได้ติดตั้ง XAMPP โปรดอ้างอิงจาก [PHP สำหรับผู้เริ่มต้น] คู่มือฉบับสมบูรณ์เกี่ยวกับการดาวน์โหลดและติดตั้ง XAMPP! หลังจากติดตั้งแล้ว เพียงแค่วางไฟล์ PHP ของคุณในโฟลเดอร์ที่กำหนด (เช่น `htdocs`) ก็พร้อมใช้งานแล้วครับ!
1. กลไกของเซสชัน: เทคนิคการจำของ PHP
เซสชันคือกลไกสำหรับบันทึกข้อมูลของผู้ใช้ที่เข้ามาเยี่ยมชมเว็บไซต์ไว้บนฝั่งเซิร์ฟเวอร์ชั่วคราว เปรียบได้กับการได้รับสายรัดข้อมือที่จุดลงทะเบียนของงานอีเวนต์ เมื่อได้รับสายรัดข้อมือแล้ว (เริ่มเซสชัน) ไม่ว่าคุณจะไปที่โซนไหน (หน้าไหน) ของงาน เจ้าหน้าที่ (เซิร์ฟเวอร์) ก็จะรับรู้ได้ว่าคุณคือผู้เข้าร่วมงานที่ถูกต้อง (ผู้ใช้ที่ล็อกอินแล้ว)
การจัดการเซสชันใน PHP นั้นง่ายมาก เพียงแค่จำคำสั่งหลักๆ 3 คำสั่งนี้ก็พอครับ
session_start(): เป็นสัญญาณเริ่มต้นว่า "ฉันจะเริ่มใช้เซสชันแล้วนะ!" ซึ่งต้องเขียนไว้ที่ส่วนบนสุดของทุกหน้าที่ใช้เซสชัน$_SESSION: เป็นอาร์เรย์พิเศษสำหรับเก็บข้อมูลต่างๆ เช่น สถานะการล็อกอิน คุณสามารถบันทึกและตรวจสอบข้อมูลได้อย่างอิสระด้วยรูปแบบ$_SESSION['คีย์'] = ค่า;session_destroy(): ใช้สำหรับลบข้อมูลเซสชันที่บันทึกไว้บนเซิร์ฟเวอร์ทั้งหมด มักใช้ตอนล็อกเอาต์
เราจะใช้ 3 คำสั่งนี้ในการสร้างระบบล็อกอินกันครับ
2. ภาคปฏิบัติ! มาสร้างระบบล็อกอินกันเถอะ
ครั้งนี้ เราจะสร้างไฟล์ 2 ไฟล์ต่อไปนี้ครับ
- login.php: ไฟล์สำหรับแสดงฟอร์มล็อกอินและทำการยืนยันตัวตนด้วยรหัสผ่าน
- member_page.php: หน้าสำหรับสมาชิกเท่านั้นที่เฉพาะคนที่ล็อกอินแล้วถึงจะดูได้
ให้บันทึกไฟล์ทั้งสองนี้ไว้ในโฟลเดอร์เดียวกันนะครับ
ไฟล์ที่ 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`, และการที่ข้อมูลนั้นยังคงอยู่แม้จะย้ายไปหน้าอื่นแล้วหรือยังครับ?
กลไกของเซสชันนี้เป็นเทคโนโลยีพื้นฐานของเว็บแอปพลิเคชัน ซึ่งไม่ได้ใช้แค่ในการยืนยันตัวตนเพื่อล็อกอินเท่านั้น แต่ยังประยุกต์ใช้ได้ในหลากหลายสถานการณ์ เช่น ฟอร์มกรอกข้อมูลหลายหน้า หรือการจดจำสินค้าในตะกร้าสินค้า ขอให้คุณฝึกฝนพื้นฐานนี้ให้เชี่ยวชาญ แล้วท้าทายตัวเองด้วยการพัฒนาฟังก์ชันที่ซับซ้อนยิ่งขึ้นต่อไปนะครับ!