Bài 5: Load Library Session Trong Codeigniter
Trong bài này bạn sẽ được học:
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thứ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á 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'] = '';
$config['encryption_key'] = 'freetuts.net';
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");
class Demo extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("session"); } public function index(){ } }
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")
$data=array( "username" => "Kaito", "email" => "codephp2013@gmail.com", "website" => "freetuts.net", "gender" => "Male", );
$this->session->set_userdata($data);
$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")
$item = array('username' => '', 'email' => '', 'website' => '',); $this->session->unset_userdata($items);
$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"); } }
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"; }
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>"; }
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."; }
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");
$this->session->flashdata(ten);
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>"; }
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`) );
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';
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