Nhiều khi chúng ta làm những việc hết sức đơn giản, và trong thâm tâm, chúng ta đã được "lập trình" rằng việc đó dĩ nhiên là bình thường!
Trong lập trinh cũng vậy, ví dụ bạn viết một đoạn code rất bình thường, hay bạn luôn mặc định đó là "bình thường":
<?php
header("Location: index.php");
?>
👉 Ý tưởng: redirect sang trang khác
Bạn bấm chạy…
👉 Và…
Warning: Cannot modify header information - headers already sent
Bạn nhìn màn hình…
"Header gì? Gửi lúc nào??? Không hiểu??"
👉 Chúc mừng, bạn vừa gặp một trong những lỗi "kinh điển" của PHP 😅
Lỗi "header already sent" trong PHP xảy ra khi bạn gửi output (echo, HTML, khoảng trắng…) trước khi gọi hàm header().
Hiểu đơn giản (rất quan trọng)
👉 PHP có một "luật ngầm":
Phải gửi header trước, rồi mới gửi nội dung
👉 Nhưng bạn lại làm:
gửi nội dung trước
rồi mới gửi header
→ PHP: "Không được!" 🤚
Ví dụ đời thường
👉 Bạn gửi bưu kiện:
Ghi địa chỉ (header)
Gửi hàng (data)
👉 Nhưng bạn lại:
gửi hàng trước
rồi mới ghi địa chỉ
👉 Bưu điện:
"Ơ kìa???" 🤨
👉 PHP cũng vậy 😅
Lỗi kinh điển
❌ Case 1: echo trước header
<?php
echo "Hello";
header("Location: index.php");
?>
👉 Bạn đã "in ra" rồi
→ header không gửi được nữa
❌ Case 2: có khoảng trắng trước <?php
<?php
header("Location: index.php");
👉 3 dấu cách đó… cũng tính là output 🤡
👉 Đây là lỗi:
"nhìn không thấy nhưng phá banh chương trình" 😅
❌ Case 3: HTML trước PHP
<h1>Hello</h1>
<?php
header("Location: index.php");
?>
👉 HTML = output
→ header fail
❌ Case 4: file include gây lỗi
include "config.php";
header("Location: home.php");
👉 Nếu config.php có:
echo
hoặc khoảng trắng
→ cũng lỗi
Cách fix (rất quan trọng)
✅ Cách 1: Đặt header trước mọi thứ
<?php
header("Location: index.php");
exit;
?>
👉 Không echo trước đó
✅ Cách 2: Không có khoảng trắng
👉 File phải bắt đầu như này:
<?php
👉 Không có:
space
dòng trống
BOM
✅ Cách 3: Dùng output buffering (nâng cao chút)
<?php
ob_start();
echo "Hello";
header("Location: index.php");
ob_end_flush();
?>
👉 PHP sẽ "giữ lại" output
→ cho phép header chạy trước
👉 Nhưng:
Người mới nên hạn chế dùng cách này 😅
Test thử (rất nên làm)
👉 Tạo file:
<?php
echo "Test";
header("Location: https://google.com");
?>
👉 Mở lên → lỗi
👉 Sửa lại:
<?php
header("Location: https://google.com");
exit;
?>
👉 → redirect OK 😏
Debug nhanh
👉 Khi gặp lỗi này:
- Xem có echo không
- Xem có HTML trước PHP không
- Xem có khoảng trắng không
- Check file include
👉 90% lỗi nằm ở đây
Một sự thật hơi "đau"
👉 Lỗi này:
- không khó
- nhưng rất "khó chịu"
👉 Vì:
Bạn nhìn code… thấy đúng hết 🤡
👉 Nhưng thực tế:
sai 1 dấu cách 😅
Tổng kết
"header already sent" không phải lỗi phức tạp
👉 Nó chỉ là:
bạn đã gửi output trước
👉 Nhớ:
- header phải đứng đầu
- không echo trước
- không có khoảng trắng
❓ FAQ nhanh
Có thể echo rồi redirect không?
→ Không (trừ khi dùng ob_start)
Tại sao lỗi vẫn xảy ra dù không thấy echo?
→ có thể do khoảng trắng hoặc file include
exit có cần không?
→ Có, để dừng script sau khi redirect
👉 Bạn có thể cũng đang gặp:
PHP không nhận dữ liệu từ form
Undefined index
MySQL không connect
(👉 đã có trong các bài trước)
Không có nhận xét nào:
Đăng nhận xét