Làm việc với cookie và session


tự học php nâng cao 22/07/2015 Cùng chuyên mục

PHP giúp cho việc tương tác giữa máy chủ (server site) và máy khách (client request) thông qua cookie và session. Session được lưu trữ trên server còn cookie được lưu trữ tại tại máy khách thông qua trình duyệt (browser).

COOKIE

Cookie cho phép ứng dụng web của bạn lưu trữ một lượng nhỏ kiểu văn bản(4 - 6KB)trên trình duyệt (browser) của máy khách (client). Phần lớn công dụng của cookie là để lưu giữ trạng thái của phiên làm việc (session), trao đổi dữ liệu giữa các trang ( các trang trong tương tác nhau trong 1 hệ thống website) ngoài ra nó còn được sử dụng cho việc truy xuất dữ liệu từ file cookie trên máy khách.

Cookie được thiết lập bởi máy chủ thông qua yêu cầu của máy khách và sau đó lưu trữ ở máy khách thông qua phản hồi từ máy chủ. Lưu trữ dữ liệu bằng cookie không phải là một cơ chế an toàn, dữ liệu trong cookie có thể thấy và chỉnh sửa thông qua trình duyệt của người dùng.

Sử dụng hàm setcookie() để tạo một cookie.
Ví dụ: tạo một cookie có tên là page_view và giá trị của nó là 1

<?php
	setcookie("page_view","1");
?>

Bây giờ, nếu bạn có thắc mắc cookie đã tạo để xem thì làm thế nào? Với trình duyệt chrome - bạn nhấn vào nút có biểu tượng tờ giấy trên thanh địa chỉ, tiếp đến bạn nhấn vào "Hiển thị cookie và dữ liệu trang web".

Có thể đặt thời hạn cho cookie - sau thời hạn (còn gọi là thời hạn sống - expire time ) cookie sẽ bị hủy, file cookie sẽ bị xóa đi.
Ví dụ: tạo cookie có tên là page_view - giá trị 1, có thời hạn là 300 giây = 5 phút

<?php
	setcookie("page_view","1",time()+300);
?>

Hàm setcookie() đầy đủ:

setcookie(string $name, string $value, int $expire = 0, string $path, string $domain, 
bool $secure = false, bool httponly = false ):

Trong đó:
- Giá trị trả về: TRUE nếu tạo thành công - FALSE nếu không tạo được cookie
- các tham số:
+ name: tên của cookie
+ value: giá trị của cookie
+ expire: thời hạn - mặc định là 0 - nghĩa là sẽ xóa khi rời khỏi trang
+ path: đường dẫn của tên miền mà cookie có hiệu lực. Nếu đặt là '/' cookie sẽ có hiệu lực trong mọi đường dẫn của tên miền. Nếu đặt là '/foo/' cookie chỉ có hiệu lực với đường dẫn '/foo/' và tất cả các đường dẫn thứ cấp khác
như '/foo/bar/'. Mặc định, cookie có hiệu lực tại đường dẫn đang truy cập.
+ domain: Tên miền mà cookie có hiệu lực như "example.com"
+ secure: nếu đặt là TRUE cookie chỉ được truyền đi bởi giao thức https
+ httponly: nếu đặt là TRUE cookie chỉ được truyền đi bởi giao thức http, có nghĩa là cookie không thể truy cập bởi 1 script như javascript, có tác dụng trong việc chống tấn công XSS.

Lưu ý: Việc tạo cookie - tại máy client - ngay lần đầu tiên lệnh tạo cookie tại server hoặc cookie tại client đã bị xóa mà bạn truy cập tới biến $_COOKIE["cookie_name"] sẽ bị lỗi (vì cookie chưa được tạo - hàm tạo cookie sẽ tạo 1 thông tin đưa vào respone header - trình duyệt đọc thông tin này mới tạo cookie - tương tự trình duyệt gửi request header thì trình thông dịch PHP mới nhận được thông tin cookie) - trước khi sử dụng cookie tại máy chủ bạn cần có lệnh kiểm tra xem có tồn tại cookie hay không rồi mới truy xuất.

