ปัญหาเกี่ยวกับส่วนหัวของ HTTP Response ใน PHP

ตามกฎของ HTTP จะต้องส่ง ส่วนหัวของ HTTP ก่อน จากนั้นจึงส่งเนื้อความของ HTTP Response เนื่องจากเหตุนี้ การทำงานกับฟังก์ชัน header ใน PHP จึงมีลักษณะเฉพาะของตัวเอง

ประเด็นคือ หากก่อนเรียกใช้ฟังก์ชันนี้ มีการส่งออก (output) ไปยังหน้าจอใดๆ มันจะถูกตีความว่าเป็นจุดเริ่มต้นของ เนื้อความตอบกลับ ในกรณีนี้ การเรียกใช้ ฟังก์ชัน header จะนำไปสู่ การแจ้งเตือน (warning) จาก PHP พร้อมข้อความ headers already sent ทั้งที่ส่วนหัวอาจจะยังถูกส่งไป หรือแม้แต่ข้อผิดพลาดอาจไม่แสดง (ขึ้นอยู่กับ การตั้งค่า PHP) แต่ส่วนใหญ่แล้วสิ่งนี้จะเกิดขึ้นแค่ บนเครื่องพัฒนา (local) เท่านั้น และเมื่อนำเว็บไซต์ขึ้นไปบนอินเทอร์เน็ต ทุกอย่างจะพัง

การส่งออกไปยังหน้าจอ หมายถึง ข้อความใดๆ ก็ได้ ตัวอย่างเช่น:

phpข้อความ
<?php
  header('Content-Type: text/html');
?>

หรือบรรทัดว่าง:

php     
<?php
  header('Content-Type: text/html');
?>

หรือช่องว่าง:

php <?php
  header('Content-Type: text/html');
?>

หรือแท็ก:

html<div>
  <?php
    header('Content-Type: text/html');
  ?>
</div>

หรือการส่งออกผ่าน echo:

php<?php
  echo 'abc';
  header('Content-Type: text/html');
?>

หรือการส่งออกผ่าน var_dump:

php<?php
  $str = 'abc';
  var_dump($str);
  
  header('Content-Type: text/html');
?>

แม้แต่การแจ้งเตือน (warning) ของ PHP ก็ถือเป็นการส่งออก ไปยังหน้าจอ ในตัวอย่างต่อไปนี้ มีการตั้งใจ อ้างอิงถึงตัวแปรที่ไม่มีอยู่จริง ซึ่งจะนำไปสู่การแสดงผล การแจ้งเตือน:

php<?php
  $text += 1;
  header('Content-Type: text/html');
?>

การแยกแท็ก PHP ก็สร้าง การส่งออกไปยังหน้าจอเช่นกัน:

php<?php
  echo 'abc';
?>
<?php
  header('Content-Type: text/html');
?>
Задание 1

จงสร้างการส่งออกไปยังหน้าจอโดยตั้งใจ ก่อนฟังก์ชัน header และศึกษาข้อความข้อผิดพลาดที่เกิดขึ้น

Задание 2

แก้ไขข้อผิดพลาดที่เกิดขึ้นในโค้ดนี้:

html<!DOCTYPE html>
<html>
  <head>
    <?php
      header('Content-Type: text/html');
    ?>
  </head>
  <body>
    ข้อความ
  <body>
<html>