บทที่ 16
เรื่องของ Session และ Cookie
เรื่องของ session
Session เป็นคุณสมบัติของ PHP ตั้งแต่เวอร์ชั่น 4.0 ขึ้นไปที่ช่วยในการติดตามและตรวจสอบสถานะต่างๆ ของผู้ใช้ โดยเราจะต้องสร้างตัวแปร session เพื่อเก็บค่าต่าง ๆ ที่ต้องการไว้ ซึ่งความคงอยู่ของตัวแปร session นี้จะขึ้นกับวินโดว์ของเว็บบราวเซอร์ ไม่ขึ้นกับไฟล์ PHP ที่สร้างตัวแปรนั้น กล่าวคือ หลังจากตัวแปร session ถูกสร้างขึ้นมาโดยไฟล์ PHP ไฟล์หนึ่งแล้ว เราจะสามารถอ้างอิงถึงตัวแปรนั้นได้จากไฟล์ PHP อื่นๆ ด้วย ตราบใดที่ผู้ใช้ยังคงเข้าถึงไฟล์ PHP ในเว็บไซท์ของเราโดยใช้วินโดว์เดิมอยู่
ฟังก์ชั่นเกี่ยวกับ session
¨ ฟังก์ชั่น session_start()
session_start() เป็นฟังก์ชั่นที่สั่งให้เริ่มต้นใช้งาน (initialize) session
รูปแบบ: session_start() |
¨ ฟังก์ชั่น session_register()
session_register() เป็นฟังก์ชั่นที่ใช้ลงทะเบียนตัวแปรไว้ใน session ปัจจุบัน (ทำให้ตัวแปรนั้นกลายเป็นตัวแปร session) โดยสามารถลงทะเบียนได้มากกว่า 1 ตัวแปรพร้อมกัน การลงทะเบียนตัวแปรใดๆ ให้กลายเป็นตัวแปร session นั้น ก็เพื่อกำหนดให้ PHP เก็บรักษาค่าของตัวแปรนั้นไว้ ภายหลังจากที่ไฟล์ PHP นั้นสิ้นสุดการทำงานในเพจใดเพจหนึ่งไปแล้ว
ขณะที่เรียกฟังก์ชั่น session_register() นี้ ถ้าหาก session ยังไม่เริ่มต้น (เราไม่ได้เรียกฟังก์ชั่น session_start() ก่อน) PHP ก็จะเริ่มต้น session ให้เองโดยปริยาย
Note: ชื่อตัวแปรที่ระบุให้กับฟังก์ชั่น session_register() นั้นไม่ต้องมี $ นำหน้า และจะต้องป้อนชื่อตัวแปร session ไว้ภายในเครื่องหมาย single quote หรือ double quote |
สำหรับตัวอย่างต่อไปนี้เราจะใช้ไฟล์ session_register1.php สร้างตัวแปรชื่อ $myname ขึ้นมา ก่อนที่จะลงทะเบียนให้เป็นตัวแปร session จากนั้นในไฟล์ session_register2.php เราจะสั่งให้แสดงค่าของตัวแปร $myname ออกมา (การทดสอบตัวอย่างนี้ขอให้สร้างไฟล์ทั้งสองขึ้นมาก่อน เพราะจะต้องใช้ควบคู่กัน)
session_register1.php |
<?php session_start(); //เรียกฟังก์ชั่น session_start() เพื่อเริ่มใช้งาน session $myname = "สุรชัย"; session_register("myname"); ?>
นี่คือไฟล์ session_register1.php <br><br> <a href="session_register2.php">คลิกตรงนี้เพื่อเปิดไฟล์ session_register2.php</a> |
session_register2.php |
<?php session_start(); //เรียกฟังก์ชั่น session_start() เพื่อเริ่มใช้งาน session ?>
นี่คือไฟล์ session_register2.php<br><br> <?php echo "ค่าของตัวแปร SESSION ของ myname คือ " . $_SESSION['myname']; ?> |
¨ ฟังก์ชั่น session_unregister()
session_unregister() เป็นฟังก์ชั่นที่ใช้ยกเลิกการลงทะเบียนตัวแปร session หรือกล่าวอีกนัยหนึ่งคือ บอกให้ PHP ลืมตัวแปรนั้นไปเสีย
รูปแบบ: session_unregister(ชื่อตัวแปร) |
¨ ฟังก์ชั่น session_destroy()
session_destroy() เป็นฟังก์ชั่นที่ใช้ทำลายข้อมูลทั้งหมดของ session ปัจจุบัน
รูปแบบ: session_destroy() |
ตัวอย่างการใช้งานตัวแปร Session
ตัวอย่างต่อไปนี้จะคล้ายคลึงกับตัวอย่างก่อนหน้านี้ แต่เราจะไฟล์ทั้งสิ้นจำนวน 3 ไฟล์ คือ
· ไฟล์ session_file1.php เป็นแบบฟอร์มให้กรอกชื่อผู้ใช้ โดยมีช่องรับข้อความชื่อ username เป็นตัวรับค่า
· ไฟล์ session_file2.php ทำหน้าที่ลงทะเบียนตัวแปร $username ไว้ใน session ปัจจุบัน พร้อมทั้งแสดงค่าของตัวแปรออกมา ตัวแปร $username นี้เป็นตัวแปรแบบโกลบอล (global variable) ที่ PHP สร้างขึ้นมาให้ โดย PHP จะนำค่าที่ได้รับจากช่องรับข้อความชื่อ username ในไฟล์ session_file1.php มากำหนดให้กับตัวแปรนี้ (เป็นการทำงานร่วมกันระหว่าง PHP กับแท็ก <form> ของ HTML ไม่เกี่ยวกับ session)
· ไฟล์ session_file3.php จะแสดงค่าของตัวแปร $username ออกมา เพื่อเป็นการยืนยันว่าตัวแปร $username ยังคงมีตัวตนอยู่และเก็บรักษาค่าเดิมไว้ได้
session_file1.php |
<?php session_start(); //เรียกฟังก์ชั่น session_start() เพื่อเริ่มใช้งาน session session_unregister("username"); ?> <form action="session_file2.php"> กรุณาป้อนชื่อผู้ใช้ (username) แล้วคลิกปุ่ม OK<br> <input type="text" name="username"> <input type="submit" value=" OK "> </form> |
session_file2.php |
<?php session_start(); //เรียกฟังก์ชั่น session_start() เพื่อเริ่มใช้งาน session $username = $_POST['username']; session_register("username"); ?> ชื่อผู้ใช้ที่คุณป้อนมาให้คือ <?php echo $_SESSION['username']; ?> <br><a href="session_file3.php">คลิกตรงนี้เพื่อไปยังไฟล์ session_file3.php</a> |
session_file3.php |
<?php session_start(); //เรียกฟังก์ชั่น session_start() เพื่อเริ่มใช้งาน session echo "ชื่อผู้ใช้ของคุณยังคงเป็น " . $_SESSION['username']; ?> <br><a href="session_file1.php">คลิกตรงนี้เพื่อไปยังไฟล์ session_file1.php</a> |
การติดตามและตรวจสอบผู้ใช้ด้วย Cookie
Cookie หมายถึง ข้อมูลที่เราส่งไปเก็บไว้ในเครื่องของผู้ใช้ เพื่อประโยชน์ในการตรวจสอบและติดตามผู้ใช้แต่ละคน โดยหลังจากที่เราส่ง cookie ไปยังเครื่องของผู้ใช้แล้วถ้าหาก cookie ยังไม่หมดอายุ (expire) เมื่อผู้ใช้เรียกดูไฟล์ PHP อื่น ๆ ในไดเร็คทอรีเดียวกับไฟล์ PHP ที่สร้าง cookie ขึ้นมา บราวเซอร์ก็จะส่ง cookie นั้นมายังเซิร์ฟเวอร์ ซึ่ง PHP จะนำ cookie มากำหนดเป็นตัวแปรให้เราสามารถตรวจสอบค่าได้ต่อไป
การติดตามสถานะของผู้ใช้ด้วย session และ cookie มีข้อแตกต่างกันดังนี้
ลักษณะการทำงาน |
Cookie |
Session |
การหมดอายุ |
ขึ้นอยู่กับเวลาที่เรากำหนดไว้ตอนสร้าง หรือเราสั่งให้หมดอายุเอง |
ขึ้นอยู่กับวินโดว์ของบราวเซอร์ที่กำลังใช้งาน ถ้าวินโดวส์ถูกปิดลงไปก็เป็นอันสิ้นสุด session |
ขอบเขตการใช้งานตัวแปร |
ไฟล์ที่เรียกใช้จะต้องอยู่ในโฟล์ดอร์เดียวกันกับไฟล์ที่สร้างตัวแปรนั้นขึ้นมา |
ไม่จำกัด เพราะขึ้นกับวินโดว์ที่ใช้ บราวซ์เข้ามา |
ฟังก์ชั่นที่ใช้ส่ง cookie ไปเก็บไว้ในเครื่องของผู้ใช้ทิ้งไป ให้เรียกฟังก์ชั่น setcookie() โดยระบุชื่อ cookie นั้น แต่ไม่ต้องระบุค่าและเวลาหมดอายุ เช่น ถ้าต้องการลบ cookie ชื่อ TestCookie ก็ให้ใช้บรรทัดคำสั่งต่อไปนี้
|
cookie_create.php |
<?php //กำหนดให้ cookie หมดอายุหลังจากถูกสร้างแล้วเป็นเวลา 60 วินาที (1 นาที) $c_name = "TestCookie"; $c_val = "123"; setcookie($c_name, $c_val, time() + 60); echo "cookie ชื่อ $c_name ที่มีค่า $c_val ได้ถูกส่งไปยังเว็บบราวเซอร์แล้ว"; ?> <br> <a href="cookie_test.php">ตรวจสอบค่าของ cookie</a><br> |
เมื่อเรียกใช้ไฟล์ cookie_create.php และคลิกที่ลิงค์ “ตรวจสอบค่าของ cookie” แล้ว cookie ชื่อ TestCookie ที่เราส่งไปยังบราวเซอร์ก็จะถูกแสดงค่าออกมา
ให้รีเฟรชเว็บเพจเป็นระยะๆ โดยการกดคีย์ F5 หลังจากนั้นประมาณ 1 นาทีก็จะปรากฏข้อความดังรูปขึ้นมาแทน ซึ่งบอกให้รู้ว่าขณะนี้ cookie ชื่อ TestCookie ได้หมดอายุแล้ว
เนื่องจาก cookie ที่เว็บเซิร์ฟเวอร์กับเว็บบราวเซอร์รับส่งกันนั้น เป็นข้อมูลในส่วนเฮดเดอร์ของโปรโตคอล HTTP ดังนั้นถ้าเราเรียกใช้ฟังก์ชั่น setcookie() ตามหลังฟังก์ชั่นอื่น ๆ ของ PHP ที่ใช้ส่งข้อมูลไปยังบราวเซอร์ ก็จะเกิดความผิดพลาดขึ้น ดังตัวอย่าง
cookie_error.php |
<?php echo "ทดสอบ"; setcookie("Test", "456", time() + 60); ?> |
ซึ่งบางครั้งเราไม่สามารถหลีกเลี่ยงการเขียนโค้ดในลักษณะนี้ได้ ด้วยเหตุนี้ PHP จึงจัดเตรียมฟังก์ชั่นที่ใช้ทำ output buffering ไว้ เพื่อให้เรานำข้อมูลไปพักไว้ในหน่วยความจำชั่วคราว หรือบัฟเฟอร์ (buffer) ก่อน แล้วค่อยส่งข้อมูลเหล่านั้นไปยังบราวเซอร์ที่เดียวในตอนท้าย
ฟังก์ชั่นเกี่ยวกับ Output Buffering
ฟังก์ชั่นสำคัญๆ ที่เกี่ยวกับการทำ output buffering มีดังนี้
¨ ฟังก์ชั่น ob_start()
เป็นฟังก์ชั่นที่เปิดการใช้งาน output buffering และสั่งให้มีการจองบัฟเฟอร์ไว้ โดยปกติเราจะเรียกฟังก์ชั่นนี้ที่บรรทัดแรกของไฟล์
¨ ฟังก์ชั่น ob_end_flush()
เป็นฟังก์ชั่นที่ใช้ส่งข้อมูลจากบัฟเฟอร์ไปยังบราวเซอร์ และปิดการใช้งาน output buffering โดยปกติเราเรียกฟังก์ชั่นนี้ที่
บรรทัดสุดท้ายของไฟล์
ob_test.php |
<?php ob_start(); echo "ทดสอบ<br>"; //ลองใช้คำสั่ง echo ก่อนเรียก setcookie() setcookie("Test", "456", time() + 60); echo "ส่ง cookie ชื่อ Test ไปยังเว็บบราวเซอร์แล้ว"; ob_end_flush(); ?> |