06/04/2021, 14:49

Bài 5: Load Library Session Trong Codeigniter - Lập trình Codeigniter 3x

Trong bài này bạn sẽ được học: Giới thiệu library session. Các phương thức làm việc của session. Hàm khởi tạo, sử dụng & hủy session. Các vấn đề mở rộng trong session. Lưu ý: Tôi sử dụng Codeigniter version 2.1.4. Tên folder của tôi là citest cho bài viết này. Đây là một thư viện khá ...


Đây là một thư viện khá là quan trọng , trong framework CI (Codeigniter) . Bởi vì chúng ta sẽ sử dụng nó cho rất là nhiều công việc như, quản lý phiên làm việc trong các vấn đề thao tác với login..vvv, sử dụng thao tác session trong giỏ hàng, nếu bạn chưa biết session là gì thì xem mời xem lại bài Session.

Thế nào là session

Trong CI nó được viết dưới dạng class hay còn gọi là library session, điểm nhấn là nó không sử dụng php thuần trong các thao tác. Nó đươc xây dựng dựa trên một cái khóa đặc biệt hay còn gọi là Encryption key để tăng tính tương tác và cấp độ bảo mật ứng dụng, để có thể khai báo library session và gọi các phương thức bên trong nó, bạn cần phải vào thư mục file config, tìm file config.php, ctrl+f gõ vào encryption key.

$config['encryption_key'] = '';
Để bắt đầu thao tác với session, ngay phần dấu ” bạn có thể điền bất cứ gì cũng được. ví dụ ở đây tôi điền vào ký tự gì đó chẳng hạn. Xem như tôi đã cấu hình thành công key đặc biệt trong session.
$config['encryption_key'] = 'Zaidap.com.net';
Lưu ý: Đây là bước bắt buộc, nếu bạn để trống và gọi library session ra để sử dụng sẽ nhận ngay thông báo lỗi như sau.

In order to use the Session class you are required to set an encryption key in your config file.

Load library session

Để có thể sử dụng library session đầu tiên chúng ta phải load nó vào controller. ví dụ ở đây tôi khởi tạo controller demo và action sẽ là index. Ngay tại hàm constructor tôi sẽ tiến hành gọi nó ra với cú pháp như sau.

$this->load->library("session");
Cấu trúc code:
class Demo extends CI_Controller{
    public function __construct(){
        parent::__construct();
        $this->load->library("session");
    }
 
    public function index(){
 
    }
}
Để sử dụng nó chúng ta sẽ dùng phương thức $this->session. tương tự như cách gọi Model.

Hàm Khởi tạo Session

Để có thể khởi tạo session một cách dễ dàng chúng ta sẽ sử dụng phương thức

$this->session->set_userdata("ten", "gia tri")
dữ liệu truyền vào đây có hai lựa chọn, một là truyền vào tên, hai là truyền vào giá trị của nó là gì. Ngoài ra chúng ta cũng có thể khởi tạo chúng theo dạng array (Mảng).
$data=array(
            "username" => "Kaito",
            "email" => "codephp2013@gmail.com",
            "website" => "Zaidap.com.net",
            "gender" => "Male",
        );
Và lúc này tôi đang có 4 giá trị để khởi tạo tòan bộ giá trị tôi dùng cú pháp sau.
$this->session->set_userdata($data);
Khởi tạo xong rồi, muốn sử dụng thì phải làm sao, cũng tương tự như phương thức set_userdata tôi có cú pháp sử dụng session như sau.Tại đây tôi truyền vào tên của session là username.
$this->session->userdata("username")

Hàm hủy session

Hủy session có 2 cách tất cả. để hủy một session được chỉ định bất kì ta dùng cú pháp sau,ở đây tôi hủy session username.

$this->session->unset_data("username")
và cũng giống như cách khởi tạo session với array, tôi cũng có thể hủy session với cú pháp như sau.
$item = array('username' => '', 'email' => '', 'website' => '',);
$this->session->unset_userdata($items);
Với thao tác này tôi có thể hủy toàn bộ session, nhưng làm thế thì quá dài dòng, bản thân CI cũng đã hỗ trợ một hàm hủy toàn bộ session chỉ trong một nốt nhạc như sau.Cũng giống như hàm hủy session trong PHP thuần thôi phải không nào.
$this->session->sess_destroy();

Thực hành Session

Tôi sẽ có một ví dụ nhỏ để cho các bạn hình dung được quy trình làm việc của nó diễn ra như thế nào. Tại thư mục application/controller tôi tạo một file có tên là demo.php, vì ví dụ có sử dụng hàm base_url, redirect, nên ngay tại constructor tôi tiến hành gọi helper URL & library Session vào controller.

