การกำหนดและใช้งาน Session ใน CodeIgniter 4

บทความใหม่ เดือนที่แล้ว โดย Ninenik Narkdee
codeigniter 4 session codeigniter

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ codeigniter 4 session codeigniter



เนื้อหาตอนต่อไปนี้ เรามาดูเกี่ยวกับการใช้งาน
session หรือข้อมูลเก็บสถานะหรือค่าต่างๆ ที่สัมพันธ์
กับผู้ใช้งานในขณะที่กำลังใช้งานเว็บไซต์อยู่ ตัวอย่างที่
เห็นได้ชัด เช่น กรณีผู้ใช้ล็อกอิน และใช้งาน เราอาจจะเก็บ
ค่า session ของ userID หรือ email หรือค่าอื่นๆ ที่สัมพันธ์
ของผู้ใช้นั้นๆ เพื่อนำไปใช้งาน หรือแสดงในหน้าอื่น
    เนื่องจากตัวแปร session จะมีความสัมพันธ์กับตัวแปร session
cookie หรือ cookie ที่มีค่าเท่ากับ session_id() ตัวแปร cookie ที่เก็บ
ค่า session id จะมีการส่งไปในทุกๆ หน้าผ่านส่วนของ Request Header
เป็นเหมือนการอ้างอิงค่า session ของผู้ใช้ ณ ขณะนั้น คล้ายกับ id ของ user 
    เมื่อ id ของ session ถูกส่งไปยังหน้าต่างๆ หากหน้านั้นมีการใช้งาน session
เราก็สามารถกำหนด และเรียกใช้งานตัวแปร session ต่างๆ ของ id นั้นได้
 
 
 

เตรียมตัวก่อนใช้งาน Session

    ก่อนที่เราจะเข้าไปสู่รายละเอียดการใช้งาน session เรามาดูการเตรียมส่วนต่างๆ กันก่อน  โดยอย่างแรกก็คือ
ในการใช้งาน session มีเรื่องของ cookie เข้ามาเกี่ยวกับ และตัวแปร cookie ก็มีเรื่องของเวลา เช่น เวลาการหมด
อายุ ดังนั้น เราต้องมั่นไจว่ารูปแบบการตั้งค่าเวลา ใน CI ของเราถูกต้องเรียบร้อยแล้วหรือไม่ ให้เราตรวจสอบ
การกำหนด timezone ว่าเป็น Asia/Bangkok แล้วหรือไม่ ในไฟล์ App.php  หาในส่วนของ Application Timezone
ปกติค่าเริ่มต้นจะเป็น 
 
    app/Config/App.php (บางส่ว่น)
 
public $appTimezone = 'America/Chicago';
 
    ให้เราเปลี่ยนเป็นเวลาในประเทศไทย ดังนี้
 
public $appTimezone = 'Asia/Bangkok';
 
 
    เราจะทดสอบการใช้งาน session โดยสร้าง method ให้กับ Helloworld Controllers เพื่อจำลองการ request 
ไปยังหน้าต่างๆ ดังนี้
 
<?php namespace App\Controllers; 
use CodeIgniter\Controller; // เรียกใช้งาน Controller class
class Helloworld extends Controller 
{
    public function index() 
    {  
		echo "<h1>Page 1</h1>";
		echo session_status();
		echo " ".date("Y-m-d H:i:s");
		echo "<hr>";
		echo anchor('helloworld/page2','Page 2')."&nbsp;";			
		echo anchor('helloworld/page_end','Page End')."&nbsp;";
		echo anchor(current_url(),'Reload');
    }
	public function page2(){
		echo "<h1>Page 2</h1>";
		echo session_status();
		echo "<hr>";
		echo anchor('helloworld/page_end','Page End')."&nbsp;";
		echo anchor('helloworld','Home');
	}
	public function page_end(){
		echo "<h1>Page End</h1>";
		echo session_status();
		echo "<hr>";		
		echo anchor('helloworld/page2','Page 2')."&nbsp;";	
		echo anchor('helloworld','Home');		
	}
}
 
    ในตอนนี้ เราสามารถเรียกไปยัง url หน้าต่างๆ ดังนี้ได้
 
https://www.mysslweb.com/helloworld
https://www.mysslweb.com/helloworld/page2
https://www.mysslweb.com/helloworld/page_end
 
    เราใช้คำสั่ง session_status() ใน php ทดสอบดูค่าสถานะของ session ซึ่งจะมีด้วยกัน 3 ค่า คือ 0 = disabled
1 = None ยังไม่ใช้งาน หรือก็คือไม่ได้ใช้คำสั่ง session_start() ในหน้านั้นๆ  และ 2 = Active คือมีการเปิดใช้งาน
session_start()  กรณีตัวอย่างข้างต้น เราจะได้ค่าเป็น 1 เพราะยังไม่ได้เรียกใช้งาน session ใน CI
    ผลลัพธ์ที่ได้ก็จะประมาณนี้
 
 

 
 
    ในเนื้อหานี้เราจะพูดถึงการจัดการ session ใน 2 วิธีคือ แบบบันทึกเป็นไฟล์ (FileHandler) และแบบบันทีกใน
ฐานข้อมูล (DatabaseHandler)  โดยถ้าเป็นการใช้งาน session ในปริมาณไม่มากนัก แบบไฟล์จะดีกว่า แต่อย่าง
ไรก็ตามทาง CI แนะนำไปทางแบบบันทึกในฐานข้อมูล เพราะจะทำงานเร็วกว่าถ้าใช้งาน session จำนวนมากๆ 
เพราะจำนวน session ส่วนใหญ่แล้วมักจะเพิ่มตามปริมาณจำนวนผู้ใช้งาน 
 
 

    การตั้งค่าการใช้งาน Session

    สำหรับการตั้งค่าการใช้งาน session ใน CI เราสามารถกำหนดในไฟล์ App.php ในส่วนของ Session Variables
โดยค่าเริ่มต้น จะเป็นการบันทักแบบไฟล์ ตามรูปแบบการกำหนดดังนี้
 
    app/Config/App.php (บางส่วน)
 
public $sessionDriver            = 'CodeIgniter\Session\Handlers\FileHandler';
public $sessionCookieName        = 'ci_session';
public $sessionExpiration        = 7200;
public $sessionSavePath          = WRITEPATH . 'session';
public $sessionMatchIP           = false;
public $sessionTimeToUpdate      = 300;
public $sessionRegenerateDestroy = false;
 
 
    การเก็บ Session แบบไฟล์ (FileHandler Driver)
    เนื่องจากค่าเริ่มต้นด้านบนเป็นแบบไฟล์ เราเลยขอมาอธิบายแต่ละส่วนในหัวข้อนี้ แต่ละค่าดังนี้
 
    $sessionDriver
        เป็นการระบุว่าจะเลือกใช้งานการจัดเก็บ session แบบไหน หากเป็นแบบไฟล์ ก็ใช้ค่าเป็น FileHandler
    ตามรูปแบบด้านบน
 
    $sessionCookieName
        เป็นชื่อของตัวแปร cookie ที่จะใช้เก็บค่า session id เป็นเหมือน id หลักของตัวแปร session ที่จะถูกส่ง
    ไปใช้งานในแต่ละหน้าผ่าน Request Header 
 
    $sessionExpiration
        เป็นการกำหนดเวลาการหมดอายุของ session ค่านี้กำหนดในหน่วยวินาที 7200 ก็คือ 2 ชั่วโมง ค่านี้จะ
    เป็นค่าที่กำหนด Max-age ให้กับตัวแปร cookie  ถ้าตัวแปร cookie ที่เก็บ session id หมดอายุ ค่าตัวแปร
    session ทั้งหมดก็จะถูกลบออกไปด้วย ดูตัวอย่าง รูปด้านล่าง

 

 
 
    $sessionSavePath
        เป็นโฟลเดอร์ path ที่ใช้เก็บ session เบื้องต้นค่าจะเป็นที่ 'wriable/session'  เราควรกำหนดโฟลเดอร์นี้
    ให้มีค่า permission เป็น 700 เพื่อป้องกันในเรื่องความปลอดภัย หากใช้ session แบบไฟล์
 
    $sessionMatchIP
        เป็นการเพิ่มเงื่อนไขการตรวจสอบ session ถ้ากำหนดเป็น true จะเป็นการให้ใชิ IP address เป็นตัวกำหนด
    เพิ่มจาก session id นั่นคือ session id ตรงกันและ ip ต้องตรงกัน จึงจะใช้ข้อมูล session นั้นๆ ได้ หากไม่ตรง
    ก็จะเป็นการสร้างชุด session ใหม่ขึ้นมาสำหรับ session id และ ip นั้นๆ แทน
 
    $sessionTimeToUpdate
        เป็นการกำหนดเวลาหน่วยวินาที ว่าให้ ค่าของ session id อัพเดทค่าใหม่ทุกๆ กี่วินาที่ ค่าเริ่มต้นที่กำหนดคือ
    300 วินาที หรือ 5 นาที ค่า cookie  ที่ชื่ ci_session จะอัพเดทเป็นค่าใหม่ทุกๆ 5 นาที โดยในการบันทึกแบบไฟล์
    ก็จะเหมือนเป็นการให้สร้างไฟล์ใหม่ ทุก 5 นาที
 
    $sessionRegenerateDestroy
        เป็นคำสั่งสำหรับลบไฟล์ session id เดิมทันทีที่สร้างไฟล์ใหม่  ถ้ากำหนดเป็น true  ค่านี้สัมพันธ์กับค่าการ 
    $sessionTimeToUpdate  ค่าเวลาอัพเดทด้านบน  แต่ถ้าเป็น false ไฟล์ session id เดิมจะยังคงอยู่ แต่จะถูกลบ
    ออกไปเองภายหลัง
 
    การเก็บ session แบบไฟล์ จะมีปัญหา และข้อควรระวังในเรื่องของไฟล์ จะต้องไม่สามารถเข้าถึงจากภายนอก และ
