Preface

Jadi gue kan bikin ini. Terus gue upload, terus programmnya kagak jalan seperti di localhost. Gue frustasi. Anjing! Iya, gue mengumpat. Gue cek sessionnya kok gak muncul. Terus gue nge-duckduckgo pesan eror yang gue salin dari error_log, yaitu : Warning: Cannot modify header information - headers already sent by (output started at /some/file.php:12) in /some/file.php on line 23. Kira-kira gitu lah, itu juga gue salin dari stackoverflow. Pokoknya masalahnya itu si header lah.

Alhamdulillah men, gue nemu jawaban yang cukup lengkap. Terlalu lengkap malah. Sampe gue pusing sendiri. Tapi jadinya program gue jalan.

Untuk mempermudah kamerad-kamerad programmer pemula di luar sana, ini gue terjemahin sebisa gue apa yang gue dapet dari stackoverflow. Terimakasih untuk Moses89 yang udah nanya, dan untuk mario yang udah ngejawab.

Ini murni cuman terjemahan doang. Bagi yang ngerti bahasa inggris mending langsung baca sumber aslinya. Iya gue tau gue pernah kuliah sastra inggris, tapi gue bego, jadinya ini terjemahan jangan harap brilian. Tapi gue coba sebagus mungkin supaya lo para newbie bisa menyelesaikan masalah yang bikin kesel ini.

The translation

Artikel asli bisa dibaca di: https://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php/8028979#8028979


Fungsi yang mengirim atau memodifikasi HTTP headers harus dijalankan sebelum ada output apapun.

Beberapa fungsi yang memodifikasi HTTP header adalah:

  • header()
  • header_remove()
  • session_start()
  • session_regenerate_id()
  • setcookie()
  • setrawcookie()

Output bisa jadi:

  • Tak disengaja

    • whitespace sebelum <?php atau setelah ?>
    • UTF-8 Byte Order Mark
    • Pesan eror atau notices sebelumnya
  • sengaja

    • print, echo dan fungsi lain yang memproduksi output.
    • Raw <html> sebelum kode <?php

Kenapa itu terjadi? Untuk mengerti mengapa headers harus di kirim sebelum output, harus ngerti dulu HTTP response.

Skrip PHP biasanya generate konten HTML, tapi juga mengirim set HTTP/CGI headers ke webserver

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html>
  <head>
    <title>Halaman Output PHP</title>
  </head>
  <body>
    <h1>Content</h1>
    <p>Beberapa output lainnya...</p>
    <a href="/"> <img src=internal-icon-delayed> </a>

Lalu, lo liat tuh pesan error-nya. Di line berapa tuh masalahnya?

Penyebab:

1. print, echo

Output yang disengaja dari print dan echo akan menghentikan kesempatan untuk mengirim HTTP headers.

Fungsi yang memproduksi output diantaranya:

  • print, echo, printf, vprintf
  • trigger_error, ob_flush, ob_end_flush, var_dump, print_r
  • readfile, passthru, flush, imagepng, imagejpeg

Solusi:
Flow aplikasinya harus di atur lagi untuk menghindari itu. Gunakan fungsi dan templating schemes. Pastikan header() dipanggil setelah pesan ditulis

2. Area Raw HTML

HTML yang gak di parse dalam file php adalah output langsung juga. Kondisi skrip yang akan mentrigger pemanggilan header() harus di tulis sebelum blok raw html

<!DOCTYPE html>
<?php
    // jangan panggil header() di sini, udah telat.

Solusi:
Gunakan skema template untuk misahin logika proses dari output.

  • simpan form proses di bagian paling atas skrip
  • gunakan variabel string temporer (temp) untuk menunda pesan
  • logika output aktual dan output campuran HTML harus disimpan di akhir

3. Whitespace sebelum <?php

Jika warning mengacu pada output di line 1, maka kemungkinan besar itu adalah permasalahan whitespace pada text atau HTML sebelum tag pembuka <?php

 <?php
// ada single space atau newline sebelum <?

<?php
// ini gak ada space

Ini juga bisa terjadi ketika ada penambahan script php baru

?>

<?php

Ngapain juga lu bikin gituan ya? Kan bisa ditulis di dalem satu tag aja kan.

Solusi:
Hapus whitespace-nya.

4. UTF-8 BOM (Byte-Order-Mark)

Linebreak dan spasi juga bisa jadi masalah, mereka adalah invisible character sequences yang bisa menyebabkan masalah ini.

UTF-8 BOM seringkali tidak ditampilkan oleh sebagian besar text editor.Namun PHP harus memperlakukan itu sebagai raw output. Itu mungkin akan ditampilkan sebagai karakter  jika client menerjemahkan dokumen sebagai Latin-1, misalnya.

Solusi:
Atur text editor lu untuk nge-save file as “UTF-8 (no BOM)".

5. Whitespace setelah ?>

Apabila erornya terjadi setelah tag penutup ?>, maka di sinilah whitespace atau raw text berada.

Solusi:
Hilangkan whitespace-nya

6. Sumber eror “Unknown on line 0”

Ini mah settingan dari php.ini - nya.

Solusi:
Benerin weh, googling aja.

7. Pesan eror sebelumnya

Eror yg terjadi bukan di masalah header, tapi biasanya di line sebelum itu. Makanya hasilnya jadi prematur.

Solusi:
Benerin erornya atau tunda eksekusi skripnya atau gunakan isset().

Dah segitu dulu aja terjemahan dari pemahaman amburadul gue. Tapi percayalah, gue ngelakuin apa yang gue lakuin di atas, dan program gue lancar jaya.

Ini belum selesai, masih ada yang ingin gue terjemahin karena gue juga ingin pelajarin lebih lanjut.