Apichart Nakarungutti
The Cake is a Lie
ในการเขียนโปรแกรมทั่ว ๆ ไป เราสามารถเก็บข้อมูลของผู้ใช้ เช่น ชื่อ ข้อมูลของแต่ละขั้นตอนที่ผู้ใช้ได้ทำลงไปในตัวแปรแบบปกติได้ แต่สำหรับการเขียนโปรแกรมสำหรับเว็บนั้นทำแบบนั้นไม่ได้ เพราะ URL ไม่สามารถบ่งบอกตัวผู้ใช้ และไม่สามารถเก็บข้อมูลตัวแปรได้ (ยกเว้นจะใช้ GET ซึ่งไม่ปลอดภัยสักเท่าไหร่ เพราะถ้ามีใครรู้ URL ก็สามารถปลอมตัวเป็นคน ๆ นั้นได้ มันคงไม่สนุก ถ้าเขาปลอมเป็นเรา แล้วโอนเงินในธนาคารออกไปจนหมด) PHP จึงสร้างตัวแปรพิเศษขึ้นมาคือ session
session
ต่างจากตัวแปรปกติตรงที่ เมื่อจบการประมวลผล ค่าของมันจะไม่ถูกทำลายเหมือนตัวแปรปกติ แต่จะถูกทำลายเมื่อผู้ใช้ออกจากเว็บแทน
จะใช้ session ต้องประกาศก่อน และต้องทำก่อนที่จะส่งข้อมูลใด ๆ ออกมา ไม่ใช่นั้นจะเจอข้อความ headers already sent
<?php session_start(); ?>
<html>
<head>
.
.
.
เวลาเรียกใช้ก็เรียกใช้เหมือนอาเรย์ปกติ ผ่านทางตัวแปร $_SESSION
ซึ่งเป็นตัวแปรชนิด superglobal
<?php
if (isset($_SESSION['in_cart'])) {
echo 'You have ' . $_SESSION['in_cart'] . ' item(s) in cart.';
} else {
$_SESSION['in_cart'] = 0;
$_SESSION['item_id'] = '';
}
หากต้องการลบค่านั้นออกจาก session สามารถสั่ง unset
ทีละตัวหรือทำลาย session นั้นทิ้งไปเลยก็ได้ แต่ถึงจะไม่ทำลาย ถ้าผู้ใช้ออกจากเว็บข้อมูลใน session ก็ถูกทำลายอยู่ดี
<?php
unset($_SESSION['in_cart']);
session_destroy();
โดยทั่วไปแล้ว session จะคล้าย ๆ กับ cookie คือเก็บข้อมูลของผู้ใช้ไว้เหมือน ๆ กัน ต่างกันตรงที่ว่า
<?php
session_start();
// session
if (isset($_SESSION['scount']))
$_SESSION['scount']++;
else
$_SESSION['scount'] = 1;
// cookie
if (isset($_COOKIE['ccount']))
$_COOKIE['ccount']++;
else
$_SESSION['ccount'] = 1;
setcookie('ccount', $_COOKIE['ccount'], time()+36000);
?>
<html>
<head><title>Test session & cookie</title></head>
<body>
<pre>
<?php
echo 'Session count: ' . $_SESSION['scount'];
echo '<br />';
echo 'Cookie count: ' . $_COOKIE['ccount'];
?>
</pre>
</body>
</html>