Cookies และ Sessions ใน PHP: การจัดการ State อย่างมืออาชีพ
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการจัดการข้อมูลที่ส่งมาจากฟอร์ม HTML ด้วย PHP คราวนี้ เราจะมาทำความเข้าใจกับ Cookies และ Sessions ซึ่งเป็นเครื่องมือสำคัญในการจัดการ State หรือสถานะของผู้ใช้งานบนเว็บไซต์ของเรา ลองนึกภาพว่าคุณกำลังสร้างร้านค้าออนไลน์ คุณต้องการให้ตะกร้าสินค้าของผู้ใช้ยังคงอยู่แม้ว่าเขาจะออกจากหน้าเว็บไปแล้ว Cookies และ Sessions นี่แหละที่จะช่วยให้เราทำสิ่งนั้นได้
Cookies คืออะไร?
Cookies คือไฟล์ข้อความขนาดเล็กที่เว็บไซต์เก็บไว้ในเครื่องคอมพิวเตอร์ของผู้ใช้ (Browser) เพื่อจดจำข้อมูลบางอย่าง เช่น ชื่อผู้ใช้, รหัสผ่าน (ไม่แนะนำ), การตั้งค่าภาษา, หรือรายการสินค้าในตะกร้า ข้อมูลเหล่านี้จะถูกส่งกลับไปยังเซิร์ฟเวอร์ทุกครั้งที่ผู้ใช้เข้าชมเว็บไซต์นั้น ทำให้เว็บไซต์สามารถ "จำ" ผู้ใช้ได้
ข้อดีของ Cookies:
- เก็บข้อมูลฝั่ง Client: ข้อมูลถูกเก็บไว้ในเครื่องของผู้ใช้ ทำให้เซิร์ฟเวอร์ไม่ต้องเก็บข้อมูลทั้งหมด
- ช่วยให้เว็บไซต์จดจำผู้ใช้ได้: ทำให้ผู้ใช้ไม่ต้อง Login ใหม่ทุกครั้ง
ข้อเสียของ Cookies:
- ขนาดจำกัด: Cookies มีขนาดจำกัด (โดยทั่วไปไม่เกิน 4KB ต่อ Cookie)
- ความปลอดภัย: Cookies สามารถถูกขโมยหรือแก้ไขได้ หากไม่มีการป้องกันที่เหมาะสม
- ความเป็นส่วนตัว: ผู้ใช้บางคนอาจไม่ต้องการให้เว็บไซต์เก็บข้อมูลส่วนตัว
การใช้งาน Cookies ใน PHP
PHP มีฟังก์ชัน `setcookie()` สำหรับสร้าง Cookie และ `$_COOKIE` สำหรับเข้าถึงข้อมูลใน Cookie
<?php
// สร้าง Cookie ชื่อ "username" ที่มีค่า "JohnDoe" และมีอายุ 30 วัน
setcookie("username", "JohnDoe", time() + (86400 * 30), "/"); // 86400 = 1 วัน
// ตรวจสอบว่า Cookie "username" ถูกตั้งค่าแล้วหรือไม่
if(isset($_COOKIE["username"])) {
echo "ยินดีต้อนรับ, " . $_COOKIE["username"] . "!";
} else {
echo "Cookie 'username' ยังไม่ได้ถูกตั้งค่า";
}
?>
คำอธิบาย:
- `setcookie("username", "JohnDoe", time() + (86400 * 30), "/");`
- `username`: ชื่อของ Cookie
- `JohnDoe`: ค่าของ Cookie
- `time() + (86400 * 30)`: วันหมดอายุของ Cookie (30 วันนับจากปัจจุบัน)
- `/`: Path ที่ Cookie สามารถใช้งานได้ (`/` หมายถึงทุกหน้าในเว็บไซต์)
- `$_COOKIE["username"]`: เข้าถึงค่าของ Cookie ที่ชื่อ "username"
ข้อควรระวัง: ต้องเรียกใช้ `setcookie()` ก่อนที่จะมี output ใดๆ ไปยัง Browser (เช่น `echo`, `print`) มิฉะนั้น Cookie จะไม่ถูกตั้งค่า
การลบ Cookie:
<?php
// ลบ Cookie โดยการตั้งวันหมดอายุให้เป็นอดีต
setcookie("username", "", time() - 3600, "/");
?>
กรณีใช้งานจริง: จดจำธีมสีที่ผู้ใช้เลือกไว้
<?php
// ตรวจสอบว่ามีการส่งค่าธีมสีมาหรือไม่
if (isset($_POST['theme'])) {
$theme = $_POST['theme'];
setcookie("theme", $theme, time() + (86400 * 30), "/");
header("Location: " . $_SERVER['PHP_SELF']); // Refresh หน้า
exit();
}
// กำหนดธีมสีเริ่มต้น
$theme = isset($_COOKIE['theme']) ? $_COOKIE['theme'] : 'light';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cookie Example</title>
<style>
body {
background-color: <?= $theme == 'dark' ? '#333' : '#fff' ?>;
color: <?= $theme == 'dark' ? '#fff' : '#000' ?>;
}
</style>
</head>
<body>
<h1>Cookie Example</h1>
<p>Current Theme: <?= ucfirst($theme) ?></p>
<form method="post">
<label for="theme">Choose Theme:</label>
<select name="theme" id="theme">
<option value="light" <?= $theme == 'light' ? 'selected' : '' ?>>Light</option>
<option value="dark" <?= $theme == 'dark' ? 'selected' : '' ?>>Dark</option>
</select>
<button type="submit">Set Theme</button>
</form>
</body>
</html>
Sessions คืออะไร?
Sessions คือวิธีการเก็บข้อมูลของผู้ใช้ไว้บนเซิร์ฟเวอร์ โดยแต่ละ Session จะมี ID ที่ไม่ซ้ำกัน (Session ID) ซึ่งจะถูกเก็บไว้ใน Cookie บนเครื่องของผู้ใช้ เมื่อผู้ใช้เข้าชมเว็บไซต์อีกครั้ง Browser จะส่ง Session ID กลับมายังเซิร์ฟเวอร์ ทำให้เซิร์ฟเวอร์สามารถดึงข้อมูลของผู้ใช้จาก Session ได้
ข้อดีของ Sessions:
- ความปลอดภัย: ข้อมูลถูกเก็บไว้บนเซิร์ฟเวอร์ ทำให้ปลอดภัยกว่าการเก็บไว้ใน Cookies
- ความยืดหยุ่น: สามารถเก็บข้อมูลได้มากกว่า Cookies
ข้อเสียของ Sessions:
- ใช้ทรัพยากรเซิร์ฟเวอร์: Sessions ต้องใช้พื้นที่เก็บข้อมูลและหน่วยประมวลผลบนเซิร์ฟเวอร์
- ต้องมีการจัดการ Session ID: ต้องมั่นใจว่า Session ID ถูกสร้างขึ้นอย่างปลอดภัยและไม่สามารถถูกคาดเดาได้
การใช้งาน Sessions ใน PHP
PHP มีฟังก์ชัน `session_start()` สำหรับเริ่มต้น Session, `$_SESSION` สำหรับเข้าถึงข้อมูลใน Session, และ `session_destroy()` สำหรับทำลาย Session
<?php
// เริ่มต้น Session
session_start();
// กำหนดค่าใน Session
$_SESSION["username"] = "JaneDoe";
$_SESSION["favorite_color"] = "blue";
echo "Session variables are set.";
// เข้าถึงค่าใน Session
echo "Username is " . $_SESSION["username"] . ".<br>";
echo "Favorite color is " . $_SESSION["favorite_color"] . ".";
// ทำลาย Session
// session_destroy();
?>
คำอธิบาย:
- `session_start()`: เริ่มต้น Session หรือดึง Session ที่มีอยู่เดิม
- `$_SESSION["username"] = "JaneDoe";`: กำหนดค่า "JaneDoe" ให้กับตัวแปร "username" ใน Session
- `$_SESSION["username"]`: เข้าถึงค่าของตัวแปร "username" ใน Session
- `session_destroy()`: ทำลาย Session และลบข้อมูลทั้งหมดใน Session
ข้อควรระวัง: เช่นเดียวกับ `setcookie()` ต้องเรียกใช้ `session_start()` ก่อนที่จะมี output ใดๆ ไปยัง Browser
กรณีใช้งานจริง: ระบบ Login
<?php
session_start();
// ตรวจสอบว่ามีการส่งข้อมูล Login มาหรือไม่
if (isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// ตรวจสอบ Username และ Password (ตัวอย่าง)
if ($username == 'admin' && $password == 'password') {
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
header("Location: dashboard.php"); // Redirect ไปยังหน้า Dashboard
exit();
} else {
$error = "Invalid username or password.";
}
}
// ตรวจสอบว่า Login แล้วหรือไม่
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
header("Location: dashboard.php"); // Redirect ไปยังหน้า Dashboard
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Page</title>
</head>
<body>
<h1>Login</h1>
<?php if (isset($error)): ?>
<p style="color: red;"><?= $error ?></p>
<?php endif; ?>
<form method="post">
<label for="username">Username:</label>
<input type="text" name="username" id="username" required><br><br>
<label for="password">Password:</label>
<input type="password" name="password" id="password" required><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
ข้อผิดพลาดที่พบบ่อย:
- "Headers already sent" error: เกิดจากการเรียกใช้ `setcookie()` หรือ `session_start()` หลังจากที่มี output ใดๆ ไปยัง Browser
- Cookie ไม่ถูกตั้งค่า: ตรวจสอบว่า Browser อนุญาตให้เว็บไซต์ตั้งค่า Cookie หรือไม่
- Session หายไป: ตรวจสอบว่า `session_start()` ถูกเรียกใช้ในทุกหน้าที่ต้องการเข้าถึง Session
สรุป
Cookies และ Sessions เป็นเครื่องมือที่สำคัญสำหรับการจัดการ State บนเว็บไซต์ Cookies เหมาะสำหรับการเก็บข้อมูลขนาดเล็กที่ต้องการให้ Browser จดจำ ส่วน Sessions เหมาะสำหรับการเก็บข้อมูลที่สำคัญและต้องการความปลอดภัยสูง การเลือกใช้เครื่องมือที่เหมาะสมจะช่วยให้คุณสร้างเว็บไซต์ที่มีประสิทธิภาพและใช้งานง่ายมากยิ่งขึ้น ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการเชื่อมต่อ PHP กับฐานข้อมูล เพื่อให้เราสามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพมากยิ่งขึ้น