|
|
| |||||||
| PHP R10.net Php sevenler klubü. Kodlama soru(n)ları & acil php yardım hattı. |
| |
|
| | | LinkBack | Seçenekler |
| |||
| Merhaba arkadaşlar, Foruma üye olduğum günden bu yana en çok gördüğüm ve forumdaki arkadaşlarımızın yardım istediği hatanın bu olduğunu gördüm; "Warning: Cannot modify header information - headers already sent by" Ben de bu hatanın nasıl giderileceğini anlatacağım ki işine yarayan hemen çözüme kavuşsun. İlk olarak bunun sebebi nedir? utf-8 bom (yani byte order mark)'tır. Ne işe yarar bom? utf-8 dil desteği olmadan önce bom diye bir şey yoktu. utf-8 çıktıktan sonra hayatımıza girdi. kullandığımız metin editörü programlarında, php sayfamızı kaydederken eğer "utf-8 bom" seçili ya da default kaydetme modundaysa, bizim göremeyeceğimiz bir kod parçacığını sayfamızın en üstüne ve hatta <?php tagından da önceye ekler. Bunun amacı tamamen "bu sayfanın dil kodlaması utf-8'dir" mesajını vermek içindir. Fakat sayfa içinde kullandığımız bazı fonksiyonlar ve html dil tagları ile genelde çakışır ve biz hata alırız. Çünkü sayfa içinde html tagları "<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />" kullandığımızda zaten biz o sayfanın utf-8 dilinde olduğunu belirttiğimizden, sorun yaşarız. Bizim göremediğimiz bu utf-8 kod parçacağını browser görür ve hata ekrana basar. Bu da sayfanın tam olarak çalışmamasına sebep olur. Bu hatayı almamızın diğer sebebi de kullandığımız "header" fonksiyonudur. Biz çoğu zaman header fonksiyonunu yönlendirme, sayfanın ne olduğunu belirtme ve dil belirtmek için kullanırız. header fonksiyonunun türkçesi "başlık" tır. Biz bu fonksiyonu kullandığımızda sayfa ile ilgili bilgileri başlığında belirtmiş oluyoruz. Browser'lar da ona göre sayfamızı yorumluyor. mesela PHP- Kodu: PHP- Kodu: Sebeplerini ve nedenlerini öğrendiğimize göre bu sorunun çözümlerini yazayım; İlk olarak php sayfamızın en üstüne <?php ya da <? tagının hemen altına satır atlamadan PHP- Kodu: PHP- Kodu: Bu sorunun devam etmesinin sebebi ise daha önce sayfayı kaydederken utf-8 bom olarak kaydetmenizdir. Çözümü ise; sayfayı bir metin editörü ile açın (notepad++ / dreamweaver / zend studio v.s.) ve farklı kaydet (save as) yaparak "benim tavsiyem mevcut dosyanın üzerine değil, başka bir klasör içine kaydetmeniz" "UTF-8 Without BOM" seçeneğini seçerek kaydetmeniz. Dreamweaver'da farklı kaydette ise altta "Include Unicode Signature (BOM)" seçilidir, seçimi kaldırarak. Ama ben bunu yaptım ve hala hata alıyorum diyorsanız, atladığınız bir şey var; Bu işlemi tüm php dosyalarınızı kontrol ederek yapmanız. Çünkü örneğin siz "yazi.php" dosyasında hata alıyordunuz ve bu işlemleri yaptınız ama hata almaya devam ediyorsanız bu sayfa içerisine include ile çağırdığınız "db.php" gibi veritabanına bağlanma dosyalarınızı da düzeltmelisiniz. Ek olarak bir bilgi daha vereyim; Bu işlemi yaparken sayfa içindeki "türkçe" ya da ingilizce dışında bir dilde yazılan yazılarda bozulma olabilir. Çünkü siz sayfayı BOM ile kodlamıştınız ve o yazdığınız yazılar o dil koduna göre kaydedilmişti. Buna engel olmak için benim tavsiyem şöyle yapmanızdır. Örneğin çalıştığınız klasör içinde yazi.php | db.php | index.php | haber.php gibi dosyalarınız var. Gidip başka bir klasör açın. yazi.php yi bir yazı editörü ile açın daha sonra yeni bir php çalışma sayfası açıp farklı kaydet yaparak boş bir şekilde ama utf-8 without bom'suz kaydedin. Daha sonra yazi.php içindeki tüm kodları kopyalayıp, yeni klasörünüze kaydetmiş olduğunuz yeni ama içi boş olan yazi.php dosyasının içine yapıştırıp kaydedin. Böylelikle o sayfaların içinde daha önceden yazılmış olan ingilizce dışındaki hiç bir karakterde bozulma meydana gelmez. AMA! Bunlardan önce projenize ilk başlama aşamasında sayfalarınızı kaydederken utf-8 without bom'suz çalışırsanız bu kadar şeyle uğraşmak zorunda kalmazsınız. İnşallah yardımcı olabilir. İyi Forumlar.
__________________ kişisel web sitem; http://www.fatihsarac.com.tr |
| |||
| Alıntı:
Ayrıca session hatasının nedeni ile ilgili asıl problemi söylemeyi unutmuş FatihSarac arkadaşımız. Asıl problem session başlamadan önce çıktı olmaması gereğidir. headers already sent hatası için asıl neden bom ya da header fonksiyonu değildir. session_start() öncesi tarayıcıya gönderilecek her çıktı bu hataya neden olur. çünkü oturum bilgisinin çıktı verilmeden önce başlatılması gerekir. sadece header, bom değil. eğer php açmadan bir karakter boşluk bırakırsanız sayfa kodunda yine hata alırsınız bir satır çıktı tarayıcıya gideceği için. bom da zaten budur, görünmeyen bir tanımlama kodudur sayfa başında ve çıktı olduğu için session ı bozar. ve sadece header değil, session start öncesi çıkacak herhangi bir echo, print, print_r veya çıktı üretecek başka kodlar da bu hataya neden olur. yeni session_start ile başlanacak bir oturum sayfasına bu komuttan önce görünür ya da görünmez hiç bir çıktı göndermemeniz gerekmektedir. |
| |||
| Alıntı:
__________________ kişisel web sitem; http://www.fatihsarac.com.tr |
![]() |
| Bookmarks |
| Seçenekler | |
| |