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"! Bạn viết xong chức năng login.


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.


Bạn hí hửng gán:


$_SESSION['username'] = $username;


Sau đó redirect sang trang home.php.


Tưởng rằng mọi thứ hoàn hảo…


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


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


Bạn đứng hình. 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 kinh điển 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.


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


  • Còn đeo vòng → được vào.
  • Mất vòng → bị hỏi:

"Anh là ai?" 😅


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ó session_start().


👉 Session tồn tại, nhưng PHP không "mở sổ" ra để đọc.


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


→ 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.


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 nhanh

In toàn bộ session

session_start();

var_dump($_SESSION);


Nếu thấy:


array(0) { }


→ 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 "cứ theo là ra"


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


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


Một sự thật hơi "đau"


Bạn mất 3 tiếng 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

Không có nhận xét nào:

Đăng nhận xét