Hướng dẫn dùng get session trong PHP



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

Không giống như một cookie, thông tin được lưu trữ trên server, chứ không được lưu trữ trên máy tính người dùng.


Nội dung chính

  • Session trong PHP là gì?
  • Bắt đầu một session trong PHP
  • Đọc giá trị biến session trong PHP
  • Thay đổi giá trị biến session trong PHP
  • Xóa biến session trong PHP
    • Session hoạt động như thế nào? Làm sao để biết nó là tôi?

Khi bạn làm việc với một ứng dụng, bạn mở nó, thực hiện một số thay đổi, và sau đó bạn đóng nó lại. Điều này giống như một phiên (session). Máy tính biết bạn là ai. Nó biết khi bạn bắt đầu ứng dụng và khi bạn kết thúc. Nhưng trên internet có một vấn đề: máy chủ web không biết bạn là ai hoặc bạn làm gì, vì địa chỉ HTTP không duy trì trạng thái.

Các biến session giải quyết vấn đề này bằng cách lưu trữ thông tin người dùng được sử dụng trên nhiều trang (ví dụ: tên người dùng, sở thích, v.v.). Theo mặc định, các biến session tồn tại cho đến khi người dùng đóng trình duyệt.

Vì thế; Biến phiên giữ thông tin về một người dùng duy nhất và có sẵn cho tất cả các trang trong một ứng dụng.



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

Hàm session_start() được sử dụng để bắt đầu một session.

Biến session được đặt bằng biến toàn cục PHP: $_SESSION.

Bây giờ, hãy tạo một trang mới có tên là "session-trong-php-1.php". Trong trang này, chúng tôi bắt đầu một PHP session mới và thiết lập một số biến session:

File: "session-trong-php-1.php"









Kết quả:

Các biến session đã được tạo.

Xem kết quả ở tab mới.

Chú ý: Hàm Cácsession_start() phải đặt TRƯỚC thẻ .


Đọc giá trị biến session trong PHP

Tiếp theo, chúng ta tạo một trang khác gọi là "session-trong-php-2.php". Từ trang này, chúng ta sẽ truy cập thông tin session mà chúng ta đã tạo ra trên trang đầu tiên ("session-trong-php-1.php").

Lưu ý rằng các biến session không được chuyển riêng lẻ đến từng trang mới, thay vào đó chúng được truy cập từ session mà chúng ta khai báo ở đầu mỗi trang (session_start()) và các giá trị biến session được lưu trữ trong biến toàn cầu $_SESSION:

File: "session-trong-php-2.php"





";
echo "username là: " . $_SESSION["username"];
?>



Kết quả:

user_id là: TT123456
username là: david123

Xem kết quả ở tab mới.

Để in tất cả các biến session, sử dụng lệnh sau:



Thay đổi giá trị biến session trong PHP

Để thay đổi biến session, chỉ ghi đè lên biến đó:

File: "session-trong-php-3.php"









Kết quả:

Array ( [user_id] => TT123456 [username] => viettuts.vn )

Xem kết quả ở tab mới.


Xóa biến session trong PHP

Để xóa tất cả các biến session toàn cầu hãy sử dụng session_unset() và session_destroy():

File: "session-trong-php-4.php"









Kết quả:

Xem kết quả ở tab mới.

Session hoạt động như thế nào? Làm sao để biết nó là tôi?

Hầu hết các session đều thiết lập một user-key trên máy tính của người dùng giống như sau: 765487cf34ert8dede5a562e4f3a7e12. Sau đó, khi một phiên được mở trên một trang khác, nó sẽ quét máy tính cho một user-key. Nếu phù hợp, nó sẽ truy cập vào phiên đó, nếu không, nó sẽ bắt đầu một phiên mới.



Sử dụng được session và hiểu về nó là điều quan trong trong lập trình web, hôm nay mình sẽ giới thiệu về cách sử dụng session cơ bản. Bài viết được dịch từ chương 28 của quyển PHP Notes For Professionals.

1. session_start() options

Bắt đầu với PHP session, chúng ta có thể truyền vào 1 mảng với session-based php.ini options tới hàm sessionstart

Ví dụ 1:

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    // php >= 7 version
    session_start([
        'cache_limiter' => 'private',
        'read_and_close' => true,
    ]);
} else {
    // php < 7 version
    session_start();
}

Ở bản này cũng giới thiệu một setting mới trong php.ini gọi là session.lazy_write, với giá trị mặc định là true và định nghĩa rằng session data là chỉ được ghi lại nếu nó thay đổi.

Ref: https://wiki.php.net/rfc/session-lock-ini

2. Sesssion locking

