Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

Superglobals: $_COOKIE

บทความนี้กล่าวถึง `$_COOKIE` ซึ่งเป็น Superglobal array ที่ใช้เก็บข้อมูล Cookie บน Browser ของผู้ใช้ เพื่อจดจำข้อมูล, บันทึกค่า Preference, หรือติดตามพฤติกรรมกา...

Superglobals: $_COOKIE

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ $_SESSION ซึ่งเป็นวิธีเก็บข้อมูลผู้ใช้ไว้บน Server ระหว่าง Session การใช้งาน ในบทนี้ เราจะมาดูอีกหนึ่ง Superglobal ที่ใช้เก็บข้อมูลผู้ใช้ แต่เก็บไว้ที่ Browser ของผู้ใช้แทน นั่นคือ $_COOKIE

ความหมายของ $_COOKIE

$_COOKIE คือ Superglobal array ที่ใช้เก็บข้อมูล Cookie ซึ่งเป็นไฟล์ขนาดเล็กที่ Server ส่งไปเก็บไว้ใน Browser ของผู้ใช้ Cookie มักถูกใช้เพื่อ:

  • จดจำข้อมูลการ Login
  • บันทึกค่า Preference ของผู้ใช้ (เช่น ภาษา, ธีม)
  • ติดตามพฤติกรรมการใช้งานเว็บไซต์ (เพื่อการโฆษณา)
  • เก็บข้อมูล Shopping Cart

ข้อแตกต่างที่สำคัญระหว่าง $_SESSION และ $_COOKIE คือ $_SESSION เก็บข้อมูลไว้บน Server ในขณะที่ $_COOKIE เก็บข้อมูลไว้บน Browser ของผู้ใช้ ทำให้ $_COOKIE มีข้อจำกัดด้านขนาด (โดยทั่วไปไม่เกิน 4KB) และความปลอดภัย (ผู้ใช้สามารถแก้ไขหรือลบ Cookie ได้)

การสร้าง Cookie ด้วย setcookie()

ในการสร้าง Cookie เราจะใช้ฟังก์ชัน setcookie() ฟังก์ชันนี้มีรูปแบบการใช้งานดังนี้:

setcookie(string $name, string $value = "", int $expires = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool

โดยที่:

  • $name: ชื่อของ Cookie (จำเป็น)
  • $value: ค่าของ Cookie (ไม่จำเป็น, default คือ "")
  • $expires: วันหมดอายุของ Cookie (เป็น Unix timestamp, ไม่จำเป็น, default คือ 0 ซึ่งหมายถึงหมดอายุเมื่อปิด Browser)
  • $path: Path ที่ Cookie จะใช้งานได้ (ไม่จำเป็น, default คือ current directory)
  • $domain: Domain ที่ Cookie จะใช้งานได้ (ไม่จำเป็น, default คือ current domain)
  • $secure: กำหนดให้ Cookie ส่งผ่าน HTTPS เท่านั้น (ไม่จำเป็น, default คือ false)
  • $httponly: กำหนดให้ Cookie เข้าถึงได้เฉพาะผ่าน HTTP protocol เท่านั้น (ไม่จำเป็น, default คือ false)

ตัวอย่าง: สร้าง Cookie ชื่อ "username" ที่มีค่า "john.doe" และหมดอายุใน 1 ชั่วโมง:

<?php
$cookie_name = "username";
$cookie_value = "john.doe";
$expiration_time = time() + (60 * 60); // 1 ชั่วโมง

setcookie($cookie_name, $cookie_value, $expiration_time, "/"); // "/" หมายถึง Cookie ใช้งานได้ในทุก path ของ domain
?>

ข้อควรจำ: setcookie() ต้องถูกเรียกก่อนที่จะมีการส่ง output ใดๆ ไปยัง Browser (เช่น ก่อน `<html>` tag) มิฉะนั้นจะเกิด error

กรณีใช้งานจริง: จดจำชื่อผู้ใช้สำหรับการ Login:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST["username"];
    $remember_me = isset($_POST["remember_me"]);

    if ($remember_me) {
        setcookie("remembered_username", $username, time() + (30 * 24 * 60 * 60), "/"); // หมดอายุใน 30 วัน
    } else {
        // ลบ Cookie ถ้าไม่ได้เลือก "Remember Me"
        setcookie("remembered_username", "", time() - 3600, "/");
    }

    // ... ดำเนินการ Login ...
}
?>

