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:
- 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"
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
Không có nhận xét nào:
Đăng nhận xét