Chúng ta đều biết rằng PHP ghi session data vào file ở phía server. Khi 1 request được tạo tới php script (cái mà khởi tạo session qua session_start()), PHP khóa session file để block hoặc đợi những request khác đang đến đối với cùng session_id để hoàn thành nó, bởi vì những request khác có thể bị nghẽn trong session_start cho đến khi hoặc trừ khi session file đã bị khóa không được bỏ ra.

Session file vẫn bị khóa đến khi script được hoàn thành hoặc session được đóng bằng tay. Để tránh trường hợp ví dụ như tránh nhiều request bị block, chúng ta có thể khởi tạo session và đóng sesion cái mà sẽ bỏ khóa từ session file và cho phép tiếp tục các request còn lại.

Ví dụ 2:

// php < 7.0
// start session
session_start();

// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked

// close the session, release lock
session_write_close();

Giờ chúng ta sẽ là nếu session bị đóng thì làm sao để đọc được những giá trị trong session đó, tuy nhiên dù sau khi session bị đóng thì session vẫn còn. Do đó, chúng ta vẫn đọc được session data.

Từ php >= 7.0, chúng ta có thể có read_only session, read_write session, lazy_write sesion, do đó nó ko yêu cầu cần phải sử dụng sessionwriteclose()

3. Manipulating session data

Biến $_SESSION là 1 array, và chúng ta có thể nhận được và xử lý nó như 1 mảng thông thường.

Ví dụ 3:

// Starting the session
session_start();

// Storing the value in session
$_SESSION['id'] = 342;

// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
    echo "Please login first";
    exit;
}
// now you can use the login safely
$user = $_SESSION["login"];

// Getting a value from the session data, or with default value,
// using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';

Chú ý rằng nếu bạn lưu 1 object trong session, nó sẽ nhận và chỉ khi bạn có 1 class autoloader hoặc bạn đã load class đó. Các trường hợp khác, object sẽ lưu dưới dạng __PHP_Incomplete_Class, có thể dẫn tới crashes app

Warning: Session có thể bị tấn công. Do đó, không bao giờ nên lưu thông tin người dùng trong session. Đặc biệt với thẻ tin dụng, các thông tin id, password, nhưng cũng có thể sử dụng với 1 vài thông tin public như tên tuổi, email, số điẹnt thoại ...

4. Destroy an entire session

Nếu đã lấy được session, ta sẽ muốn có thể hủy bỏ được nó. Điều này được làm dễ dàng với session_destroy() Ví dụ:

/*
        Let us assume that our session looks like this:
        Array([firstname] => Jon, [id] => 123)
        We first need to start our session:
*/
session_start();
/*
        We can now remove all the values from the `SESSION` superglobal:
        If you omitted this step all of the global variables stored in the
        superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

//Finally we can destroy the session:
session_destroy();

Sử dụng sessiondestroy khác với sử dụng những thứ như $_SESSION = array() Nó sẽ bỏ hết giá trị lưu trong session global nhưng nó sẽ không hủy phiên bản được lưu thực sự của session.

Chú ý: Chúng ta có thể dùng session_unset() cho code cũ không sử dụng được $_SESSION.

5. Safe Session Start With no Errors

Nhiều lập trình viên gặp phải vấn đề này khi làm việc với dự án lớn, đặc biết nếu họ làm việc trên những nền tảng CMS dựa trên plugin, addons, components ... Đây là solution cho khởi tạo session an toàn mà ta sẽ kiểm tra phiên bản PHP đầu tiên để cover tất cả các phiên bản và tiếp đó thì mới khởi tạo session. Nếu session không tồn tại thì ta sẽ khởi tạo session an toàn. Nếu session tồn tại thì sẽ không có gì xảy ra cả.

Ví dụ:

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    if(session_status() == PHP_SESSION_NONE) {
        session_start(array(
            'cache_limiter' => 'private',
            'read_and_close' => true,
        ));
    }
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
}
else
{
    if(session_id() == '') {
        session_start();
    }
}

Nó sẽ giúp bạn không bị session_start error

6. Session name

Kiểm tra nếu session cookie đã được khởi tạo chưa

Session name là tên củ cookie được sử dụng để lưu session. Bạn có thể sử dụng nó để phát hiện nếu cookie cho session đã được khởi tạo cho người dùng.

if(isset($_COOKIE[session_name()])) {
    session_start();
}

Chú ý rằng phương thức này thường không hữu dụng trừ khi bạn không muốn tạo cookie không cần thiết.

Thay đổi session name

Bạn có thể cập nhật session name bằng cách gọi session_name()

//Set the session name
session_name('newname');
//Start the session
session_start();

Nếu không có tham số truyền vào thì session name hiện tại sẽ được trả về.