อีกปัญหาคือ ถ้ามีจำนวนมากๆ ไฟล์ก็จะมากตามไปด้วย เวลาที่ระบบทำการเพิ่ม ลบ แก้ไข session ก็จะทำการไปอ่าน
ไฟล์นั้นๆ ซึ่งจะช้ากว่า กรณีใช้งานแบบบันทึกในฐานข้อมูล
    สำหรับเนื้อหาประกอบการทดสอบ เราจะใช้ค่าเริ่มต้นตามที่กำหนด
    
 

    การเก็บ Session แบบฐานข้อมูล (DatabaseHandler Driver)

    วิธีนี้จะเหมาะสำหรับจัดการกับ session จำนวนมากๆ และทำงานเร็วกว่าวิธีแรก  ในที่นี้เราจะพูดถึงฐานข้อมูล MySQL 
เป็นหลัก รูปแบบการทำงาน เหมือนกับการเพิ่ม ลบ แก้ไขข้อมูลในตารางฐานข้อมูลทั่วไป แทนการเก็บบันทึกเป็นไฟล์
หากต้องการกำหนดการใช้งานแบบฐานข้อมูล ให้ทำตามขั้นตอนดังนี้
 
public $sessionDriver   = 'CodeIgniter\Session\Handlers\DatabaseHandler';
public $sessionSavePath = 'ci_sessions';
 
    กำหนด  $sessionDriver เป็น DatabaseHandler และกำหนดชื่อตารางในฐานข้อมูลที่จะใช้ใน $sessionSavePath
ซึ่งสมมติข้างต้นเรากำหนดเป็น ci_sessions ก็จะหมายถึงตารางชื่อ ci_sessions เป็นต้น 
    เมื่อกำหนดชื่อตารางเรียบร้อยแล้ว เราก็ต้องไปสร้างตารางในรูปแบบที่ CI กำหนด ดังนี้
 
CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(128) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        KEY `ci_sessions_timestamp` (`timestamp`)
);
 
    จากนั้นการกำหนด primary key ให้ยืดโยงกับการตั้งค่าการกำหนด $sessionMatchIP ดังนี้
 
// กรณี sessionMatchIP = TRUE
ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address);

// หรือ กรณี sessionMatchIP = FALSE
ALTER TABLE ci_sessions ADD PRIMARY KEY (id);