class Demo extends CI_Controller{
    public function __construct(){
        parent::__construct();
        $this->load->helper("url");
        $this->load->library("session");
    }
 
    public function index(){
        $data=array(
            "username" => "Kaito",
            "email" => "codephp2013@gmail.com",
            "website" => "Zaidap.com.net",
            "gender" => "Male",
        );
        $this->session->set_userdata($data);
        redirect(base_url(),"index.php/demo/index2");
    }
}
Ngay tại action index tôi khai báo biến $data dưới dạng array, tôi sẽ sử dụng lại $data mà tôi khai báo ở phần lý thuyết. Để khởi tạo session, tôi dùng phương thức set_userdata($data), tôi khởi tạo toàn bộ 4 giá trị trên. để kiểm tra xem code của tôi có đúng không, tôi sẽ test session ở action index2. Như vậy chúng ta sẽ tiến hành test bằng cách sau, truy cập vào đường link localhost/citest/index.php/demo/index nếu trình duyệt tự động chuyển sang index2 thì chúng ta đã khai báo và sử dụng session thành công, để việc test tốt hơn ngay tại index2 tôi sẽ tiến hành show từng session ra để show session ra ta có phương thức userdata(“ten session”) , tôi sử dụng nội suy biến gọi $tenbien trong dấu “”.
public function index2(){
        $user=$this->session->userdata("username");
        $level=$this->session->userdata("level");
        $email=$this->session->userdata("email");
        echo "Username: $user, Email: $email, Level: $level";
  }
Nếu màn hình chuyển sang link localhost/citest/index.php/demo/index2 và xuất ra kết quả như sau thì xem như các bạn đã khởi tạo và sử dụng session thành công.
Username: kaito, Website: Zaidap.com.net, Email: codephp2013@gmail.com

Vấn đề đặt ra ở đây là, nếu tôi muốn lấy tất cả giá trị có trong session thì phải làm sao ? xin thưa rằng CI cũng đã cung cấp một hàm dùng để thao tác yêu cầu mà tôi vừa đưa ra, tại đây tôi sử dụng phương thức all_data tôi có cú pháp như sau.
public function index2(){
        $user=$this->session->userdata("username");
        $level=$this->session->userdata("level");
        $email=$this->session->userdata("email");
        echo "Username: $user, Email: $email, Level: $level";
        $data=$this->session->all_userdata();
        echo "<pre>";
        print_r($data);
        echo "</pre>";   
}
"; } Tôi in dữ liệu trong cập thẻ pre, nếu màn hình trả về kết quả như sau xem như các bạn đã thành công trong việc lấy toàn bộ giá trị trong session.
Array
(
[session_id] => cf7966232a5fdb726653e240ef5cb8d4
[ip_address] => 127.0.0.1
[user_agent] => Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
[last_activity] => 1395055268
[user_data] =>
[username] => kaito
[website] => Zaidap.com.net
[email] => codephp2013@gmail.com
[gender] => male
)

Sau khi khởi tạo & sử dụng session, tôi tiến hành hủy session như thế nào? rất là đơn giản chỉ với một dòng code bài toán được giai quyết ngay lập tức. Tôi tạo thêm một action có tên là index3 và tôi sẽ hủy toàn bộ session, để kiểm tra tôi echo câu thông báo “Huy session thanh cong” chạy link localhost/citest/index.php/demo/index3 để kiểm tra.
public function index3(){
         $this->session->sess_destroy();
         echo "Huy session thanh cong.";
     }
Nếu màn hình trả về kết quả sau xem như bạn đã hủy session thành công.
Huy session thanh cong.

Các vấn đề mở rộng trong session

Cũng giống như các framework khác đều tồn tại một khái niệm gọi là flashdata nó có nhiệm vụ gì, bản chất nó là một dạng dữ liệu và nó không tồn tại lâu dài, nó chỉ xuất hiện ra một lần và sau đó nó sẽ bị hủy, sử dụng nó trong thực tế như thế nào, nó hay được sử dụng trong các phiên đăng nhập, chẳng hạn như đăng nhập thành công sẽ có thông báo trả về ngay trên trang bạn đang truy cập, và thông báo đó sẽ biến mất nếu chung ta F5 trình duyệt.

Để khởi tạo flashdata tôi có cú pháp như sau.

