php - prematüre başlıkları sızıntı izini

7 Cevap php

Ben bir sitede () set_cookie kullanıyorum. Bazı işlevler ekledikten sonra, ben Warning: Cannot modify header information - headers already sent by... hata alıyorum. Satır numarası başlatılan başlıkları set_cookie () olan çok çizgi olduğu gibi başvuruları It! Ve ben iki kez çağrılan değil, kontrol.

Ben nasıl bu erken başlıkları aşağı izleyebilirsiniz? Ben kaynak kodu baktı ve benzeri hata mesajı ben XDebug kullanıyorum (başlar, bu nedenle ilk şey bir
, which I thought was me, but is actually the beginning of the xdebug message ). I've grepped my code for extra echo ve daha önce herhangi bir sokak karakterleri ya da bir şey görmedim - Hiçbir şey.

Ne zaman ve nerede başlıkları başlıyor PHP bana söyleyebilir? Ya da gerçekten set_cookie hattında başlayan ve bu yüzden eğer, nasıl bu duruma kendimi aldık ve nasıl alabilirim?


düzenleme: Ben kodu yapıştırabilirsiniz emin değilim - sadece set_cookie () hat istiyorsun? Ben başlıkları daha önce çıkan sanıyordum. Ve farklı sınıflar örneğinin ile bundan önce devam eden bir şey var. Ve ayrıca ben bütün sınıfları ve malzeme gönderebilir sanmıyorum - sen, mülkiyet bilgileri ;) biliyorum


Düzenleme: Ben bütün sonlandırma ayraçları (Tüm ?> s) kurtulmak ve her dahil dosyanın ilk karakteri olduğundan emin kazanılmış <?. Bu sinir bozucu! Ben bu son değişiklikleri yaptım önce çalışıyordu: (((

Ayrıca, neden headers_sent() çalışmıyor?

if ( headers_sent($filename, $linenum) ) { 
    echo "headers sent: $filename:$linenum."; 
}   
set_cookie(...); 

verir

headers sent: :0. 

7 Cevap

Ben buldum! Bir flush(); ben sayfalardan birinde tek başına çevresindeki tüm yalan bırakmıştı oldu. Şaşırtıcı bir şekilde, doğru $filename bağlanmaz ve $linenumber headers_sent() için.

Bir yaklaşım null yönlendirildi STDERR ile komut satırından komut çalıştırmak olacaktır.

Bu size STDOUT gönderiliyor şeyi, sunucu istemciye göndermek istiyorsunuz yani her şeyi gösterecektir.

Bunu görmek kez başlıklarını nereden geldiğini Umarım, bu açık olacak.

Kullanmanın yanı sıra headers_sent to detect if the HTTP header has already been sent, you could use the PHP’s output control çıkışını tampon. Yani zaten bazı çıkışını yaptık bile başlığını değiştirmenizi sağlar.

İşte arayarak açık çıktı tamponlama kullanarak bazı örnek ob_start :

ob_start();
echo 'foobar';
header('Content-Type: text/plain;charset=utf-8');

Ama herhangi bir çıkış yapıldı önce emin ob_start çağrı yapmak. Aksi HTTP başlık muhtemelen gönderildi.

Eğer kodu yapıştırın miyim?

Onun söyleyerek başlıklar zaten [set_cookie olan hat] tarafından gönderilen, daha sonra hata komut daha üzerinde.

Eğer herhangi öncesinde set_cookie () başlatma için çağrıldığını dosyaları içerir yok emin misiniz? Eğer sen yapmak oturumu başladı, sadece komut aynı noktada çerez ayarlayabilirsiniz, çünkü oturumları çalışan var mı.

Hatta tek bir beyaz boşluk sizin set_cookie () başlatma önce varsa o üstbilgileri doğru gönderilmeyecek neden olur. Belki farklı bir editör kullanarak ve sonuçları kontrol etmeyi deneyin.