// กรณีต้องการลบการกำหนด primary key แล้วค่อยกำหนดใหม่ เมื่อมีการเปลี่ยนการตั้งค่าใหม่
ALTER TABLE ci_sessions DROP PRIMARY KEY;
 
    *** ส่วนเพิ่มเติมล่างนี้ กรณีเฉพราะต้องการแยกตาราง session ไว้อีกฐานข้อมูลหรืออีก server เท่านั้น
    โดยทั่วไปแล้ว เวลาเราสร้างตารางสำหรับเก็บ session เราก็จะสร้างไว้ใน server และ ชื่อฐานข้อมูลเดียวกัน
แต่เราก็สามารถเลือกที่จะสร้างหรือเก็บไว้ในที่อื่นได้ โดยเรียกใช้งานการกำหนด ชื่อการเชื่อมต่อฐานข้อมูลที่
ต้องการใช้งานกับ session โดยเฉพาะได้ 
    ดูการกำหนด ชื่อกลุ่มการเชื่อมต่อฐานข้อมูลได้ที่บนความ http://niik.in/1001
 
    ตัวอย่างสมมติ เรากำหนดชื่อการเชื่อมต่อเป็น sessionDB
 
    app/Config/Database.php (บางส่วน)
 
public $sessionDB = [
	'DSN'      => '',
	'hostname' => 'localhost',
	'username' => 'root',
	'password' => '',
	'database' => 'test',
	'DBDriver' => 'MySQLi',
	'DBPrefix' => '',
	'pConnect' => false,
	'DBDebug'  => (ENVIRONMENT !== 'production'),
	'cacheOn'  => false,
	'cacheDir' => '',
	'charset'  => 'utf8',
	'DBCollat' => 'utf8_general_ci',
	'swapPre'  => '',
	'encrypt'  => false,
	'compress' => false,
	'strictOn' => false,
	'failover' => [],
	'port'     => 3306,
];	
 
    ในไฟล์ app/Config/App.php ให้เราเพิ่มบรรทัด การกำหนด การเชื่อมไปยังฐานข้อมูลสำหรับ session ต่อจาก
บรรทัด ค่า $sessionRegenerateDestroy ประมาณนี้
 
public $sessionRegenerateDestroy = false;
public $sessionDBGroup = 'sessionDB';
 
    หากเราไม่ได้สร้างตาราง session แยกไปที่อื่น เราก็ไม่จำเป็นต้องกำหนดในส่วนนี้
 
    เท่านี้เราก็สามารถเลือกได้ว่า จะใช้รูปแบบการจัดการกับ session แบบไหน การจัดการต่างๆ ตัว CI จะทำงานตาม
รูปแบบคำสั่งที่เราเรียกใช้งาน session ให้อัตโนมัติ
    เมื่อเรารู้จักการตั้งค่าการใช้งานเรียบร้อยแล้ว ก็ไปต่อกันที่การใช้งาน session ใน CI
 
 
 

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

    ในไฟล์ตัวอย่างทดสอบด้านบน เราเห็นแล้วว่า session_status() คืนค่าเป็น 1 นั่นหมายความว่า ในแต่ละหน้ายังไม่มี
การกำหนด session_start() หรือเรียกใช้งาน session ดังนั้น เราจำเป็นต้องเรียกใช้งาน session ในหน้าที่ต้องการ
ผ่านคำสั่งดังนี้
 
$session = session();
 
    คำสั่ง session() เปรียบเสมือนการกำหนดให้หน้านั้นๆ เรียกใช้งาน session ด้วยคำสั่ง session_start() อัตโนมัติ
ข้างต้นเรากำหนดตัวแปร $session ไว้สำหรับเป็น Session instance ไว้ใช้งานคำสั่งต่างๆ ของ session
 
    ดูตัวอย่างการกำหนดการใช้งาน
 
    app/Controllers/Helloworld.php
 
<?php namespace App\Controllers; 
use CodeIgniter\Controller; // เรียกใช้งาน Controller class
class Helloworld extends Controller 
{
    public function index() 
    {  
		echo "<h1>Page 1</h1>";
		echo session_status(); // คืนค่าเป็น 1 = None
		$session = session();
		echo session_status();  // คืนค่าเป็น 2 = Active
		echo "<hr>";
		echo anchor('helloworld/page2','Page 2')."&nbsp;";			
		echo anchor('helloworld/page_end','Page End')."&nbsp;";
		echo anchor(current_url(),'Reload');
    }
	public function page2(){
		echo "<h1>Page 2</h1>";
		session();
		echo session_status();
		echo "<hr>";
		echo anchor('helloworld/page_end','Page End')."&nbsp;";
		echo anchor('helloworld','Home');
	}
	public function page_end(){
		echo "<h1>Page End</h1>";
		$session = session();
		echo session_status();
		$session->destroy();
		echo session_status();
		echo "<hr>";		
		echo anchor('helloworld/page2','Page 2')."&nbsp;";	
		echo anchor('helloworld','Home');		
	}
}
 
    ในกรณีที่เราไม่ต้องการใช้งาน Session instance เราสามารถกำหนดเฉพาะคำสั่ง session() โดยไม่ต้องกำหนด
