HTTP-vastauksen otsikko-ongelma PHP:ssä
HTTP-sääntöjen mukaan lähetetään ensin
HTTP-otsikot ja sitten HTTP-vastauksen runko.
Tästä johtuen header-funktion käyttö
PHP:ssä on erikoista.
Asia on siinä, että jos ennen tämän funktion
kutsua tulostetaan jotain näytölle,
se tulkitaan vastauksen rungon alkuksi.
Tässä tapauksessa header-funktion
kutsu johtaa
PHP-varoituksen tekstillä
headers already sent.
Otsikot saattavat jopa lähettyä.
Virhe ei ehkä edes tulostu (riippuen
PHP:n asetuksista). Mutta useimmiten tämä tapahtuu vain
paikallisessa ympäristössä, ja kun sivusto lasketaan internetiin,
kaikki hajoaa.
Tulostuksella näytölle tarkoitetaan mitä tahansa tekstiä. Esimerkiksi näin:
teksti
<?php
header('Content-Type: text/html');
?>
Tai tyhjä rivi:
<?php
header('Content-Type: text/html');
?>
Tai välilyönti:
<?php
header('Content-Type: text/html');
?>
Tai tagi:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Tai tulostus echo:lla:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Tai tulostus var_dump:lla:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Jopa PHP-varoitukset ovat tulostusta näytölle. Seuraavassa esimerkissä tarkoituksella viitataan olematon muuttujaan, mikä johtaa varoituksen tulostukseen:
<?php
$text += 1;
header('Content-Type: text/html');
?>
PHP-sulkujen väliset rivinvaihdot myös aiheuttavat tulostusta näytölle:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Luo tarkoituksella tulostus näytölle
ennen header-funktiota.
Tutki syntyvän virheen tekstiä.
Korjaa tässä koodissa tehty virhe:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
teksti
<body>
<html>