ปัญหาเกี่ยวกับส่วนหัวของ HTTP Response ใน PHP
ตามกฎของ HTTP จะต้องส่ง
ส่วนหัวของ HTTP ก่อน จากนั้นจึงส่งเนื้อความของ HTTP Response
เนื่องจากเหตุนี้ การทำงานกับฟังก์ชัน header
ใน PHP จึงมีลักษณะเฉพาะของตัวเอง
ประเด็นคือ หากก่อนเรียกใช้ฟังก์ชันนี้
มีการส่งออก (output) ไปยังหน้าจอใดๆ
มันจะถูกตีความว่าเป็นจุดเริ่มต้นของ
เนื้อความตอบกลับ ในกรณีนี้ การเรียกใช้
ฟังก์ชัน header จะนำไปสู่
การแจ้งเตือน (warning) จาก PHP พร้อมข้อความ
headers already sent
ทั้งที่ส่วนหัวอาจจะยังถูกส่งไป
หรือแม้แต่ข้อผิดพลาดอาจไม่แสดง (ขึ้นอยู่กับ
การตั้งค่า PHP) แต่ส่วนใหญ่แล้วสิ่งนี้จะเกิดขึ้นแค่
บนเครื่องพัฒนา (local) เท่านั้น และเมื่อนำเว็บไซต์ขึ้นไปบนอินเทอร์เน็ต
ทุกอย่างจะพัง
การส่งออกไปยังหน้าจอ หมายถึง ข้อความใดๆ ก็ได้ ตัวอย่างเช่น:
ข้อความ
<?php
header('Content-Type: text/html');
?>
หรือบรรทัดว่าง:
<?php
header('Content-Type: text/html');
?>
หรือช่องว่าง:
<?php
header('Content-Type: text/html');
?>
หรือแท็ก:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
หรือการส่งออกผ่าน echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
หรือการส่งออกผ่าน var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
แม้แต่การแจ้งเตือน (warning) ของ PHP ก็ถือเป็นการส่งออก ไปยังหน้าจอ ในตัวอย่างต่อไปนี้ มีการตั้งใจ อ้างอิงถึงตัวแปรที่ไม่มีอยู่จริง ซึ่งจะนำไปสู่การแสดงผล การแจ้งเตือน:
<?php
$text += 1;
header('Content-Type: text/html');
?>
การแยกแท็ก PHP ก็สร้าง การส่งออกไปยังหน้าจอเช่นกัน:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
จงสร้างการส่งออกไปยังหน้าจอโดยตั้งใจ
ก่อนฟังก์ชัน header
และศึกษาข้อความข้อผิดพลาดที่เกิดขึ้น
แก้ไขข้อผิดพลาดที่เกิดขึ้นในโค้ดนี้:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
ข้อความ
<body>
<html>