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 ได้