Header already sent Top PHP tutorial

Door Wouter J, 9 jaar geleden, 24.816x bekeken

De header already sent foutmelding is een van de meest voorkomen foutmeldingen waar op forums vragen over worden gesteld. Deze fout krijg je als niet precies weet wat bijvoorbeeld de header functie doet. In deze tutorial wil ik uitleggen hoe het werkt en waarom je deze foutmelding krijgt.

Gesponsorde koppelingen

Inhoudsopgave

  1. HTTP request/reponse
  2. Header already sent
  3. Hoe op te lossen?
  4. Cookies en Sessions

 

Er zijn 14 reacties op 'Header already sent'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Tobias Tobias
Tobias Tobias
9 jaar geleden
 
Duidelijk en handig
Er zijn veel vragen hierover op het forum
Wouter J
Wouter J
9 jaar geleden
 
Even een veranderingen gedaan:
- Voorbeeld 2 uitgebreid met tekst over een spatie (ook output)
- Voorbeeld 3 toegevoegd over een BOM character
Max van den Bosch
Max van den Bosch
9 jaar geleden
 
Heel duidelijke tutorial. Moet je meer van gaan maken! (Heb je talent ofzow?)
- SanThe -
- SanThe -
9 jaar geleden
 
Netjes en duidelijk.

(Kleine typo 2e pagina: vermeiden => vermijden)
Wouter J
Wouter J
9 jaar geleden
 
Bedankt voor de spelfout. Ik heb hem meteen verbeterd.
Write Down
Write Down
9 jaar geleden
 
Mooi en degelijk. Nu maar hopen dat de beginners dit eens lezen...
Jeffrey G
Jeffrey G
9 jaar geleden
 
Vooral bij inlogscripts gebruik ik vaak een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
header('Location: ...');
ergens midden in de code.

Omdat mijn code verder wel strak is qua witruimte etc krijg ik hier eigenlijk nooit errors mee.

Wat je dus eigenlijk zegt is dat ik ook zulke headers voor de doctype moet opvangen? En dus alle form submits eigenlijk het beste helemaal bovenaan de pagina beter kan opvangen met php dan midden in de pagina?

Dit gaat voor mij waarschijnlijk wel verwarrend worden als code niet op chronische volgorde van handelingen staat, maar als het beter is dan is het beter =)!
Wouter J
Wouter J
9 jaar geleden
 
Het beste is inderdaad om de PHP afhandeling boven het doctype te doen en alleen het echo├źn tussen de body tags. Natuurlijk moet je hier soms wat if en for statements bij maken, maar echte verwerking met er niet gebeuren.
Dennis Sluijk
Dennis Sluijk
9 jaar geleden
 
Ik had wel eens met vorige scripten dat header('location: '); het eerst wel deed en na een tijdje opeens niet meer dat vind ik raar.
Jacco Brandt
Jacco Brandt
9 jaar geleden
 
0 +1 -0 -1
Als je met een MVC-framework gaat werken, dan komt de HTML-code altijd als laatste, en hoef je je hier geen zorgen meer over te maken.
Eddy B
Eddy B
9 jaar geleden
 
0 +1 -0 -1
Wouter, mijn complimenten.. echt een hele nette uileg. Toch een klein beetje feedback: Is het misschien een idee om in het begin als je het hebt over HTTP request e.d. ook een stukje dieper erop in te gaan d.m.v. uitleg over DNS en rootservers?
Wouter J
Wouter J
9 jaar geleden
 
0 +1 -0 -1
@eddy, bedankt.
Deze tutorial heb ik vooral gemaakt om het probleem uit te leggen die je met de header already sent foutmelding krijgt. Om dit te begrijpen heb ik heel global even snel uitlegt hoe het werkt. Ik denk dat als ik dit uitbereid het niet duidelijker wordt voor beginners.

Het is wel goed om het een keer daarover te hebben, maar in deze tutorial wil ik het voorlopig even globaal laten.
Misschien dat ik het wel in een andere tutorial ga stoppen.
Eddy B
Eddy B
9 jaar geleden
 
0 +1 -0 -1
Goed punt, ik zie ernaar uit!
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Thomas van den Heuvel
Thomas van den Heuvel
5 jaar geleden
 
0 +1 -0 -1
Er zijn in principe twee manieren om "headers already sent" tegen te gaan:

1. Zorg ervoor dat output altijd is toegestaan (ook als er nog headers aankomen). Dit kun je doen door het versturen van output uit te stellen tot het einde van het script. Dit doe je met behulp van output buffering. Dit is als het ware een "emmer" die alle tekst die normaal op je scherm terecht komt (output) eerst opvangt in een buffer. Aan het einde van je script (zodra dus zowel output en headers zijn "verzonden") worden dan eerst je headers verstuurd, en daarna alle opgevangen output in de buffer (of buffers). De functie hiervoor is ob_start(). Je kunt de uitvoer ook comprimeren (gzippen) zodat er minder data over de lijn gaat.

Zelf ben ik niet zo'n voorstander (meer) van deze methode omdat het zorgt dat code en output (doorgaans HTML) hopeloos door elkaar gaan lopen, maar het is een mogelijkheid.

2. Zorg ervoor dat je geen output produceert als je (direct of indirect, denk aan cookies) headers gebruikt.
Dit kun je bereiken door je "pagina" op te delen in afzonderlijke acties elk met een specifiek doel. Bijvoorbeeld een contactpagina. Deze heeft de volgende acties:
- tonen van het formulier
- verwerken van het formulier
- bedankpagina na het verzenden
Alleen in de eerste en de laatste actie worden er zaken getoond op het scherm, in de verwerk-actie ben je alleen maar met het verwerken van het formulier bezig (geen output nodig) waarna je de browser gelijk doorstuurt naar de bedankpagina (of terug naar het invulformulier als deze onvolledig of verkeerd is ingevuld). Een bijkomend voordeel daarvan is dat "dubbelposts" ook minder vaak voorkomen. Dit patroon zorgt er tevens voor dat je code overzichtelijker wordt, en geen brei van geneste if-elseif-else statements.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.