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 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 gán:
$_SESSION['username'] = $username;
Sau đó redirect sang trang home.php.
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:
"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, 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.
- Còn đeo vòng → được vào, được đi lang thang khắp công viên.
- Mất vòng → 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ó 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 "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 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:
Cannot modify header information