Težava z glavami HTTP odziva v PHP
Po pravilih HTTP se najprej pošljejo
HTTP glave, nato pa telo HTTP odziva.
Zaradi tega ima delo s funkcijo header
v PHP svoje posebnosti.
Bistvo je v tem, da če je pred klicem te
funkcije kakršen koli izpis na zaslon,
bo ta obravnavan kot začetek
telesa odziva. V tem primeru bo klic
funkcije header povzročil
opozorilo PHP z besedilom
headers already sent.
V tem primeru se glave morda celo pošljejo.
Morda se celo napaka ne izpiše (odvisno od
nastavitev PHP). Toda najpogosteje se bo to zgodilo samo
na lokalnem okolju, ob objavi spletne strani na internet
pa se bo vse pokvarilo.
Z izpisom na zaslon se misli poljubno besedilo. Na primer, takole:
text
<?php
header('Content-Type: text/html');
?>
Ali prazna vrstica:
<?php
header('Content-Type: text/html');
?>
Ali presledek:
<?php
header('Content-Type: text/html');
?>
Ali tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Ali izpis preko echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Ali izpis preko var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Celi opozorila PHP bodo izpisi na zaslon. V naslednjem primeru gre namerno do dostopa do neobstoječe spremenljivke, kar bo povzročilo izpis opozorila:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Tudi prelomi PHP oklepajev povzročajo izpis na zaslon:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Namerno ustvarite izpis na zaslon
pred funkcijo header.
Preučite besedilo nastale napake.
Popravite napako, storjeno v tej kodi:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>