การสร้างโปรแกรมประยุกต์เว็บ > Cookie และ Session
Session
เนื่องจาก HTTP เป็นโปรโตคอลแบบไม่มีสถานะ หมายความว่า โปรโตคอลนี้ไม่มีวิธีของตัวเองในการรักษาสถานะระหว่าง 2 ทรานแซคชัน เมื่อผู้ใช้ขอ 1 เพจ แล้วตามด้วยอีกเพจ จะสามารถบอกว่าคำขอทั้งคู่มาจากผู้ใช้เดียวกัน
ความคิดของการควบคุม session คือ ความสามารถในการสืบค้นผู้ใช้ระหว่าง 1 session บนเว็บ
session ใน PHP เป็นการขับเคลื่อนด้วย session ซึ่งเป็นหมายเลขกลุ่มเข้ารหัส session ID ได้รับการสร้างโดย PHP และเก็บอยู่ที่ด้านลูกข่ายตลอดอายุของ session และสามารถเก็บบน เครื่องคอมพิวเตอร์ของผู้ใช้ หรือ ส่งผ่าน URL
บางครั้งอาจจะใช้เว็บเก็บ session id ใน URL ถ้ามีข้อความของข้อมูลสุ่มใน URL นี่เป็นอีกรูปแบบของการควบคุม session
ขั้นตอนพื้นฐานของการใช้ session คือ
- เริ่มต้น session
- ลงทะเบียนตัวแปร session
- ใช้ตัวแปร session
- ถอนทะเบียนตัวแปรและลบ session
เริ่มต้น Session
ก่อนใช้การทำงาน session ต้องเริ่มต้น session ซึ่งมี 3 วิธี คือ
วิธีแรก เริ่มต้นสคริปต์ด้วยการเรียกฟังก์ชัน session_start
session_start( );
ฟังก์ชันนี้ตรวจสอบ session id ปัจจุบันถ้าไม่จะสร้างขึ้นมา ถ้ามีอยู่แล้วจะโหลดตัวแปร session จดทะเบียนจากจะสามารถใช้ได้ การเรียก session_start ( ) ควรอยู่ที่เริ่มต้นของสคริปต์ที่ใช้ session
วิธีที่ 2 session ที่เริ่มต้นเมื่อพยายามจดทะเบียนตัวแปร session
วิธีที่ 3 session สามารถเริ่มต้นด้วยการตั้งค่า PHP ให้เริ่มต้นอย่างอัตโนมัติเมื่อมีคน เข้ามายังเว็บ ควรทำลักษณะนี้ใช้ตัวเลือก session_auto_start ในไฟล์ php.ini
การลงทะเบียนตัวแปร Session
ในการสืบค้นตัวแปรจากสคริปต์หนึ่งไปยังอีกแห่ง ต้องมีการลงทะเบียนด้วยการเรียก session_register ( ) ตัวอย่างเช่น ลงทะเบียนตัวแปร $myvar
$myvar1 = 5;
session_register("myvar1");
ใน PHP5 สามารถตั้งค่าไปที่ $_SESSION array ได้โดยตรง
$_SESSION['myvar2'] = "Hello world";
หมายเหตุ การส่งผ่านข้อความเก็บชื่อตัวแปรไปยัง session_register ข้อความนี้ต้องไม่มีสัญลักษณ์ $
ตัวแปรจะถูกบันทึกและสืบค้นค่า ตัวแปรจะได้รับการสืบค้นจนกระทั่ง session สิ้นสุดหรือจนกระทั่งถอนทะเบียน
การลงทะเบียนสามารถทำได้มากกว่า 1 ตัวแปรในครั้งเดียวโดยการใช้เครื่องหมายจุลภาคแบ่งชื่อตัวแปร
session_register("myvar1", "myvar2");
การเก็บค่าของตัวแปร Session
เมื่อเริ่มต้น session แล้วจะทำให้ตัวแปร session มี scope ที่สามารถใช้ได้
จากนั้นสามารถเข้าถึงตัวแปรนั้น ถ้า register_globals เป็น on จะเข้าถึงผ่านชื่อรูปแบบย่อ เช่น $myvar ถ้าไม่เป็น on การสืบตัวแปรผ่าน $_SESSION เช่น $_SESSION["myvar"] ถ้าตั้งค่า register_long_arrays เป็น on ในไฟล์ php.ini จะสามารถใช้ $HTTP_SESSION_VARS
ตัวแปร session ไม่สามารถเขียนทับโดย POST และ GET ซึ่งเป็นส่วนความปลอดภัยที่ดี แต่มีความ ยุ่งยากบ้างเมื่อเขียนคำสั่ง
ตรวจสอบการลงทะเบียนตัวแปร session สามารถเรียกฟังก์ชัน session_is_registered
$result = session_is_registered("myvar");
คำสั่งนี้ตรวจว่า $myvar เป็นตัวแปร session ที่ลงทะเบียนและส่งออก TRUE หรือ FALSE นอกจากนี้สามารถตรวจสอบตัวแปรกับ $_SESSION array ได้
การใช้ Cookie กับ Session
cookie มีปัญหาที่เกี่ยวข้องคือ บาง browser ไม่ยอมรับ cookie และผู้ใช้บางคนอาจจะไม่ให้ใช้ cookie กับ browser ของพวกเขา ที่เป็นเหตุผลหนึ่งที่ session ของ PHP ใช้เมธอดคู่ cookie/URL
เมื่อใช้ session ของ PHP จะไม่ต้องตั้งค่า cookie เองฟังก์ชัน session จะดูแลเรื่องนี้ให้
ฟังก์ชัน session_get_cookie_params ( ) สามารถใช้ดูข้อมูลของ cookie ที่ตั้งค่าโดยการควบคุม session และส่งออก array ที่สัมพันธ์ เดิมหน่วยข้อมูล lifetime, path, domain และ secure
รวมทั้งสามารถใช้
session_set_cookie_params ($lifetime, $path, $domain, $secure);
เพื่อตั้งค่าพารามิเตอร์ session cookie
Session ID
PHP จะใช้ cookie โดยค่าเริ่มต้นด้วย session ถ้าเป็นไปได้ cookie จะได้รับการตั้งค่าเพื่อเก็บ session id โดย session id มีลักษณะนี้
PHPSESSID8e8c198c623d1f726931d93928b4e07a
วิธีต่อมาคือการใช้ session id กับ URL การตั้งค่านี้เกิดขึ้นอย่างอัตโนมัติ ถ้าคอมไฟล์ PHP ด้วยตัวเลือก - - enabletranssid นอกจากนี้ อีกวิธีคือสามารถฝัง session id ในการเชื่อมโยง ดังนั้นส่งผ่านได้ session ID ได้รับการเก็บในค่าคงที่ SID การส่งผ่านเองให้เพิ่มไปยังท้ายของการเชื่อมโยงคล้ายกันกับพารามิเตอร์ GET
<a href="link.php?<?=sid?">
โดยทั่วไป จะเป็นการง่ายกว่าด้วยการคอมไฟล์ - - enabletranssid เป็นไปได้ หมายเหตุ รวมถึงค่าคงที่ SID จะทำงานเฉพาะแบบนี้คอนฟิก PHP ด้วย - - enabletrackvars เป็นการใช้ session อย่างง่าย
ถอนทะเบียนตัวแปรและลบ Session
เมื่อเสร็จสิ้นการใช้ตัวแปร การถอนทะเบียนตัวแปร สามารถใช้ฟังก์ชัน session_unregister ( )
session_unregister("myvar1");
ฟังก์ชันนี้ต้องการชื่อตัวแปรที่จะถอนทะเบียนเป็นข้อความและไม่มีสัญลักษณ์ $ ฟังก์ชันนี้สามารถถอนทะเบียนเพียง 1 ตัวแปร session ในแต่ละครั้ง อย่างไรก็ตามสามารถใช้ session_unset ( ) เพื่อถอนทะเบียนตัวแปร session ปัจจุบันทั้งหมด
เมื่อเสร็จสิ้น session ให้ถอนทะเบียนตัวแปรทั้งหมดและทำความสะอาด session id
session_destroy();
ลบ cookie
setcookie(session.name(), "", time()-3600);
จากนั้นลบข้อมูลใน $_SESSION array ว่างเปล่า
$_SESSION = array();
ตัวอย่างการทำงานของ Session
ตัวอย่างนี้จะใช้ 3 เพจ บนเพจแรก จะเริ่มต้นและอ่านข้อมูลเข้าสู่อ๊อบเจคที่เป็น constructor ที่สร้างมาจากไฟล์รวม empinfo.inc ตามรายการคำสั่ง 2.1.1
รายการคำสั่ง 2.1.1 empinfo.inc
<?php
//empinfo.php
class EmpInfo
{
private $emp_id;
private $userName;
private $empName;
private $address;
private $salary;
function __construct($in_emp_id, $in_userName, $in_empName, $in_address, $in_salary)
{
$this->emp_id = $in_emp_id;
$this->userName = $in_userName;
$this->empName = $in_empName;
$this->address = $in_address;
$this->salary = $in_salary;
}
public function get_UserID() { return $this->emp_id; }
public function get_UserName() { return $this->userName; }
public function get_EmpName() { return $this->empName; }
public function get_Address() { return $this->address; }
public function get_Salary() { return $this->salary; }
}
?> |
การอ่านข้อมูลจากอ๊อบเจคและส่งค่าให้ $_SESSION array ทำในเพจที่ 1 และแสดงผลด้วยฟังก์ชัน var_export และ var_dump เพื่ออ่านค่าตัวแปรและค่าของ session ตามรายการคำสั่ง 2.1.2
รายการคำสั่ง 2.1.2 session_03_obj1.php
<?php
// session_03_obj1.php
require_once('empinfo.inc');
ini_set('session.name', 'EMPSESSION');
session_start();
?>
<html>
<head>
<title>Read Object to Session</title>
<meta http-equiv="Content-Type" content="text/html; charset=tis-620">
</head>
<body>
<?php
//
// สาธิตการตั้งค่าอ๊อบเจคไปยังตัวแปร session
$emp = new EmpInfo(123123, "somsaks", "สมศักดิ์ แสงทอง",
"145 ถนนเสรีไทย แขวงบึงกุ่ม เขตบึงกุม กทม.", 12500);
$_SESSION['current_emp'] = $emp;
var_export($_SESSION);
echo "<br/><br/>\n";
var_dump(session_id());
echo "<br/>\n";
var_dump(session_name());
echo "<br/>\n";
var_dump(session_get_cookie_params());
echo "<br/>\n";
?>
<br/><br/>
<a href="session_02_obj2.php">คลิกไปหน้าต่อไป</a>
<br/>
</body>
</html> |
ผลลัพธ์ของเพจ
array ( 'current_emp' => EmpInfo::__set_state(array( 'emp_id' => 123123, 'userName' => 'somsaks', 'empName' => 'สมศักดิ์ แสงทอง', 'address' => '145 ถนนเสรีไทย แขวงบึงกุ่ม เขตบึงกุม กทม.', 'salary' => 12500, )), )
string(32) "704e7ef925717c5060d5bd5c54db98c5"
string(10) "EMPSESSION"
array(4) { ["lifetime"]=> int(0) ["path"]=> string(1) "/" ["domain"]=> string(0) "" ["secure"]=> bool(false) }
เมื่อเริ่มต้นสคริปต์ต่อไปโดยการเรียก session_start ( ) และส่งค่าจาก $_SESSION array ไปยังอ๊อบเจค emp สำหรับการแสดงผล การส่งผ่านทำตามปกติ
$emp = $_SESSION['current_emp'];
การเริ่มต้น session และลบ session
<?php
// delete session
session_destroy();
// delete session cookie
setcookie(session_name(), "", time()-3600);
// destroy $_SESSION array
$_SESSION = array();
?>
จากนั้นให้ฟังก์ชันแสดงผลลัพธ์จะปรากฎเป็นค่าว่าง
No more $emp as object.
array(0) { }
string(0) ""
string(10) "EMPSESSION"
array(4) { ["lifetime"]=> int(0) ["path"]=> string(1) "/" ["domain"]=> string(0) "" ["secure"]=> bool(false) }
|