วิธีการตั้งค่าเซสชันใน 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

คลิกที่ปุ่มเข้าสู่ระบบ

คุณจะเห็นผลลัพธ์ดังต่อไปนี้

การดูเซสชัน CodeIgniter

หลังจากที่เราเข้าสู่ระบบแล้ว เราก็สามารถดูข้อมูลเซสชันได้แล้ว

สรุป

ในบทช่วยสอนนี้ คุณได้เรียนรู้พื้นฐานของไลบรารีเซสชัน CodeIgniter และเรียนรู้วิธีใช้มันเพื่อจัดเก็บข้อมูลชั่วคราวเป็นข้อความแฟลช และวิธีใช้จัดเก็บข้อมูลถาวรมากขึ้น เช่น ข้อมูลการเข้าสู่ระบบของผู้ใช้