メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

Cookies และ Sessions ใน PHP

บทความนี้กล่าวถึง Cookies และ Sessions ซึ่งเป็นเครื่องมือสำคัญใน PHP สำหรับการจัดการ State หรือสถานะของผู้ใช้งานบนเว็บไซต์ โดย Cookies เก็บข้อมูลขนาดเล็กไว้ที่...

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 กับฐานข้อมูล เพื่อให้เราสามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพมากยิ่งขึ้น

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る