วิธีการตั้งค่าเซสชันใน Codeigniter พร้อมตัวอย่าง
การจัดการเซสชัน CodeIgniter
หากคุณเคยพัฒนาแอปพลิเคชันบนเดสก์ท็อปมาก่อน คุณอาจทราบว่าคุณสามารถกำหนดตัวแปรส่วนกลางโดยกำหนดค่าให้กับตัวแปรนั้นและใช้งานได้ตลอดวงจรชีวิตของแอปพลิเคชันที่เปิดและปิดมากกว่าหนึ่ง (1) และแต่ละคำขอจะสามารถเข้าถึง ตัวแปรทั่วโลก
กล่าวอีกนัยหนึ่ง สถานะของแอปพลิเคชันจะยังคงอยู่ กล่าวคือหากเมื่อคุณเข้าสู่ระบบ คุณตั้งชื่อบริษัทให้เป็นตัวแปรส่วนกลาง แม้ว่าคุณจะปิดแบบฟอร์มการเข้าสู่ระบบแล้วก็ตาม สถานะของชื่อบริษัทก็จะยังคงอยู่
HTTP ทำงานแตกต่างไปเล็กน้อยจากสถานการณ์ข้างต้นที่เราเพิ่งอธิบายไป มันไร้สัญชาติ นั่นคือการบอกว่าสิ่งที่คุณทำในคำขอหนึ่งจะไม่คงอยู่ต่อไปในคำขอถัดไป ต
หรือแก้ไขปัญหานี้ เรามีโซลูชันสอง (2) รายการใน PHP เราสามารถทำงานกับคุกกี้ซึ่งเป็นไฟล์ขนาดเล็กที่วางอยู่บนคอมพิวเตอร์ของผู้ใช้หรือทำงานกับเซสชันที่คล้ายกับคุกกี้ แต่ถูกเก็บไว้บนเซิร์ฟเวอร์แทนและมีความจุมากกว่าคุกกี้
ควรใช้เซสชันเมื่อใด?
เซสชันมักจะมีประโยชน์เมื่อคุณต้องการทราบกิจกรรมของผู้ใช้จากหน้าหนึ่งไปอีกหน้าหนึ่ง ตัวอย่างเช่น สมมติว่าคุณมีพื้นที่ที่ได้รับการป้องกันบนเว็บไซต์ ผู้ใช้ไม่จำเป็นต้องเข้าสู่ระบบในแต่ละหน้า คุณสามารถให้ผู้ใช้เข้าสู่ระบบเพียงครั้งเดียวและเก็บรายละเอียดของตนไว้ในตัวแปรเซสชัน จากนั้นจึงนำข้อมูลเดียวกันมาใช้ซ้ำในการร้องขอครั้งต่อไป กรณีการใช้งานอื่นๆ ได้แก่ เมื่อทำงานบนระบบการซื้อของและผู้ใช้ต้องเพิ่มสินค้าลงในตะกร้าสินค้า
อีกทางหนึ่ง CodeIgniter ยังใช้เซสชันเพื่อทำให้ข้อมูลพร้อมใช้งานเพียงครั้งเดียวในคำขอครั้งถัดไป สิ่งนี้มีประโยชน์ที่คุณอาจได้รับการแก้ไขและปรับปรุงบันทึกฐานข้อมูล และคุณต้องการส่งคำติชมบางส่วนกลับไปยังผู้ใช้เมื่อพวกเขาถูกเปลี่ยนเส้นทางไปยังหน้าอื่น
การส่งข้อความ Flash ไปยังหน้าอื่นด้วย CI Sessions
ในส่วนนี้ คุณจะได้เรียนรู้เกี่ยวกับการส่งข้อความแฟลชไปยังหน้าอื่นๆ โดยใช้ไลบรารีเซสชัน CodeIgniter
สร้างไฟล์ใหม่ SessionController ใน
application/controllers/SessionController.php
เพิ่มโค้ดดังต่อไปนี้:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class SessionController extends CI_Controller { public function __construct() { parent:: __construct(); $this->load->helper('url'); $this->load->library('session'); } public function index() { $this->load->view('sessions/index'); } public function flash_message(){ $this->session->set_flashdata('msg', 'Welcome to CodeIgniter Flash Messages'); redirect(base_url('flash_index')); } }
ที่นี่
- คลาส SessionController ขยาย CI_Controller {…} กำหนดคลาส SessionController และขยายคลาสคอนโทรลเลอร์หลัก
- ฟังก์ชั่นสาธารณะ __construct() {…} กำหนดวิธีคอนสตรัคเตอร์ที่เริ่มต้นคลาสพาเรนต์ และโหลดตัวช่วย url และไลบรารีเซสชัน
- ฟังก์ชั่นสาธารณะ index() {…} กำหนดวิธีดัชนีเซสชั่นที่โหลดมุมมองดัชนีเซสชั่น
- ฟังก์ชั่นสาธารณะ flash_message(){…} กำหนดวิธีข้อความแฟลชซึ่งตั้งค่าข้อมูลแฟลชจากนั้นเปลี่ยนเส้นทางไปยังเส้นทาง flash_index
ตอนนี้เรามาสร้างมุมมองที่จะแสดงค่าของข้อมูลเซสชันกันดีกว่า
สร้างเซสชันไดเรกทอรีใหม่ในแอปพลิเคชัน/มุมมอง
สร้างไฟล์ใหม่index.phpใน application/views/sessions
เพิ่มโค้ดดังต่อไปนี้:
<html> <head> <title>Code Igniter Flash Session</title> </head> <body> <p>The session value of msg is <b> <?=$this->session->userdata('msg');?> </b></p> </body> </html>
ที่นี่
session->userdata('msg');?> ดึงค่าของข้อมูลเซสชันด้วยคีย์ msg และแสดงในเบราว์เซอร์
ตอนนี้เรามาสร้างเส้นทางสำหรับวิธีเซสชันแฟลชของเรากันดีกว่า
เปิด application/config/routes.php
เพิ่มบรรทัดต่อไปนี้
$route['flash_index'] = 'session controller'; $route['flash_message'] = 'session controller/flash_message';
ตอนนี้เรามาเริ่มเซิร์ฟเวอร์ในตัวกันดีกว่า PHP และทดสอบข้อความแฟลชของเรา
เปิดเทอร์มินัล
เรียกใช้คำสั่งต่อไปนี้
cd C:\Sites\ci-app php -S localhost:3000
ที่นี่
คำสั่งดังกล่าวเรียกดูไดเรกทอรีรหัสแอปพลิเคชันและเริ่มเซิร์ฟเวอร์ในตัวบนพอร์ต 3000
หมายเหตุ: เส้นทางแอปพลิเคชันจะต้องตรงกับเส้นทางที่คุณดาวน์โหลด CodeIgniter และคุณสามารถใช้หมายเลขพอร์ตใดก็ได้ที่ว่างบนคอมพิวเตอร์ของคุณ ไม่จำเป็นต้องใช้พอร์ต 3000
โหลด URL ต่อไปนี้ลงในเว็บเบราว์เซอร์ของคุณ: http://localhost:3000/flash_message
คุณจะถูกส่งต่อไปยัง URL ต่อไปนี้ และคุณจะได้รับผลลัพธ์ดังต่อไปนี้: http://localhost:3000/flash_index
คลิกที่ปุ่มรีเฟรชของเว็บเบราว์เซอร์ของคุณหรือกด F5
ตอนนี้คุณจะได้รับผลลัพธ์ต่อไปนี้
การจัดเก็บข้อมูลผู้ใช้ในเซสชัน CI
ตอนนี้เรามาดูตัวอย่างขั้นสูงกว่านี้เล็กน้อย เพื่อให้ง่าย เราจะจำลองการรับรองความถูกต้องของผู้ใช้ และไม่ดำเนินการตรวจสอบบันทึกผู้ใช้ในฐานข้อมูลและรหัสผ่านที่ส่งมาจริง
เริ่มจากเส้นทางกันก่อน
เปิด Routes.php ที่อยู่ใน application/config
เพิ่มเส้นทางต่อไปนี้
$route['login'] = 'sessioncontroller/login'; $route['authenticate'] = 'sessioncontroller/authenticate'; $route['settings'] = 'sessioncontroller/settings'; $route['dashboard'] = 'sessioncontroller/dashboard'; $route['logout'] = 'sessioncontroller/logout';
ที่นี่
- $route['login'] = 'sessioncontroller/login'; กำหนดเส้นทางที่แสดงแบบฟอร์มเข้าสู่ระบบ
- $route['authenticate'] = 'sessioncontroller/authenticate'; กำหนดเส้นทางที่จำลองการเข้าสู่ระบบของผู้ใช้ที่สำเร็จและตั้งค่าข้อมูลการเข้าสู่ระบบเซสชัน
- $route['settings'] = 'sessioncontroller/settings'; กำหนดหน้าป้องกันที่ควรสามารถเข้าถึงได้โดยผู้ใช้ที่เข้าสู่ระบบเท่านั้น
- $route['dashboard'] = 'sessioncontroller/dashboard'; กำหนดหน้าป้องกันที่ควรสามารถเข้าถึงได้โดยผู้ใช้ที่เข้าสู่ระบบเท่านั้น
- $route['logout'] = 'sessioncontroller/logout'; ออกจากระบบผู้ใช้โดยการทำลายข้อมูลเซสชัน
ตอนนี้เรามาอัปเดต SessionController กันดีกว่า
เปิดแอปพลิเคชัน/ตัวควบคุม/SessionController.php
เพิ่มวิธีการดังต่อไปนี้:
public function check_auth($page) { if (!$this->session->userdata('logged_in')) { $this->session->set_flashdata('msg', "You need to be logged in to access the $page page."); redirect('login'); } } public function login() { $this->load->view('sessions/login'); } public function authenticate() { $this->session->set_userdata('username', 'John Doe'); $this->session->set_userdata('logged_in', TRUE); redirect(base_url('dashboard')); } public function dashboard() { $this->check_auth('dashboard'); $this->load->view('sessions/dashboard'); } public function settings() { $this->check_auth('settings'); $this->load->view('sessions/settings'); } public function logout() { $this->session->unset_userdata('username'); $this->session->unset_userdata('logged_in'); redirect(base_url('login')); }
ที่นี่
- public function check_auth($page) {…} กำหนดวิธีการตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่ จากนั้นจึงอนุญาตให้เข้าถึงเพจได้ หากผู้ใช้ไม่ได้เข้าสู่ระบบ ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบพร้อมข้อความแฟลช
- ฟังก์ชั่นสาธารณะเข้าสู่ระบบ () {…} โหลดมุมมองการเข้าสู่ระบบที่อยู่ในไดเรกทอรีเซสชัน
- ฟังก์ชันสาธารณะ authenticate() {…} ตั้งค่าข้อมูลผู้ใช้เซสชันสำหรับคีย์ logged_in และ username หมายเหตุ: เราไม่ได้ตรวจสอบรายละเอียดการเข้าสู่ระบบกับฐานข้อมูล เราเพียงแค่ถือว่ารายละเอียดที่ส่งมานั้นถูกต้อง และตั้งค่าข้อมูลเซสชัน
- ฟังก์ชั่นสาธารณะแดชบอร์ด() {…} โหลดหน้าแดชบอร์ดหลังจากเรียก $this->check_auth('dashboard'); ซึ่งตรวจสอบว่ามีการตั้งค่าคีย์เซสชัน logged_in
- public function settings() {…} โหลดหน้าการตั้งค่าซึ่งได้รับการป้องกันด้วย
- public function logout() {…} ทำลายข้อมูลเซสชันและออกจากระบบผู้ใช้ วิธีการนี้จะเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบด้วย
การดูเซสชัน CodeIgniter
สร้างมุมมองต่อไปนี้ในแอปพลิเคชัน/มุมมอง/เซสชัน
- Dashboard.php
- login.php
- settings.php
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ Dashboard.php
<!DOCTYPE html> <html> <head> <title>Dashboard</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </head> <body> <div class="container"> <div class="column"> <nav class="navbar" role="navigation" aria-label="main navigation"> <div id="navbarBasicExample" class="navbar-menu"> <div class="navbar-start"> <a href="<?= site_url('dashboard')?>" class="navbar-item is-active">Dashboard</a> <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a> </div> <div class="navbar-end"> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link"><?=$this->session->userdata('username');?></a> <div class="navbar-dropdown"> <a class="navbar-item">My Profile</a> <hr class="navbar-divider"> <a class="navbar-item">Sign out</a> </div> </div> </div> </div> </nav> <h3>Welcome Page</h3> </div> </div> </body> </html>
ที่นี่
session->userdata('username');?> แสดงชื่อผู้ใช้ที่เราตั้งไว้ในวิธีการตรวจสอบความถูกต้อง
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ login.php
<!DOCTYPE html> <html> <head> <title>Login</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </head> <body> <div class="container"> <div class="column"> <p><?=$this->session->userdata('msg');?></p> <form method="post" action="<?= site_url('authenticate')?>"> <div class="field"> <label class="label">Username</label> <div class="control"> <input class="input" type="text" placeholder="Text input"> </div> </div> <div class="field"> <label class="label">Password</label> <div class="control"> <input class="input" type="passport" placeholder="Text input"> </div> </div> <div class="field is-grouped"> <div class="control"> <button class="button is-success">Login</button> </div> </div> </form> </div> </div> </body> </html>
ที่นี่
แบบฟอร์มเข้าสู่ระบบจะส่งเพื่อตรวจสอบเส้นทาง
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ settings.php
<!DOCTYPE html> <html> <head> <title>Settings</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </head> <body> <div class="container"> <div class="column"> <nav class="navbar" role="navigation" aria-label="main navigation"> <div id="navbarBasicExample" class="navbar-menu"> <div class="navbar-start"> <a href="<?= site_url('dashboard')?>" class="navbar-item">Dashboard</a> <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a> </div> <div class="navbar-end"> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link">Jim Jones</a> <div class="navbar-dropdown"> <a href="#" class="navbar-item">My Profile</a> <hr class="navbar-divider"> <a href="<?= site_url('logout')?>" class="navbar-item">Sign out</a> </div> </div> </div> </div> </nav> <h3>Settings Page</h3> </div> </div> </body> </html>
แค่นั้นแหละสำหรับมุมมองของเรา ตอนนี้เรามาทดสอบแอปพลิเคชันของเรากัน
ในบทช่วยสอนนี้ เราใช้เว็บเซิร์ฟเวอร์ PHP ในตัว แต่คุณสามารถใช้เว็บเซิร์ฟเวอร์ใดก็ได้ที่รองรับ PHP
เปิดเทอร์มินัล
เรียกใช้คำสั่งต่อไปนี้
cd C:\Sites\ci-app php -S localhost:3000
ที่นี่
คำสั่งดังกล่าวเรียกดูไดเรกทอรีรหัสแอปพลิเคชันและเริ่มเซิร์ฟเวอร์ในตัวบนพอร์ต 3000
หมายเหตุ: เส้นทางแอปพลิเคชันจะต้องตรงกับเส้นทางที่คุณดาวน์โหลด CodeIgniter และคุณสามารถใช้หมายเลขพอร์ตใดก็ได้ที่ว่างบนคอมพิวเตอร์ของคุณ ไม่จำเป็นต้องใช้พอร์ต 3000
เปิด URL ต่อไปนี้ในเว็บเบราว์เซอร์ของคุณ: http://localhost:3000/dashboard
คุณจะถูกส่งต่อไปยังหน้าต่อไป
คลิกที่ปุ่มเข้าสู่ระบบ
คุณจะเห็นผลลัพธ์ดังต่อไปนี้
หลังจากที่เราเข้าสู่ระบบแล้ว เราก็สามารถดูข้อมูลเซสชันได้แล้ว
สรุป
ในบทช่วยสอนนี้ คุณได้เรียนรู้พื้นฐานของไลบรารีเซสชัน CodeIgniter และเรียนรู้วิธีใช้มันเพื่อจัดเก็บข้อมูลชั่วคราวเป็นข้อความแฟลช และวิธีใช้จัดเก็บข้อมูลถาวรมากขึ้น เช่น ข้อมูลการเข้าสู่ระบบของผู้ใช้