Merhabalar bugün “header already sent” hatasını ele alacağız.

Bu hatanın sebebi aslında projemizin içerisinde birden fazla yerde header bilgisi göndermeye çalışıyor olmamızdan kaynaklanıyor. Örneğin bir PHP sayfanız var ve aynı zamanda bu siteye POST ya da GET metoduyla bir parametre gönderdiğinizde o sayfa bir dosya indirecek diyelim. İşte bu sırada dosyanın inmediğini ve aynı zamanda hata almadığınızı göreceksiniz. Hatayı almak için öncelikle PHP’nin hataları gösteren kodunu yazmanız lazım.

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Bu kodu yazdıktan sonra sayfadaki bütün PHP hatalarını göreceksiniz. Aynı zamanda bazı satırlarda header already sent hatasını aldığınızı göreceksiniz. Bu hatanın tam olarak nerede olduğunu anlamak için header(); metodunu kullanabilirsiniz.

Hataya gelecek olursak bu hatayı almamızı sağlayan şeylerden biri indirmenin başlayacağı kod bloğundan önce header parametresi göndermek olabilir. Yani eğer biz PHP ile sayfamıza header(“Content-Type: text/plain”); gibi herhangi bir HTTP Header parametresi oluşturmuşsak bu hatayı alırız. Çünkü sayfayı indirme işlemine zorlamak için zaten header parametresi oluşturmak zorundayız ( header(‘ Content-Disposition: attachment; filename=”indirilecek_dosya.uzanti” ‘); gibi). Bu hatayı bastırmak için ya önceki header kodlarını sileceğiz ya da indirme işlemini farklı bir sayfada yapacağız ve orada da tek bir header kodu yazacağız.

Ayrıca Javascript veya kütüphaneleriyle bir sayfaya post attığımızda da bu hatayı alabiliriz. Örneğin bir sayfaya post gönderdiniz ve gönderirken XMLHttpRequest.setRequestHeader(header, value) şeklinde header parametresi eklediniz. Burada size geri dönecek olan değer istediğiniz veri değil hata mesajı olacaktır. Bu durumda ya javascript kodunuzdan ya da php kodunuzdan header kısmını kaldırmanız gerekmektedir çünkü birden fazla header tanımlaması yapamazsınız. Ayrıca PHP’de header fonksiyonunu kullanmanız gerektiğinde PHP’nin basacağı HTML çıktıdan önce bunu yapmalısınız çünkü HTML çıktıdan önce headeri göndermiş olmanız gerekiyor. Şöyle düşünün, baştaki verdiğim indirme örneğine bakacak olursak bizim indirme işlemi için gerekli olan parametreyi gönderdiğimizde sayfanın veri türünü belirtmiş olmamız gerekiyor yani sayfanın bize hangi türde veri döndüreceğini belirtmemiz gerekiyor. (örneğin JSON) Bunu yapmak için header(‘Content-Type:application/JSON’); Kodunu kullanmalıyız. Biz bu kodu yazmadığımız zaman PHP varsayılan olarak sayfanın döndüreceği türü text/html olarak ayarlamaktadır.

Başıma geldiği için bu blogu yazmak istedim. Eğer sizde bu tarz hatalarla karşılaşıyorsanız iletişim kanallarım üzerinden bana ulaşıp paylaşabilirsiniz. İyi günler 🙂