ตัวแปรเพิ่มรับค่าก็ได้ อย่างใน page2  เราสามารถใช้รูปแบบการเรียกใช้งานตัวแปร session ปกติของ PHP ผ่าน
ตัวแปร $_SESSION ได้เลย ทั้งการกำหนด การแก้ไข การลบค่า สามารถทำได้ปกติ เมื่อมีการเปิดใช้งาน session
ด้วยคำสั่ง session() แล้ว
    แต่ถ้าเราต้องการใช้คำสั่งของ Session instance ใน CI อย่างใน page_end ที่เราทำการล้างค่า session ด้วย
การเรียกใช้งานคำสั่ง $session->destroy()  แบบนี้เป็นต้น 
 
 

    การกำหนดค่าตัวแปร session

    เราสามารถกำหนดค่าให้กับตัวแปร session ด้วยคำสั่งต่างๆ ดังนี้
 
// แบบกำหนดพร้อมกันหลายๆ ค่าด้วย array
$newdata = [
        'username'  => 'johndoe',
        'email'     => 'johndoe@some-site.com',
        'logged_in' => TRUE
];
$session->set($newdata);

// แบบกำหนดค่าเดี่ยว
$session->set('some_name', 'some_value');

// แบบใช้คำสั่ง $_SESSION ปกติ
$_SESSION['some_name'] = 'some_value';
 
 

    การตรวจสอบว่ามีค่า session หรือไม่

 
// ใช้คำสั่ง isset()
isset($_SESSION['some_name'])

// หรือใช้คำสั่ง has() ผ่าน Session instance
$session->has('some_name');
 
 

    การเพิ่มข้อมูลตัวแปร session ที่เป็น array

 
// แบบใช้คำสั่ง $_SESSION ปกติ
$_SESSION['hobbies']['sport'] = 'tennis';

// ใช้คำสั่ง push
$session->push('hobbies', ['sport'=>'tennis']);
 
 

    การอ่านค่า และแสดง session

 
// แบบใช้คำสั่ง $_SESSION ปกติ
echo $_SESSION['item'];

// ผ่าน Session instance
echo $session->get('item');

// ใช้ผ่านรูปแบบ getter
$session->item

// ใช้ผ่าน ฟังก์ชั่น helper วิธีนี้อาจจะสับสนกับ กรณีเรียกใช้งาน session ได้
session('item');

// กรณีต้องการ array ของ session ทั้งหมด
// สามารถใช้ค่าตามนี้ได้ 
$session_array  = $_SESSION;
// หรือ
$session_array = $session->get();

// กรณีข้อมูล session ที่เป็นแบบ array
echo $_SESSION['hobbies']['sport']
// หรือ
echo $session->get('hobbies')['sport'];
 
 

    การลบค่า session

    เราสามารถใช้คำสั่ง unset() จัดการ session ทั้งแบบทีละรายการ หรือทีละหลายๆ รายการ ดังนี้ได้
 
// ลบทีละรายการ
unset($_SESSION['some_name']);

// หรือลบพร้อมกันทีละหลายรายการ
unset(
        $_SESSION['some_name'],
        $_SESSION['another_name']
);

// หรือใช้คำสั่ง remove() ผ่าน session instance
$session->remove('some_name');
// กรณีลบ หลายๆ ค่าพร้อมกัน สำหรับ instance ให้ กำหนด key ของ session ที่จะลบเป็น array
$array_items = ['username', 'email']; // เหมือนลบ $_SESSION['username'] กับ $_SESSION['email']
$session->remove($array_items);
 
 

    กรณีล้างค่า session 

 
