Mitä tarkoittaa 'Headers already sent'-virheilmoitus?
Mureakuha
Lyhyesti, älä tulosta mitään ennenkuin olet tehnyt kaikki haluamasi headereihin liittyvät toimenpiteet kuten keksien lähetys, session aloitus, header()-funktiot yms.
HTTP-pyynnöt koostuvat kahdesta osasta: "headerista" (tunniste/info-osa), jossa on sivuun liittyvää infoa (muun muassa sivun pituus, keksit yms.), ja itse data-osasta, jossa on sivun sisältö. Headeri lähetään aina asiakkaalle ensin, ja tämän jälkeen itse sisältö. Kun PHP:llä muutat jotain headereihin liittyvää (tavallisimmin keksit, header(), sessiot), pitää tämä aina tehdä ennen kuin tulostat merkkiäkään, koska PHP lähettää headerit aina siinä vaiheessa kun alat tulostamaan sisältöä sivulle eikä näitä enää tämän jälkeen voi muokata. Tämä ei koske pelkästään PHP:n tulostamaa tavaraa, vaan myös sivulla php-tagien ulkopuolella olevaa html:ää sekä myös tyhjiä rivejä, välilyöntejä yms.
Mikäli kuitenkin on tarpeen lähettää headereita sisällön lähettämisen jo alettua, voi tulostuksen puskuroida.
Voit myös selvittää mikä tiedosto lähetti jotain käyttämällä seuraavanlaista funktiota:
<?php function header_redirect($go) { if(!headers_sent($filename, $linenum)) { header('Location: ' . strtr("\n\r", ' ', $go)); return TRUE; } else { return $filename . ':' . $linenum; // tiedostonimi ja rivinumero } } $redir = header_redirect('http://www.mureakuha.com/'); if($redir !== TRUE) { echo 'Virhe: headerit lähetettiin jo: ' . $redir . '!' . "\n"; die(); } ?>