//nếu đã có cookie thì thực hiện các thao tác
if(!isset($_COOKIE["your_cookie_name"))
{
	print "Lỗi! bạn kiểm tra trình duyệt có được phép tạo cookie hay không?";
	exit();
}
else
{
	$my_data = $_COOKIE["your_cookie_name"];
}
//code run

TRUY CẬP DỮ LIỆU TỪ COOKIE:

Dữ liệu cookie được gửi lên server thông qua request header. Trình thông dịch PHP sẽ tách dữ liệu này và đưa vào mảng $_COOKIE. Mảng $_COOKIE là một trong các biến toàn cục của php nên bạn có thể truy xuất ở bất cứ đâu.
Ví dụ: in ra dữ liệu cookie có tên là page_view

<?php
	//tạo cookie có tên là page_view, giá trị 1, thời hạn 300 giây
	setcookie("page_view","1",time()+300);
	//xuất ra giá trị của cookie
	echo "Lượt xem: {$_COOKIE['page_view']}";
?>

Đoạn code trên sẽ có lỗi nếu như trên server không nhận được dữ liệu hoặc cookie đã hết hạn, sử dùng hàm isset() để tránh lỗi trên:

<?php
	//tạo cookie có tên là page_view, giá trị 1, thời hạn 300 giây
	setcookie("page_view","1",time()+300);
	//xuất ra giá trị của cookie
	if(isset($_COOKIE["page_view"]))
	{
		echo "Lượt xem: $_COOKIE["page_view"]";
		//đặt giá trị cho cookie có tên là page_view giá trị là 10
		$_COOKIE["page_view"] = 10;
	}
?>

HỦY COOKIE:

Để hủy một cookie, sử dụng hàm setcookie với thiết lập về thời hạn là âm.

<?php
	setcookie("page_view",false,-3600);
?>

SESSION (PHIÊN LÀM VIỆC):

HTTP là một giao thức trạng thái, server sẽ không biết được các request giống nhau của các người dùng khác nhau - nhưng mỗi người dùng thì lại có yêu cầu server trả về một respone đúng theo yêu cầu của mình (request là giống nhưng respone phải khác). Session (phiên làm việc) được tạo ra để phân chia ra các trạng thái khác nhau của request. Quản lý session thông qua session id - có thể được gửi từ cookie hoặc nhận được từ form.

Để tạo ra một session, sử dụng hàm session_start() - php sẽ tự sinh ra một session id hoặc tạo một session được nhận từ cookie, form

<?php
	//khởi tạo phiên làm việc
	session_start();
	// truy cập thông qua biến $id nhận được từ cookie hoặc form 
	$id = "14dnh1414sbrb23984sg";
	session_id($id);
	// để lưu trữ dữ liệu session id - hàm session_id() lẩy ra session id
	$id = session_id();
?>

Một file có tên là có dạng: sess_<session id> sẽ được tạo trên thư mục, thường là tmp. Sử dụng hàm session_save_path() để lấy ra đường dẫn tới thư mục lưu trữ file session hoặc thiết lập đường dẫn mới.

Ví dụ: Lấy ra đường dẫn lưu trữ file session mặc định và thiết lập đường dẫn mới

<?php
	//khởi tạo phiên làm việc
	session_start();
	// lấy ra đường dẫn thư mục chứa file session
	echo 'Duong dan luu tru mac dinh: ',session_save_path();
	//thiết lập đường dẫn mới
	$path = 'D:\xampp/new_path';
	session_save_path($path);
	// lấy ra đường dẫn thư mục chứa file session
	echo 'Duong dan luu tru moi',session_save_path();
?>

TRUY XUẤT TỚI SESSION:

Trước khi truy xuất tới 1 session, cần gọi hàm session_start() trước. Tạo một biến session bằng cú pháp: $_SESSION["ten_bien"] = value - cũng như $_COOKIE, $_SESSION là một mảng toàn cục.

<?php
	//khởi tạo phiên làm việc
	session_start();
	//tạo 1 biến $_SESSION["page_view"] (sẽ được lưu trữ trong file session)
	$_SESSION["page_view"] = 1;
	//xuất ra giá trị
	echo 'Page view: ',$_SESSION["page_view"],'<br>';
	$arr = array(1,2,3);
	$country =  array("Viet Nam", "My", "Phap");
	//biến session dạng mảng
	$_SESSION["arr"] = $arr;
	$_SESSION["quoc_gia"] = $country;
	//in ra biến session dạng mảng
	foreach ($_SESSION["arr"] as $key)
	{
		echo 'Mang arr: ',$key,"<br>";
	}
	foreach ($_SESSION["quoc_gia"] as $key)
	{ 
		echo 'Nuoc: ',$key,"<br>";
	}
?>

Lưu ý: gọi phương thức session_start() nếu đã gọi và đã tạo biến session mà bạn gọi phương thức này lần nữa sẽ bị báo lỗi session đã được sử dụng. Để khắc phục lỗi này bạn cần kiểm tra xem đã gọi phương thức session_start() và lưu trữ dữ liệu hay chưa - kiểm tra bằng hàm empty() cho mảng $_SESSION hoặc cho một biến cụ thể bằng hàm isset():

if(empty($_SESSION))
{
	session_start();
}
session_id();
//code run - hoặc
if(!isset($_SESSION["your_key"]))
{
	session_start();
}
session_id();
//code run

 Hủy một session:

Sử dụng hàm session_destroy() - để hủy một session ( xóa file session), nhưng không hủy giá trị các biến
Sử dụng hàm session_unset() - để xóa tất cả các biến đã lưu trong session

<?php
	//khởi tạo phiên làm việc
	session_start();
	//tạo 1 biến $_SESSION["page_view"] (sẽ được lưu trữ trong file session)
	$_SESSION["page_view"] = 1;
	//xem cấu trúc mảng $_SESSION trước khi hủy các biến
	print_r($_SESSION);
	//xuất ra giá trị
	echo 'Page view: ',$_SESSION["page_view"],'<br>';	
	//hủy các biến session
	session_unset();
	//xem cấu trúc mảng $_SESSION sau khi hủy các biến
	print_r($_SESSION);	
?>

Tương tác giữa session và cookie

Như đã viết ở trên cookie lưu trữ session_id để giữ việc tương tác giữa máy client và server. Để làm việc này, tạo 1 cookie có 1 khoảng thời hạn nào đó ( 3 ngày hoặc khoảng 2 tiếng ) - giá trị lưu trữ là id của session - trên server, session sẽ truy cập thông qua giá trị id gửi đi từ cookie.

<?php	
	//khởi tạo phiên làm việc
	session_start();	
	//tạo 1 biến $_SESSION["page_view"] (sẽ được lưu trữ trong file session)
	$_SESSION["page_view"] = 1;
	//nếu chưa có cookie thì tạo cookie mới
	if(!isset($_COOKIE["client"]))
	{
		//tạo cookie có tên là client, giá trị là session_id, thời hạn 900 giây
		setcookie("client",session_id(),time()+900);
	}	
	//lấy session_id từ cookie
    $id = (isset($_COOKIE["client"])) ? $_COOKIE["client"] : NULL;
	echo "session id: ".$id."<br>";
	//sử dụng session id nhận được từ cookie
	if(!empty($id))
	{
		session_id($id);
	}
	//tăng page_view lên 1 đơn vị
	$_SESSION["page_view"] += 1;
	echo "page_view",$_SESSION["page_view"];
?>

 TỔNG KẾT

Cookie và session là 2 đối tượng được sử dụng nhiều khi làm việc với php. Các bạn
cần nắm vững:
- Cách tạo một cookie và session
- Phân biệt được sự khác nhau giữa cookie và session
- Biết khi nào sử dụng cookie, khi nào sử dụng session
- Biết cách truy xuất và hủy bỏ một cookie, session và đặc biệt là thời hạn sống của chúng.




Bình luận:


php