// แบบใช้คำสั่ง PHP ปกติ
session_destroy();

// หรือ ผ่าน session instance
$session->destroy();
 
    ในกรณีที่เราต้องการล้างค่า session id เดิมที่กำลังใช้งานอยู่ หากใช้คำสั่ง destroy() จะหมายถึงการลบค่า session
ในขณะนั้นทั้งหมด และเราก็ไม่สามารถใช้งาน session หลังจากคำสั่งนี้ได้ เว้นแต่ไปทำการสร้าง session ใหม่
หรือใช้่คำสั่ง stop() แทน
    คำสั่ง stop() ทำงานคล้ายคำสั่ง destroy() เพียงแต่ว่า หลังจากลบแล้ว คำสั่ง stop จะทำการสร้าง session id ขึ้นมาใหม่
และเราสามารถใช้งาน session instance ต่อได้ เช่น ค่าเดิม แล้วก็กำหนดค่าใหม่เข้าไป
 
$session = session();
$session->stop(); // ลบ session id เดิม และสร้างใหม่
// สามารถเรียกใช้งาน session instance ได้
$session->set('new_ses','new_ses_value');
 
 
    นอกจากการใช้งาน session ปกติแล้ว ใน CI ยังมีรูปแบบ session เฉพาะให้ใช้งานอีก 2 แบบคือ Flashdata กับ
Tempdate ความแตกต่างของทั้งสอง  เป็นดังนี้
    Flashdata ใช้สำหรับบันทึกข้อมูล session ที่ต้องการแสดงเฉพาะในหน้าที่ request ครั้งถัดไป แล้วเมื่อแสดงหรือใช้งาน
เรียบร้อยแล้ว ข้อมูลนั้นๆ ก็จะถูกลบไปโดยอัตโนมัติ ยกตัวอย่างให้พอเข้าใจง่ายๆ ก็เช่น สมมติเราเพิ่มข้อมูลใหม่ แล้วต้องการ
แสดงข้อความแจ้งว่า "เพิ่มข้อมูลใหม่เรียบร้อยแล้ว" ในหน้าแจ้งเตือนที่จะแสดงถัดไป เราก็ใช้ข้อมูลเป็น Flashdata ส่งไปหน้า
แสดงข้อมูล หลังจากแสดงหรือใช้งานแล้ว ข้อมูลนี้ก็จะหายไปอัตโนมัติ
    Tempdata ใช้สำหรับข้อมูล session ที่เราสามารถกำหนดอายุของมันได้ เมื่อหมดเวลาตามที่กำหนด ตัวแปร session นั้นๆ
ก็จะถูกลบอัตโนมิตั 
     เรามาดูรายละเอียด และการใช้งาน แต่ละรายการดังนี้
 
 

    การใช้งาน Flashdata

    เปรียบเสมือนตัวแปร session ที่กำหนดในหน้าหนึ่ง และถูกใช้งานในอีกหน้าใน request ถัดไป ทั้งแบบการ redirect หรือ
กดลิ้งค์ยังหน้าใดๆ ดูตัวอย่าง ประกอบ
 
public function index() 
{  
	echo "<h1>Page 1</h1>";
	$session = session();
	$_SESSION['item'] = 'value';
	$session->markAsFlashdata('item');
}
public function page2(){
	echo "<h1>Page 2</h1>";
	$session = session();
	print_r($_SESSION);
}
public function page_end(){
	echo "<h1>Page End</h1>";
	$session = session();
	print_r($_SESSION);
}
 
    ที่ path 'helloworld' เราสร้าง flashdata session ถ้าเราไปหน้า 'helloworld/page2' หากมีการใช้งาน session ตัวแปร 
flashdata จะถูกลบหลังจากแสดง หรือใช้งานแล้ว และถ้าเราไปต่อที่หน้า 'helloworld/page_end' ก็จะไม่มีตัวแปร session
ที่ชื่อ item แล้ว  และในลักษณะเหมือนกัน ถ้าเราไปหน้า 'helloworld/page_end' ก่อน หลังโหลดหน้านี้เสร็จ ตัวแปร
flashdata session ก็จะถูกลบ เมื่อไปต่อที่หน้า 'helloworld/page2' ก็จะไม่มีตัวแปร session ที่ชื่อ item แล้ว เช่นกัน
    ตัวแปร flashdata ก็เหมือน session หนึ่ง เพียงแต่ว่า มีระบบจัดการในการลบตัวแปรนี้ อัตโนมัติเมื่อมีการ request ในหน้า
