Chủ Nhật, 10 tháng 5, 2026

Session không hoạt động trong PHP? Login thành công nhưng vẫn bị "đá ra ngoài"

Form vẫn luôn là đề tài "hấp dẫn", nhưng cũng "lắm chuyện"! Với "trình độ cao" như hiện tại, bạn viết xong chức năng login vào một website.


Người dùng nhập:

  • username
  • password


Bấm nút Đăng nhập, nhắp một ngụm cà phê...thư giãn!

PHP kiểm tra đúng. Đăng nhập thành công!


Bạn hí hửng tiếp tục "phát triển" website, nâng lên một tầm cao mới và gán:

$_SESSION['username'] = $username;


Sau đó redirect sang trang home.php. Rất "bài bản" và "chuyên nghiệp"


Tưởng rằng mọi thứ hoàn hảo…Với suy nghĩ rằng PHP đã "nhớ" tên của "khách hàng"...Chỉ cần "cho vào" session là có thể chu du khắp mọi hang cùng ngõ hẻm của website!


Nhưng sang trang mới, PHP trả lời lạnh lùng...bốc lủm với người dùng:

"Bạn chưa đăng nhập."


Bạn ngán ngẩm, ngỡ ngàng, ngơ ngác... Cảm giác y như gặp một bác soát vé khó tính vậy! Vừa...oan ức, lại vừa...hoang mang!


"Ủa? Mới đăng nhập xong mà???" 


Chúc mừng, bạn vừa gặp một trong những lỗi "oan ức" nhất của PHP:



Session không hoạt động.


Session trong PHP không hoạt động thường do:

  • quên gọi session_start()
  • gọi session_start() sau khi đã output
  • session bị mất sau redirect
  • hosting không lưu được session
  • trình duyệt chặn cookie



Session là gì?


Nói đơn giản:

Session là cách PHP "nhớ" bạn là ai. Cho phép bạn "mần cái gì" trong một khoảng thời gian, trong một "phiên làm việc"



Ví dụ đời thường:


Bạn vào công viên nước, mua vé vào cổng.

Nhân viên phát cho bạn một chiếc vòng tay đẹp mắt.

Khi nào bạn còn đeo vòng thì bạn được ra vào, được đi lang thang khắp công viên.

Mất vòng sẽ bị hỏi:

"Anh là ai? Đã mua vé chưa?". Chưa có vé thì xin mời...ra ngoài!


Trong PHP:

chiếc vòng tay = Session ID

thông tin người dùng = dữ liệu session


Ví dụ login cơ bản

session_start();

$_SESSION['username'] = 'admin';

header("Location: home.php");



exit;


home.php

session_start();

echo $_SESSION['username'];


Nếu mọi thứ đúng, màn hình sẽ hiện:

admin



7 nguyên nhân phổ biến nhất


1. Quên session_start()


login.php

$_SESSION['username'] = 'admin';


Không có:

session_start();


PHP:

"Session gì? Tôi chưa khởi động mà"


Fix:

session_start();


2. Quên session_start() ở trang đọc session


home.php

echo $_SESSION['username'];


Không có lệnh session_start().

"Quyển sách" Session tồn tại, nhưng PHP không hề "mở sách" ra để đọc. Kiểu như ngồi vào bàn tiệc, bưng nổi lẩu lên nhưng đậy nắp, chỉ biết ngồi nhìn và...nuốt nước miếng!


3. Gọi session_start() sau khi đã output


echo "Hello";

session_start();


Lỗi tương tự header already sent.

Session cần gửi cookie trước khi có output.


4. Redirect sang trang khác nhưng quên exit


session_start();

$_SESSION['username'] = 'admin';

header("Location: home.php");


Có thể vẫn chạy tiếp những dòng bên dưới.


Nên viết:

session_start();

$_SESSION['username'] = 'admin';

header("Location: home.php");



exit;


5. Trình duyệt chặn cookie


Session PHP mặc định hoạt động nhờ cookie.

Nếu trình duyệt:

  • chặn cookie
  • ở chế độ quá riêng tư
  • extension nào đó can thiệp


Khả năng cao "em" session có thể "mất trí nhớ".



6. Dùng HTTP và HTTPS lẫn lộn


Ví dụ:

Login ở http://


Sau đó chuyển sang https://

Một số cấu hình cookie có thể khiến session không được giữ lại.


7. Hosting cấu hình session lỗi (hiếm gặp)


Nếu dùng hosting miễn phí như InfinityFree, đôi khi:


  • session path lỗi
  • quyền ghi tạm thời gặp vấn đề


Hiếm, nhưng vẫn có thể xảy ra, không nên bỏ qua bất cứ khả năng nào.



Code mẫu chạy đúng


login.php

<?php



session_start();

$_SESSION['username'] = 'admin';

header("Location: home.php");



exit;



?>


home.php

<?php



session_start();



if (isset($_SESSION['username'])) {



    echo "Xin chào " . $_SESSION['username'];



} else {



    echo "Bạn chưa đăng nhập";



}



?>



Cách debug kiểu dev "xịn sò"


In toàn bộ session

session_start();

var_dump($_SESSION);


Nếu thấy:

array(0) { }


Có thể kết luận rằng session đang rỗng.


Kiểm tra session ID


session_start();

echo session_id();


Nếu mỗi lần reload ID thay đổi bất thường, có vấn đề về cookie/session.



Checklist "chuẩn không cần chỉnh"


Khi session không hoạt động:

  • Có session_start() chưa?
  • Đặt ở đầu file chưa?
  • Có output trước đó không?
  • Đã exit; sau redirect chưa?
  • Cookie có bị chặn không?
  • HTTP và HTTPS có đồng nhất không?
  • var_dump($_SESSION) ra gì?



Một sự thật hơi "đau...cái đầu"


Bạn mất 3 tiếng "hì hục" debug.

Cuối cùng phát hiện…


Thiếu đúng 1 dòng:

session_start();


Cảm giác lúc đó rất khó tả...



Tổng kết


Session không hoạt động trong PHP thường không phải lỗi phức tạp.


Đa số chỉ vì:

  • quên session_start()
  • gọi sai vị trí
  • cookie bị chặn


Hãy nhớ:

Không có session_start(), PHP sẽ "quên sạch mọi thứ" 



FAQ nhanh


Session khác cookie thế nào?

Cookie lưu trên trình duyệt.

Session lưu trên server.


Có cần gọi session_start() ở mọi trang không?

Có, nếu trang đó đọc hoặc ghi session.


Có nên dùng session cho login?

Có. Đây là cách phổ biến nhất.



Bạn có thể cũng đang gặp:

Header already sent

Cannot modify header information

PHP không nhận dữ liệu từ form

MySQL không connect