Masalah dengan Penghantaran Header HTTP dalam PHP
Menurut peraturan HTTP, header HTTP dihantar terlebih dahulu,
diikuti dengan badan (body) respons HTTP.
Oleh sebab itu, penggunaan fungsi header
dalam PHP mempunyai ciri-ciri tersendiri.
Masalahnya ialah, jika terdapat sebarang output
ke skrin sebelum fungsi ini dipanggil,
ia akan ditafsirkan sebagai permulaan
badan respons. Dalam kes ini, panggilan
kepada fungsi header akan menyebabkan
amaran PHP dengan teks
headers already sent.
Header mungkin masih dihantar.
Ralat mungkin tidak dipaparkan (bergantung pada
konfigurasi PHP). Tetapi selalunya ini hanya berlaku
dalam persekitaran pembangunan tempatan (local), dan apabila
laman web dinaikkan ke internet, semuanya akan rosak.
Output ke skrin merujuk kepada sebarang teks. Contohnya:
teks
<?php
header('Content-Type: text/html');
?>
Atau baris kosong:
<?php
header('Content-Type: text/html');
?>
Atau ruang (space):
<?php
header('Content-Type: text/html');
?>
Atau tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Atau output melalui echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Atau output melalui var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Malah amaran PHP juga dianggap sebagai output ke skrin. Dalam contoh berikut, sengaja mengakses pembolehubah yang tidak wujud, yang akan menyebabkan output amaran:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Pemisahan tag PHP juga menghasilkan output ke skrin:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Sengaja cipta output ke skrin
sebelum fungsi header.
Kaji teks ralat yang timbul.
Betulkan ralat yang dilakukan dalam kod ini:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
teks
<body>
<html>