ถัดไป หลังจากสร้างตัวแปรแล้ว
 
 
    การกำหนดตัวแปร Flashdata session
    เราสามารถใช้คำสั่ง markAsFlashdata() เพื่อกำหนด คัวแปร session เดิมที่มีอยู่แล้วเป็นตัวแปร session แบบ flashdata
 
// สมมติมี session ชื่อ $_SESSION['item'] อยู่แล้ว
$session->markAsFlashdata('item');

// หรือกรณีสร้างตัวแปร session เพื่อกำหนดเป็น flashdata โดยเฉพาะ
// $_SESSION['item'] = 'value';
$session->set('item','value'); 
$session->markAsFlashdata('item');

// กรณีกับหนดให้กับหลายๆ ค่าเพิ่มกัน ใช้ key ของ session ไปกำหนด
$_SESSION['item'] = 'value';
$_SESSION['item2'] = 'value2';
$session->markAsFlashdata(['item', 'item2']);

// หรือจะใช้คำสั่ง setFlashdata() กำหนดตัวแปร flashdata เลยก็ได้
$session->setFlashdata('item', 'value');
// กรณีหลายค่าพร้อมกันก็ใช้เป็น
$newdata = [
        'username'  => 'johndoe',
        'email'     => 'johndoe@some-site.com',
        'logged_in' => TRUE
];
$session->setFlashdata($newdata);
 
 
    การอ่านค่า และใช้งาน Flashdata session
    เราสามารถใช้รูปแบบการเรียกใช้งาน flashdata session ปกติเหมือนการใช้งาน session ทั่ว่ๆ ไป ตามที่อธิบายไปในหัวข้อ
การอ่านค่า และแสดง session 
 
echo $_SESSION['item'];
echo $session->get('item');
$session->item
 
    หรือถ้าเราต้องการให้มั่นใจว่าเป็นค่าจากตัวแปร flashdata session จริงๆ ก็สามารถใช้คำสั่ง getFlashdata() แทนได้ โดยระบุ
ชื่อ session ที่้ต้องการ
 
$session->getFlashdata('item'); // สำหรับค่าตาม ชื่อที่กำหนด 
$arr_session = $session->getFlashdata(); // สำหรับทุกๆ ค่า ที่เป็น flashdata คืนค่าเป็น arrray หากไม่มีจะเป็น NULL
 
    ถ้าเราต้องการให้ หลังจากแสดงในหน้าถัดไปแล้ว ยังอยากใช้ข้อมูลนั้นต่อ ในหน้าถัดไปต่อไปอีกหน้าหนึ่ง ก็ให้ใช้คำสั่ง
keepFlashdata() เพื่อให้คง หรือสามารถส่งต่อไปยังหน้าถัดไปอีกได้
 
$session->keepFlashdata('item');
$session->keepFlashdata(['item1', 'item2', 'item3']);
 
 

    การใช้งาน Tempdata

    เป็น session ที่เราสามารถกำหนดเวลาหมดอายุอัตโนมัติได้ โดยกำหนดเวลาเป็นวินาที เป็นค่า parameter ตัวที่สอง การ
นำไปใช้งาน ก็ประมาณว่า สมมติเรามีหน้าฟอร์ม ที่แบ่งการกรอกข้อมูลเป็นหลายๆ หน้า เราอยากเก็บค่าข้อมูลแต่ละหน้า
ไว้ใน session ที่กำหนดเวลาหมดอายุได้ พอถึงหน้าสุดท้ายก็เราเอาค่าทั้งหมดที่รวบรวมมา นำไปบันทึกลงฐานข้อมูล ในกรณี
ที่ต้องการแก้ไข เราก็สามารถกลับมาหน้าที่ต้องการแก้ไข แล้วแสดงข้อมูลเก่าจาก session ได้   หรือในรูปแบบการทำแบบ
ทดสอบหรือข้อสอบ เช่นกำหนดให้ทำข้อสอบใน 10 นาที เราก็อาจจะเก็บ session ของข้อมูลก่อนส่งไว้ 10 นาที หากเกินนี้
ก็หมายถึงทำข้อสอบไม่ทัน ค่าที่เก็บไว้ก่อนบันทึก ก็จะหายไปอัตโนมัติ ต้องเริ่มใหม่ แนวทางการนำไปใช้ก็ประมาณนี้ ขึ้นกับ
การประยุกต์ใช้งาน
 
 
    การกำหนดตัวแปร Tempdata session
    สำหรับการกำหนดตัวแปร tempdata ก็คล้ายๆ กับรูปแบบการใช้งาน flashdata เพียงแค่มีเรื่องของการกำหนดเวลาเข้ามาด้วย
 
