Problem med HTTP-responsheader i PHP
I følge HTTP-reglene sendes
HTTP-header først, og deretter kroppen av HTTP-svaret.
På grunn av dette har arbeid med funksjonen header
i PHP sine særegenheter.
Saken er at hvis det er noen utskrift til skjermen
før dette funksjonskallet,
vil den bli tolket som starten
på svar-kroppen. I dette tilfellet vil kallet
til funksjonen header føre
til en PHP-advarsel med teksten
headers already sent.
Samtidig kan headerne til og med bli sendt.
Det kan hende feilen ikke engang vises (avhenger av
PHP-innstillingene). Men oftest vil dette bare
være på lokal maskin, og når nettstedet lastes opp på internett
vil alt gå i stykker.
Med utskrift til skjermen menes hvilken som helst tekst. For eksempel slik:
tekst
<?php
header('Content-Type: text/html');
?>
Eller en tom linje:
<?php
header('Content-Type: text/html');
?>
Eller et mellomrom:
<?php
header('Content-Type: text/html');
?>
Eller en tagg:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Eller utskrift via echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Eller utskrift via var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Selv PHP-advarsler vil være utskrifter til skjermen. I det følgende eksemplet henvises det med vilje til en ikke-eksisterende variabel, noe som vil føre til utskrift av en advarsel:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Inndelinger av PHP-klammeparenteser genererer også utskrift til skjermen:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Skap med vilje en utskrift til skjermen
før funksjonen header.
Studer teksten til feilen som oppstår.
Korriger feilen som er begått i denne koden:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
tekst
<body>
<html>