$this->session->set_flashdata("ten", "gia tri");
Sử dụng nó cũng tương tư như sử dụng session thôi.
$this->session->flashdata(ten);
Tên của flashdata luôn phải bắt đầu với key là flash_, để cho các bạn hiểu rõ hơn về nó, tôi sẽ có một ví dụ nhỏ như sau. Tôi sẽ xuất ra câu thông báo “Khoi tao session thanh cong” ngay khi tôi vừa chuyển sang action index2. tôi khởi tạo flashdata ở action index tôi đặt tên là flash_open, ở tại action index2 tôi tiến hành show nó ra bằng phương thức flashdata(“flash_open”) tương ứng với tên flash tôi khai bảo ở action index.
public function index(){
        $data=array(
            "username" => "Kaito",
            "email" => "codephp2013@gmail.com",
            "website" => "Zaidap.com.net",
            "gender" => "Male",
        );
        $this->session->set_userdata($data);
        $this->session->set_flashdata("flash_open", "Khoi tao session thanh cong");
        redirect(base_url(),"index.php/demo/index2");
    }
 
    public function index2(){
         echo $this->session->flashdata("flash_open");
         $user=$this->session->userdata("username");
         $level=$this->session->userdata("level");
         $email=$this->session->userdata("email");
         echo "Username: $user, Email: $email, Level: $level";
         $data=$this->session->all_data();
         echo "<pre>";
         print_r($data);
         echo "</pre>";
}
"; } Nếu kết quả màn hình trả về như sau, thì các bạn đã thao tác thành công với hàm flashdata. Tôi F5 lại trình duyệt và ngay lập tức cái flashdata của tôi đã bị hủy, suy ra flashdata thường dùng trong các câu thông báo trả về cho người dùng họ đã thao tác thành công một điều gì đó.

Khoi tao session thanh cong
[flash:old:flash_open] => Khoi tao session thanh cong

Vấn đề mà tôi muốn các bạn chú ý nhiều nhất chính là việc lưu trữ session trong database, có nghĩa là chúng ta sẽ tạo ra môt table dùng để chứa các session, giả sử tôi đang làm việc với giỏ hàng, và tôi cần lưu trữ hàng ngàn session ứng với từng sản phẩm, mà một khi session đã quá tải thì nó không thể lưu trữ nhiều hơn được nữa, nắm bắt được yêu cầu của lập trình viên, CI cũng hỗ trợ chúng ta giải quyết bài toàn này một cách dễ dàng. Chúng ta sẽ phải tạo ra một table tên là ci_sessions với các giá trị field như sau, đoạn code này trong user guide của CI có cung cấp sẵn nha các bạn, nhiệm vụ của table này là chứa tất cả dữ liệu mà chúng ta cần chứa, nó sẽ lưu trữ tất cả trong field user_data, nó lấy mọi giá trị của session sau đó convert sang json hoặc một cái chuẩn nào đó của CI, sau đó nó sẽ lưu trữ dữ liệu dưới dạng là text.
CREATE TABLE IF NOT EXISTS  `ci_sessions` (
    session_id varchar(40) DEFAULT '0' NOT NULL,
    ip_address varchar(45) DEFAULT '0' NOT NULL,
    user_agent varchar(120) NOT NULL,
    last_activity int(10) unsigned DEFAULT 0 NOT NULL,
    user_data text NOT NULL,
    PRIMARY KEY (session_id),
    KEY `last_activity_idx` (`last_activity`)
);
Ngoài việc tạo thêm table cho database, chúng ta còn phải cấu hình trong file config.php một vài thông tin như sau, bật tính năng sử dụng thao tác database trong session.
$config['sess_use_database'] = TRUE;
Và định nghĩa table name cho nó là ci_sessions.
$config['sess_table_name'] = 'ci_sessions';
Thực tế là không nên thao tác database trong session nha các bạn, nó khiến cho hệ thống của chúng ta bị nghẽn vì phải xử lý thao tác đọc, nhả, nạp dữ liệu quá nhiều, CI chỉ đưa ra giải pháp này cho chúng ta tiện việc thao tác với session hơn thôi. Tôi chỉ sử dụng nó khi nào phải làm việc với giỏ hàng, lưu trữ các thông tin của từng sản phẩm.

Kết

Hy vọng qua bài viết này, các bạn đã có thể hiểu rõ hơn về quy trình làm việc của library session được cung cấp từ CI, bài viết này có thể sẽ dài hơn và sẽ có một vài ví dụ thực tế nửa, nhưng tôi nghĩ nhiêu đây là quá đủ để các bạn có thể control được session một cách dễ dàng. Bài tiếp theo chúng ta sẽ tìm hiểu database trong CI

Trịnh Tiến Mạnh

27 chủ đề

6824 bài viết

Cùng chủ đề
0