ภาษา PHP เบื้องต้น (6) Cookies และ Session

Web Development 01 กันยายน พ.ศ. 2566 377
Home / Articles / 62

สวัสดีครับในบทความนี้ผมจะพามารู้จักกับ Cookie และ Session บนภาษา PHP ซึ่งก่อนแรกเราจะมาพูดถึงข้อแตกต่างระหว่าง Cookie กับ Session กันก่อน จากนั้นจะมีตัวอย่างโค้ด PHP การสร้าง เรียกใช้ และทำลาย ข้อมูลใน Cookie กับ Session

Cookie และ Session คืออะไร?

Cookie คือ การเก็บข้อมูลไว้ใน Web Browser ของผู้ใช้ ซึ่งผู้พัฒนาเว็บไซต์สามารถตั้งเวลาให้ Cookie ดังกล่าวให้ หมดอายุ ตามเวลาที่กำหนดได้ ข้อเสียคือ เมื่อเก็บอยู่ใน Web Browser อาจเสี่ยงที่จะถูกขโมยออกไปได้

Session คือ การเก็บข้อมูลไว้ที่ Server โดยจะมีการเก็บ Cookie ที่ชื่อว่า PHPSESSID ไว้ที่ Web Browser ของผู้ใช้ ซึ่ง Web Browser จะใช้อ้างอิงไปหาข้อมูลที่เก็บอยู่ในไฟล์บน Sever อีกทีหนึ่ง

ทั้งสองนี้มาข้อแตกต่างกันคือ Cookie หากปิด Web Browser และเปิดใหม่ ข้อมูลจะยังอยู่จนกว่าจะหมดอายุ เนื่องจากข้อมูลถูกเก็บไว้ในฝั่ง Client-Side หรือ Browser-Side ต่างจาก Session ที่ข้อมูลถูกเก็บไว้ที่ Server-Side และจะหายไปเมื่อผู้ใช้ปิด Web Browser

การสร้าง Cookie บน PHP

เราสามารถสร้าง Cookie บน PHP ได้โดยใช้ฟังก์ชั่น setcookie() โดยในตัวอย่างผมจะสมมุติเป็นระบบล็อคอินง่ายๆ โดยจะใช้ Cookie ในการเก็บข้อมูลการเข้าสู่ระบบ

//login.php
$username = $_POST['username'];
$password = md5($_POST['password']);
if($username == "admin" && $password == "db540e55597b836a5882b30e09d22369") {
  setcookie('member_username', $username, time() + (86400 * 30), "/");
  setcookie('member_password', $password, time() + (86400 * 30), "/");
  header("Location: home.php");
  die();
} else {
  die("Login Failed.");
}

จากโค้ดตัวอย่างในฟังก์ชั่น setcookie จะแบ่งเป็นสี่ส่วนคือ ชื่อคุ้กกี้, ข้อมูล, เวลาหมดอายุ, ที่อยู่ ซึ่งในตัวอย่างผมจะจัดเก็บ member_username และ member_password โดยให้วันหมดอายุมีระยะ 1 เดือน โดยใช้ข้อมูลจาก เวลาปัจจุบันในฟังก์ชั่น time() บวกด้วย 1 เดือนในหน่วยของวินาที (86400 วินาที = 1 วัน คูณด้วย 30 = 1 เดือน) และกำหนดที่อยู่ไว้ที่ "/" หมายถึง Root Directory ซึ่งก็คือให้คุ้กกี้นี้ทำงานได้ทั่วทั้งเว็บไซต์

การเรียกใช้ Cookie

หลังจาก Login แล้วเมื่อเข้ามาในไฟล home.php สามารถทำได้โดยการเรียกผ่าน $_COOKIE เช่น

//home.php
if(isset($_COOKIE['member_username']) && isset($_COOKIE['member_password'])) {
  echo "Your username is: ".$_COOKIE['member_username'];
  echo "Your hash password is: ".$_COOKIE['member_password'];
} else {
  header("Location: login.php");
  die();
}

การทำลาย Cookie

การทำลาย Cookie สามารถทำได้โดยการตั้งวันหมดอายุให้ Cookie ใหม่ เป็นเวลาในอดีต เช่น

//logout.php
setcookie('member_username', '', 0, "/");
setcookie('member_password', '', 0, "/");
header("Location: login.php");
die();

การสร้าง Session

ทุกๆไฟล์ที่มีการเรียกใช้ Session จำเป็นจะต้องเรียกใช้ฟังก์ชั่น session_start() ไว้บรรทัดบนสุดเสมอ ในตัวอย่างนี้จะเป็นการนำโค้ดจากด้านบน มาเปลี่ยนจาก Cookie มาเป็น Session โดยจะนำข้อมูลใส่ลงไปในตัวแปร $_SESSION จะได้โค้ดดังนี้

//login.php
session_start();
$username = $_POST['username'];
$password = md5($_POST['password']);
if($username == "admin" && $password == "db540e55597b836a5882b30e09d22369") {
  $_SESSION['member_username'] = $username;
  $_SESSION['member_password'] = $password;
  header("Location: home.php");
  die();
} else {
  die("Login Failed.");
}

การเรียกใช้ Session

ในการเรียกใช้ข้อมูลใน Session เราจะเรียกผ่าน $_SESSION โดย อย่าลืมว่า บนสุดของไฟล์ต้องใส่ session_start()

//home.php
session_start();
if(isset($_SESSION['member_username']) && isset($_SESSION['member_password'])) {
  echo "Your username is: ".$_SESSION['member_username'];
  echo "Your hash password is: ".$_SESSION['member_password'];
} else {
  header("Location: login.php");
  die();
}

การทำลาย Session

เราสามารถเลือกที่จะทำลาย Sessions ทั้งหมดได้โดยใช้ฟังก์ชั่น session_destroy() ดังนี้

//logout.php
session_start();
session_destroy();
header("Location: login.php");
die();

หรือจะลบแค่บาง session โดยใช้ฟังก์ชั่น unset() ดังนี้

//logout.php
session_start();
unset($_SESSION['password']);
header("Location: login.php");
die();

อ้างอิง:

www.w3schools.com/php/func_network_setcookie.asp

Profile Picture.
  • Name (Pen name): Sunny Jirakit (Sunny420x)
  • Study: Bachelor Degree of Computer Science from Chiang Mai Rajabhat University
  • Personality: Architect (INTJ-T)
  • Experience: JavaScript,  Angular.js, React.js, Next.js  Express.js, Unity C#, Socket.io