Session trong PHP

Session trong PHP

Session (phiên) là một cách để lưu trữ thông tin (trong các biến) sẽ được sử dụng trên nhiều trang.

Không giống như cookie, session không được lưu trữ trên máy tính của người dùng.

Session trong PHP là gì?

Khi bạn truy cập ứng dụng web bằng trình duyệt rồi thực hiện một số thay đổi nào đó và sau đó bạn đóng nó lại. Điều này giống như một session (phiên).

Một session tạo một file trong một thư mục tạm trên máy chủ nơi các biến session đã đăng ký và giá trị của chúng được lưu trữ ở đó. Dữ liệu này sẽ có sẵn cho tất cả các trang trên website trong lần truy cập đó.

Vị trí của file tạm được xác định bởi một cấu hình trong tệp php.ini có tên là session.save_path. Trước khi sử dụng bất kỳ biến session nào, hãy đảm bảo bạn đã thiết lập đường dẫn này.

Khi một session được bắt đầu những điều sau đây sẽ xảy ra:

  • Trước tiên, PHP tạo một mã định danh duy nhất cho session đó. Nó là một chuỗi ngẫu nhiên gồm 32 số thập lục phân, chẳng hạn như 3c7foj34c3jj973hjkop2fc937e3443.
  • Một cookie có tên PHPSESSID sẽ tự động được gửi đến máy tính của người dùng để lưu trữ chuỗi nhận dạng session.
  • Một file được tự động tạo trên máy chủ trong thư mục tạm được chỉ định và tên của file là mã định danh session có tiền tố là sess_ tức là sess_3c7foj34c3jj973hjkop2fc937e3443.

Khi tập lệnh PHP muốn truy xuất giá trị từ biến session, PHP sẽ tự động lấy chuỗi số nhận dạng session từ ​​cookie PHPSESSID và sau đó tìm file session trong thư mục tạm.

Một phiên kết thúc khi người dùng tắt trình duyệt hoặc sau khi rời khỏi trang web, máy chủ sẽ chấm dứt phiên sau một khoảng thời gian xác định trước, thường là 30 phút.

Bắt đầu một session trong PHP

Một session PHP được bắt đầu dễ dàng bằng cách gọi hàm session_start(). Hàm này trước tiên sẽ kiểm tra xem một session đã được bắt đầu chưa và nếu chưa thì nó sẽ bắt đầu một session. Bạn nên gọi hàm session_start() ở đầu trang.

Các biến session được lưu trữ trong mảng kết hợp được gọi là $_SESSION[]. Các biến này có thể được truy cập trong suốt vòng đời của session.

Ví dụ sau đây bắt đầu một session sau đó đăng ký hai biến favcolorfavanimal.

Đặt mã này vào tệp “demo_session1.php” và xem kết quả:

<?php
    // Start the session
    session_start();
?>
<!DOCTYPE html>
<html>
<body>

    <?php
        // Set session variables
        $_SESSION["favcolor"] = "green";
        $_SESSION["favanimal"] = "cat";
        echo "Session variables are set.";
    ?>

</body>
</html>

Đây là kết quả:

Session variables are set.

Lưu ý: Hàm session_start() phải là được đặt ở đầu trang của bạn, trước bất kỳ thẻ HTML nào.

Lấy giá trị trong Session

Tiếp theo, chúng tôi tạo một trang khác gọi là “demo_session2.php”. Từ trang này, chúng tôi sẽ truy cập thông tin phiên chúng tôi đặt trên trang đầu tiên (“demo_session1.php”).

Sử dụng hàm isset() để kiểm tra xem biến session đã được thiết lập hay chưa.

Lưu ý rằng các biến session không được truyền riêng cho từng trang mới, thay vào đó chúng được truy xuất từ session chúng tôi mở ở đầu mỗi trang (session_start()).

Cũng lưu ý rằng tất cả các giá trị biến session được lưu trữ trong biến toàn cục $_SESSION:

<?php
    session_start();
?>
<!DOCTYPE html>
<html>
<body>

    <?php
        if (isset($_SESSION['favcolor']) && isset($_SESSION['favanimal'])) {
            // Echo session variables that were set on previous page
            echo "Favorite color is " . $_SESSION["favcolor"] . ".<br>";
            echo "Favorite animal is " . $_SESSION["favanimal"] . ".";
        }
    ?>

</body>
</html>

Đây là kết quả:

Favorite color is green.
Favorite animal is cat.

Một cách khác để hiển thị tất cả các giá trị biến phiên cho phiên người dùng là chạy mã sau:

<?php
    session_start();
?>
<!DOCTYPE html>
<html>
<body>

    <?php
        print_r($_SESSION);
    ?>

</body>
</html>

Đây là kết quả:

Array ( [favcolor] => green [favanimal] => cat )

Cập nhật session trong PHP

Để cập nhật biến session trong PHP ta chỉ cần ghi đè lên nó như ví dụ dưới đây:

<?php
    session_start();
?>
<!DOCTYPE html>
<html>
<body>

    <?php
        // to change a session variable, just overwrite it
        $_SESSION["favcolor"] = "yellow";
        print_r($_SESSION);
    ?>

</body>
</html>

Đây là kết quả:

Array ( [favcolor] => yellow [favanimal] => cat )

Hủy session trong PHP

Nếu bạn muốn hủy một biến session duy nhất thì bạn có thể sử dụng hàm unset().

<?php
    session_start();
?>
<!DOCTYPE html>
<html>
<body>

    <?php
        unset($_SESSION['favcolor']);
        
        print_r($_SESSION);
    ?>

</body>
</html>

Đây là kết quả:

Array ( [favanimal] => cat )

Để xóa tất cả các biến session và hủy sesion, sử dụng hàm session_unset()session_destroy() như sau:

<?php
    session_start();
?>
<!DOCTYPE html>
<html>
<body>

    <?php
        // remove all session variables
        session_unset();

        // destroy the session
        session_destroy();
        
        print_r($_SESSION);
    ?>

</body>
</html>

Đây là kết quả:

Array ( )

Bắt đầu session tự động

Bạn không cần phải gọi hàm start_session() ở đầu mỗi trang để bắt đầu session khi người dùng truy cập website của bạn nếu bạn thiết lập cấu hình session.auto_start thành 1 trong file php.ini.

Có thể có trường hợp người dùng không cho phép lưu trữ cookie trên máy của họ. Vì vậy, có một phương pháp khác để gửi Session ID tới trình duyệt. Đó là bạn sẽ nhúng Session ID vào URL.

Ví dụ sau minh họa cách đăng ký một biến session và liên kết chính xác đến một trang khác bằng SID.

<?php
   session_start();
   
   if (isset($_SESSION['counter'])) {
      $_SESSION['counter'] = 1;
   }else {
      $_SESSION['counter']++;
   }
   
   $msg = "You have visited this page ".  $_SESSION['counter'] . " in this session.";
   
   echo ( $msg );
?>

<p>
   To continue  click following link <br />
   
   <a  href = "nextpage.php?<?php echo htmlspecialchars(SID); ?>">
</p>

Nó sẽ tạo ra kết quả sau:

You have visited this page 1 in this session.
To continue click following link 

Hàm htmlspecialchars() được sử dụng để ngăn chặn các cuộc tấn công liên quan đến XSS.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *