CODEIGNITER 3X
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Bài 5: Load Library Session Trong Codeigniter

Trong bài này bạn sẽ được học:

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
  1. Giới thiệu library session.
  2. Các phương thức làm việc của session.
  3. Hàm khởi tạo, sử dụng & hủy session.
  4. 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á 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'] = 'freetuts.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" => "freetuts.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" => "freetuts.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: freetuts.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] => freetuts.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" => "freetuts.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

Cùng chuyên mục:

Chia sẻ theme web blog mobile đơn giản (Theme FMB1)

Chia sẻ theme web blog mobile đơn giản (Theme FMB1)

Freetuts Mobile Blog được code trên nền tảng PHP và MySQL, sử dụng Codeigniter Framework.

Bài 19: Rewrite URL trong Codeigniter

Bài 19: Rewrite URL trong Codeigniter

Sau một khoảng thời gian không đụng tới Codeigniter thì hôm nay lại có dịp…

Tìm hiểu quy trình load model trong codeigniter

Tìm hiểu quy trình load model trong codeigniter

Việc load model rất quen thuộc với những bạn sử dụng framwork codeigniter nhưng đôi…

Tự tạo thư viện load widget trong codeigniter

Tự tạo thư viện load widget trong codeigniter

Như các bạn biết mặc định hệ thống của Codeigniter hoạt động theo mô hình…

Hướng dẫn custom bộ core codeigniter

Hướng dẫn custom bộ core codeigniter

Có khi nào bạn đặt câu hỏi có nên sửa các file nằm trong bộ…

Bài 18: Tìm Hiểu Library Shopping Cart trong Codeigniter

Bài 18: Tìm Hiểu Library Shopping Cart trong Codeigniter

Chào mừng các bạn đã quay trở lại freetuts.net. Như vậy ở bài trước chúng…

Bài 17: Xây dựng crud add - update - edit user

Bài 17: Xây dựng crud add - update - edit user

Crud là một thuật ngữ không hề xa lạ với dân lập trình, nó là…

Bài 16: Kỹ thuật master layout trong codeigniter

Bài 16: Kỹ thuật master layout trong codeigniter

Đây là một vấn đề mở rộng mà CI không đề cập trong user guide,…

Bài 15: Tìm Hiểu Helper Language Trong Codeigniter

Bài 15: Tìm Hiểu Helper Language Trong Codeigniter

Trong bài viết này , chúng ta chỉ tìm hiểu ở khái niệm cơ bản…

Bài 14: Tìm Hiểu Helper Text Trong Codeigniter

Bài 14: Tìm Hiểu Helper Text Trong Codeigniter

Nhìn tiêu đề, hẳn các bạn đã đoán ra hôm nay chúng ta sẽ tìm…

Bài 13: Tìm Hiểu Helper Date Trong Codeigniter

Bài 13: Tìm Hiểu Helper Date Trong Codeigniter

Hôm nay chúng ta sẽ tiếp tục tìm hiểu sâu hơn về các helper mà…

Bài 12: Đóng dấu watermark image trong codeigniter

Bài 12: Đóng dấu watermark image trong codeigniter

Đầu tiên xin gửi lời cảm ơn các bạn đã quan tâm và theo dõi…

Bài 11: Tìm Hiểu Library Image Trong Codeigniter

Bài 11: Tìm Hiểu Library Image Trong Codeigniter

Kết thúc bài trước, chúng ta đã hoàn thành khá xuất sắc phần upload hình…

Bài 10: Tìm hiểu library upload trong codeigniter

Bài 10: Tìm hiểu library upload trong codeigniter

Chào mừng các bạn đã quay trở lại freetuts.net, đã lâu rồi tôi không viết…

Bài 9: Tìm Hiểu Library Form Validation

Bài 9: Tìm Hiểu Library Form Validation

Cho tới bài viết này, chắc hẵn các bạn đều đã biết rõ cách load…

Bài 8: Tìm hiểu Helper Url Và Form Trong Codeigniter

Bài 8: Tìm hiểu Helper Url Và Form Trong Codeigniter

Trong Codeigniter Framework nó chia ra 2 khái niệm đó là helper & library, vậy…

Bài 7: Load Library Pagination Trong Codeigniter

Bài 7: Load Library Pagination Trong Codeigniter

Đây là một library cũng khá là phổ biến, hay được sử dụng trong quá…

Bài 6: Load Library Database Trong Codeigniter

Bài 6: Load Library Database Trong Codeigniter

Tôi sẽ không giới thiệu về library này mà sẽ xoáy sâu vào các thao…

Bài 4: Load Model Trong Codeigniter

Bài 4: Load Model Trong Codeigniter

Trong Codeigniter để kết nối với Database chúng ta phải cấu hình thông tin cho…

Bài 3: Load View Trong Codeigniter

Bài 3: Load View Trong Codeigniter

Trong Codeigniter tất cả các Views đều được đặt trong thư mục application/views. Các bạn…

Top