<form method="post" action="login.php">
    Username: <input type="text" name="username" value="<?php echo isset($_COOKIE["remembered_username"]) ? $_COOKIE["remembered_username"] : ''; ?>"><br>
    Password: <input type="password" name="password"><br>
    <input type="checkbox" name="remember_me"> Remember Me<br>
    <input type="submit" value="Login">
</form>

ในตัวอย่างนี้ ถ้าผู้ใช้เลือก "Remember Me" Cookie ชื่อ "remembered_username" จะถูกสร้างขึ้นเพื่อเก็บชื่อผู้ใช้ เมื่อผู้ใช้กลับมาที่หน้า Login ในครั้งต่อไป ช่อง Username จะถูกเติมด้วยค่าจาก Cookie โดยอัตโนมัติ ถ้าไม่ได้เลือก "Remember Me" Cookie จะถูกลบ

การเข้าถึงค่าใน $_COOKIE

หลังจากที่ Cookie ถูกสร้างขึ้นแล้ว เราสามารถเข้าถึงค่าของ Cookie ได้ผ่าน Superglobal array $_COOKIE

ตัวอย่าง: อ่านค่าของ Cookie ชื่อ "username":

<?php
if (isset($_COOKIE["username"])) {
    $username = $_COOKIE["username"];
    echo "Welcome, " . htmlspecialchars($username) . "!"; // สำคัญ: ใช้ htmlspecialchars เพื่อป้องกัน XSS
} else {
    echo "Welcome, Guest!";
}
?>

ข้อควรระวัง: ก่อนที่จะเข้าถึงค่าของ Cookie ควรตรวจสอบก่อนว่า Cookie นั้นมีอยู่จริงหรือไม่ โดยใช้ฟังก์ชัน isset() เพื่อหลีกเลี่ยง error "Undefined index"

กรณีใช้งานจริง: แสดงธีมที่ผู้ใช้เลือกไว้:

<?php
// กำหนดค่า default
$theme = "light";

// ตรวจสอบว่ามี Cookie theme หรือไม่
if (isset($_COOKIE["theme"])) {
    $theme = htmlspecialchars($_COOKIE["theme"]); // ป้องกัน XSS
}

// กำหนด class ของ body tag ตาม theme ที่ผู้ใช้เลือก
echo '<body class="' . $theme . '">';

// ... เนื้อหาของเว็บไซต์ ...

echo '</body>';
?>

การลบ Cookie: ในการลบ Cookie เราสามารถทำได้โดยการตั้งค่า Cookie ให้หมดอายุในอดีต:

<?php
setcookie("username", "", time() - 3600, "/"); // ตั้งค่าให้หมดอายุก่อนหน้า 1 ชั่วโมง
?>

ข้อผิดพลาดที่พบบ่อย:

  • Headers already sent: เกิดขึ้นเมื่อพยายามเรียก setcookie() หลังจากที่ Browser ได้รับ output ไปแล้ว (เช่น HTML tag) วิธีแก้คือเรียก setcookie() ก่อนที่จะมีการส่ง output ใดๆ
  • Undefined index: เกิดขึ้นเมื่อพยายามเข้าถึง Cookie ที่ไม่มีอยู่จริง วิธีแก้คือใช้ isset() เพื่อตรวจสอบก่อน
  • Security Vulnerabilities: Cookie สามารถถูกแก้ไขหรือขโมยได้ ดังนั้นไม่ควรเก็บข้อมูล sensitive ไว้ใน Cookie และควรใช้ htmlspecialchars() เพื่อป้องกัน XSS เมื่อแสดงค่า Cookie

สรุป

$_COOKIE เป็น Superglobal array ที่ใช้เก็บข้อมูล Cookie ซึ่งเป็นไฟล์ขนาดเล็กที่ Server ส่งไปเก็บไว้ใน Browser ของผู้ใช้ Cookie มักถูกใช้เพื่อจดจำข้อมูลการ Login, บันทึกค่า Preference ของผู้ใช้, และติดตามพฤติกรรมการใช้งานเว็บไซต์ ในการสร้าง Cookie เราจะใช้ฟังก์ชัน setcookie() และในการเข้าถึงค่าของ Cookie เราจะใช้ $_COOKIE สิ่งสำคัญคือต้องระมัดระวังเรื่องความปลอดภัยและข้อจำกัดของ Cookie เนื่องจากข้อมูลถูกเก็บไว้ที่ Client-Side

ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการจัดการไฟล์ใน PHP ซึ่งจะช่วยให้เราสามารถอ่านและเขียนข้อมูลลงในไฟล์บน Server ได้

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service