// กรณีใช้ค่า session ที่มีอยู่แล้ว
// 'item' จะหมดอายุใน 300 วินาที
$session->markAsTempdata('item', 300);

// ทั้ง 'item' และ 'item2'  จะหมดอายุใน 300 วินาที
$session->markAsTempdata(['item', 'item2'], 300);

// 'item' จะหมดอายุใน 300 วินาที ขณะที่ 'item2'
// จะหมดอายุใน 240 วินาที
$session->markAsTempdata([
        'item'  => 300,
        'item2' => 240
]);

//   หรือใช้คำสั่ง setTempdata() กรณีสร้างใหม่ โดยเฉพาะ
$session->setTempdata('item', 'value', 300);

// กรณีเป็น array
$tempdata = ['newuser' => TRUE, 'message' => 'Thanks for joining!'];
$session->setTempdata($tempdata, NULL, $expire);
 
 
    การอ่านค่า และใช้งาน Tempdata session
    เราสามารถใช้รูปแบบการเรียกใช้งาน tempdata session ปกติเหมือนการใช้งาน session ทั่ว่ๆ ไป ตามที่อธิบายไปในหัวข้อ
การอ่านค่า และแสดง session 
 
echo $_SESSION['item'];
echo $session->get('item');
$session->item
 
    หรือถ้าเราต้องการให้มั่นใจว่าเป็นค่าจากตัวแปร tempdata session จริงๆ ก็สามารถใช้คำสั่ง getTempdata() แทนได้ 
โดยระบุชื่อ session ที่้ต้องการ
 
$session->getTempdata('item'); // สำหรับค่าตาม ชื่อที่กำหนด 
$arr_session = $session->getTempdata(); // สำหรับทุกๆ ค่า ที่เป็น tempdata คืนค่าเป็น arrray หากไม่มีจะเป็น NULL
 
    อย่างที่เราทราบว่าตัวแปร tempdata จะหมดอายุ เมื่อถึงเวลาที่กำหนด แต่ถ้าเราจำเป็น หรือต้องการจะลบค่า tempdata
session ก่อนหมดอายุ เราก็สามารถทได้ปกติด้วยคำสั่ง unset()( หรือจะใช้คำสั่ง removeTempdata() ก็ได้ดังนี้
 
unset($_SESSION['item']); // ลบใน request ถัดไป
$session->removeTempdata('item'); // ลบในทันที
 
 
    ก็ถือได้ว่า ทั้ง Flashdata และ Tempdata เป็นส่วนที่ CI นำ session มาใช้ประโยชน์ ในรูปแบบจำเพาะ อย่างเช่น Tempdata
ที่บาง session เราอาจจะไม่ได้ใช้งานตลอด แต่ถ้ากำหนดแบบปกติ แล้วลืมหรือไม่ได้ลบค่าออกไป ก็อาจจะมีผลให้การใช้งาน
session โดยรวมช้าลงไปด้วย แต่ถ้าถูกลบอัตโนมัติเมื่อถึงเวลาที่กำหนด ปัญหานี้ก็จะหมดไป ดังนั้น การเลือกใช้รูปแบบ session
ก็ช่วยให้เราจัดการเว็บไซต์ให้ไปในแนวทางที่เหมาะสมได้
 
    เนื้อหาเกี่ยวกับการใช้งาน session ใน CI4 เป็นรูปแบบแนวทางเบื้องต้น ที่เราจะต้องทำความเข้าใจ และนำไปปรับ
ประยุกต์ใช้งานเพิ่มเติมตามความเหมาะสมต่อไป


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