PHP tabanlı bir Linux firewall yönetim projesi ( NAT için ) yazarken karşılaştığım bir hatayı paylaşayım. Yaklaşık 4 saatlik bir çaba sonucu çözüme ulaşmak ayrı bir heyecan verirken, hatanın ve çözümün basitliği ise ayrı bir hüsran.
Senaryo ;
Jquery Ajax ile PHP den istek yapılıyor geriye dönüş olarak JSON formatı döndürülerek, gelen bilgilere göre birkaç atraksiyon yapılacak. Bu atraksiyon için JSON verisi önemli.
Problem ;
PHP tarafında json_encode( $arr ) edilmesine karşın AJAX tarafında herhangi bir dataType belirtilmiş iken ( ‘JSON’ olarak ) olmasına rağmen console.log( data ) hiçbir şekilde cevap vermiyor. dataType kaldırıldığında ise string halde JSON verisi gelmekte. dataType : JSON denildiğinde gelmemekte.
Fazla uzatmaya gerek yok. Hemen hemen tüm projelerinizde aynı yapıyı kullanıp, bir projede çalışmadığına şahit olmuşsunuzdur – ki diğer sayfalar çalışmakta, sadece o sayfa çalışmamakta -. Bizimkisi de o hesap ( CTRL + c / CTRL + v olduğundan :).
Hata ;
Notepad++ vb. bir editor kullanıyorsanız dosyalarınızı kaydederken UTF-8 / ASCII / UTF-8 Bomlu / Bomsuz vb. dosya kayıt seçenekleri mevcut. Çalışmayan sayfanın / dosyanın kayıt türü UTF-8 BOM olarak kayıt edilmesiymiş.!
Çözüm ;
Dosyalarınızı UTF-8 Bomsuz olarak kaydetmeniz çözüme ulaşmanızı sağlayacak. 🙂
Bu arada Tarayıcı tarafında incelendiğinde Chrome / Mozilla vb. tarayıcılarda aşağıdaki gibi bir “\ufeff{\” vb. saçma sapan karakterlere rastlarsanız bilin ki problem UTF- 8 ve yandaşları. !
Bu problem kanımca sadece PHP platformlarında yaşanıyor da olabilir yaşanmıyor da olabilir. Başka bir platformda yaşanıp çözümü bu şekilde değilse paylaşabilirseniz sevinirim.
Hemen hemen her zaman dediğimiz gibi; Başka canlar yanmasın. 🙂
Bu sorunu şu şekilde hallediyordum ki bir baktım aslında geçici çözümmüş.
Şöyle;
$array[‘mesaj’]=’aabbb’;$array[‘islem’]=’Şubu’;
ob_clean();
header(‘Content-Type: application/json’);
echo json_encode($array);
tabi yaptığım bir işlem de include ile çağırdığım sayfada ob_clean kullanınca tüm css php destekli java işlemlerim silinmiş oldu araştırmalarım arasında sizin yazınızı da gördüm tüm dosyaları tek tek farklı kaydetmek gerçekten çok zor geldi kaldı ki bazı dosyalarda işe yararken bazılarında işe yaramadı sebebini bilmiyorum. Fakat şöyle bir çözüme ulaştım;
http://evgv.github.io/php/bom/2016/09/30/php-find-and-remove-bom-symbols-from-files.html
Tüm dosyaları tarayarak gerekli silme işlemini yapıyor ayrıca bu scripte bir de taradığı dosyaları göstermesi amaçlı olarak
fonksyonların önüne yani 49. satıra
$d = dir(“$HOME”);
echo “Handle: ” . $d->handle . “\n”;
echo “Path: ” . $d->path . “\n”;
while (false !== ($entry = $d->read())) {
echo $entry.”\n”;
}
şöyle birşey ekledim. Araştırma yapanlara yardımcı olabilir gerekçesiyle burada da paylaşmak istedim.
Paylaşımın için teşekkürler.
Tek tek yapmak dediğiniz gibi uğraştırıcı bir işlem olabilir.
Genellikle dosya yapısından arada bir bu tarz hatalar aldığımız için paylaşmıştım.
Var olan bir sistemde böyle bir hatanın çözümü sizin paylaşmış olduğunuz yapıyla daha hızlı çözülebilir.