Session trong PHP

Session trong PHP nói về sử dụng session trong lập trình php – vùng nhớ trên server dùng để chia sẻ biến giữa các trang php trong website.


Session trong PHP


Giới thiệu về session trong PHP

Session trong PHP là nơi chứa các biến có thể dùng chung giữa nhiều trang .php. Nghĩa là trong một file .php nào đó bạn lưu một giá trị vào session thì các trang .php khác cũng có thể truy xuất được giá trị này.

Session là vùng nhớ nằm trên server, đây là nơi bạn dùng để nơi chia sẻ data giữa các trang php trong website.  Vì công dụng của nó như vừa nên ở trên: một trang php lưu giá trị vào thì các trang khác cũng dùng được.

Session khác với cookie ở chỗ vị trí của nó là “trên server”. Cookie cũng là nơi chia sẽ data giữa các trang php nhưng vị trí lưu là trong trình duyệt (ở phía client).

Mỗi user request lên server sẽ được tạo 1 vùng session riêng để lưu các giá trị mà không ảnh hưởng đến user khác. Nghĩa là hiện tại nếu có 100 xem website thì sẽ có 100 vùng session dành cho 100 user đó. Mặc định, session của mỗi user tồn tại trên server trong thời gian 1440s kể từ lần cuối cùng mà user request lên server.

Khởi động session

Dùng hàm sau ở đầu trang php để khởi tạo session

<?php session_start() ; ?>

Có dùng hàm này thì bạn mới có thể lưu giá trị vào session hoặc lấy ra giá trị từ session mới được.

Lưu một giá trị vào session

Để lưu một giá trị vào session thì dùng cú pháp $_SESSION[‘tên’] = giá trị;  Ví dụ:

<?php //test1.php
  session_start();
  $_SESSION['username'] = 'teonv'; 
  $_SESSION['user'] = ['id'=>2, 'email'=>'teo@abc.vn', 'pass'=>'123'];
?>

Một khi đã lưu vào session, các trang php khác có thể truy xuất được các giá trị đã lưu miển đường quá hạn session (1440s) và đừng đóng tag của trinh duyệt.

Lấy ra một giá trị từ session

Để lấy ra một giá trị từ session thì dùng cú pháp $_SESSION[‘tên’];  Ví dụ:

<?php //test2.php
    session_start();
    $un = $_SESSION['username'];
    $user = $_SESSION['user'];
    echo $un, "<br>"; // teonv
    var_export($user);//[id=>2, email=>'teo@abc.vn', pass=>'123']
?>

Hủy bỏ session

Để hủy session của 1 user, bạn  dùng hàm session_destroy();  Ví dụ

<?php  //thoat.php
  session_start();
  session_destroy() ; 
?>

Khi 1 user  nào đó request trang thoat.php như vú dụ trên thì vùng session của user đó sẽ bị hủy, các biến session trong đó bị xóa. Còn session của các user khác không ảnh hưởng gì

Lấy id session của user

Mỗi vùng session của user được php cấp phát một giá trị id lúc chạy hàm session_start. Để lấy giá trị id này thì bạn dùng hàm session_id(); 

<?php //test3.php
  session_start();
  // …
  echo $id = session_id() ; //bot567faifjbhq4hr1l7cpsuqg
?>

Giá trị session_id có thể xem trong trình duyệt cũng được. Vào Developer Toolbox => tab Application => chọn mục Cookies => chọn domain của website => sẽ thấy biến cookie có tên PHPSESSID, giá trị của biến này là session_id. (hình dưới)

Phát sinh session id mới

Khi cần phát sinh id khác cho vùng nhớ session, thì dùng hàm  session_regenerate_id . Ví dụ

<?php //test3.php
  session_start();
  // …
  echo $id = session_id() ; //g9comlnurf5t4fvvb1vrh05uuk
  echo "<br>";
  session_regenerate_id();
  echo $id = session_id() ; //3jdghs083o45282b5lnonq958u
?>

Phát sinh lại id để tăng thêm tính bảo mặt cho website, tránh tình trạng iuser bị chôm id bởi hacker, nhờ đó bảo vệ người dùng thêm an toàn. Nhất là nhữnng website đòi hỏi tính bảo mật cao.

Start session 2 lần bị lỗi

Không được start session từ 2 lần trở lên, chỉ start đúng một lần trong trang web thôi . Đây là lỗi bạn thường hay gặp khi dùng session: start nhiều lần hoặc không start lần nào.

Lỗi start 2 lần session

– Trong cùng 1 trang

<?php  //test5.php
  session_start();
  //...
  //...
  session_start();
?>

– Start 1 lần ở trang chính và một lần ở trang con

<?php  //test5.php
  session_start();
  //...
  include "sanpham.php";
?>
<?php  //sanpham.php
   session_start();
   //…
?>

Lỗi dùng session mà không start

<?php  //doipass.php
  $un  = $_SESSION['username'];  //lỗi
?>

Kiểm tra tồn tại session start chưa

Session start nhiều lần bị lỗi, để an toàn bạn có thể dùng hàm session_start xem có start hay chưa. Nếu chưa thì mới start, còn nếu session đã start rồi thì thôi. Xem cú pháp như sau:

if (session_status() === PHP_SESSION_NONE) session_start();

Tham khảo thêm