Problem med HTTP-svarshoveder i PHP
Ifølge HTTP-reglerne sendes
HTTP-hoveder først, og derefter HTTP-svarsteksten.
På grund af dette har arbejdet med funktionen header
i PHP sine særligheder.
Faktum er, at hvis der er noget output til skærmen
før kald til denne funktion,
vil det blive fortolket som starten på
svarsteksten. I dette tilfælde vil et kald
til funktionen header føre
til en PHP-advarsel med teksten
headers already sent.
I dette tilfælde kan hovederne muligvis sendes.
Fejlen vises måske ikke engang (afhængigt af
PHP-indstillingerne). Men oftest vil dette kun ske
på den lokale maskine, og når hjemmesiden lægges på internettet,
går det i stykker.
Med output til skærmen menes enhver tekst. For eksempel sådan her:
text
<?php
header('Content-Type: text/html');
?>
Eller en tom linje:
<?php
header('Content-Type: text/html');
?>
Eller et mellemrum:
<?php
header('Content-Type: text/html');
?>
Eller et tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Eller output via echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Eller output via var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Selv PHP-advarsler vil være output til skærmen. I det følgende eksempel henvises der med vilje til en ikke-eksisterende variabel, hvilket vil føre til output af en advarsel:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Ophævelser af PHP-parenteser genererer også output til skærmen:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Skab med vilje output til skærmen
før funktionen header.
Undersøg teksten i den opståede fejl.
Ret fejlen begået i denne kode:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>