✦ Oplossingen · PHP-fouten

Cannot modify header information - headers already sent

'Warning: Cannot modify header information - headers already sent by (output started at …)' komt door uitvoer vóór header(), setcookie() of session_start(). Vaak een spatie, lege regel of BOM.

Waarom gebeurt dit?

HTTP-headers (zoals doorsturen, cookies en het type inhoud) moeten worden verstuurd vóór de eerste byte van de pagina. Heeft PHP al iets naar de browser gestuurd, zelfs één spatie, dan kan een latere header(), setcookie() of session_start() dat niet meer doen. PHP geeft dan deze waarschuwing.

Het belangrijkste deel van de melding staat tussen haakjes: (output started at /pad/bestand.php:12). Daar begon de uitvoer, en daar zit dus de oorzaak, niet op de regel met header().

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Ga naar 'output started at'

    Open het bestand en de regel die in de melding staat. Dat is de plek waar de eerste uitvoer ontstond.

  2. Haal witruimte rond de PHP-tags weg

    Een lege regel of spatie vóór <?php, of na een afsluitende ?> aan het eind van een bestand, wordt naar de browser gestuurd. Laat de afsluitende tag in bestanden met alleen PHP-code helemaal weg.

    <?php
    // bestand met alleen PHP: géén ?> aan het eind
    function voorbeeld() {
        return true;
    }
  3. Verwijder een BOM

    Sommige editors zetten onzichtbaar een byte order mark (BOM) aan het begin van een UTF-8-bestand. Sla het bestand op als 'UTF-8 zonder BOM'. Op Linux kun je het controleren.

    head -c 3 bestand.php | xxd
    # begint met efbbbf? Dan staat er een BOM in.
  4. Verplaats echo/print naar ná de headers

    Staat er bewust uitvoer (echo, HTML, var_dump) vóór header('Location: …'), zet de header-aanroep dan eerder in het script, vóór alle uitvoer. Na een doorverwijzing hoort direct exit.

    <?php
    header('Location: /bedankt/', true, 303);
    exit;
  5. Laat warnings geen uitvoer worden

    Ook een PHP-notice of -warning die op het scherm komt, is uitvoer. Zet display_errors uit op een live site en log fouten in plaats daarvan; los de onderliggende notice natuurlijk ook op.

Let op: output_buffering of ob_start() maskeert het probleem: de uitvoer wordt dan vastgehouden. Dat kan als noodverband, maar zoek de echte oorzaak, anders komt het terug zodra de buffer vol is.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Ik zie de fout pas na een plugin-update in WordPress.

Een bestand van die plugin of van je thema begint of eindigt met witruimte of een BOM. De melding 'output started at' wijst het bestand aan.

Waarom werkt het op de ene server wel?

Als output_buffering op die server aanstaat, wordt kleine uitvoer opgevangen en zie je de fout niet. Op een server zonder buffering komt hij wel.

Heeft dit ook gevolgen voor inloggen?

Ja. Kan de sessiecookie niet worden gezet, dan raak je na elk formulier je sessie kwijt. Zie session_start(): headers already sent.