Konuyu görüntüle
IUCODERS FORUM > Programlama > PHP > istenmeyen karakterlerin engellenmesi
Yazar
rambo


avatar

Kayıt: 16.10.2008
01.11.2008-14:49 #52143
merhaba,

mysql veritabanına kaydedilmek üzere kullanıcının girdiği metnin içinde geçmesi muhtemel olan bazı karakter sınıflarını (örneğin garip karakterler kullanılarak Türkçe kelimeler falan yazılıyor bazı forumlarda) engellemek istiyorum. kastettiğim karakterler sanırım ascii 0-255 aralığında bulunmuyor ve ben de karakter seti olarak utf-8 kullanmıyorum. veritabanı için latin5 http için ise iso-8859-9 kullanıyorum. bu nedenle bunları nasıl süzebileceğimi bulamadım.

normalde iso-8859-9 ile post yaptığımda bu tip karakterlerin sunucuya nasıl aktarıldığı hakkında bir fikrim yok. forma yabancı karakter girilerek gönderildiğinde php içindeki geçerli karakter seti kendiliğinden utf-8 olarak değişiyor mu? bütün bunları kontrol altında tutmak istiyorum. bu konuda tecrübeli arkadaşların yorumlarını bekliyorum.

teşekkürler...





rabbit rambo rulezzz


Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
01.11.2008-15:24 #52144
Sunucunun karakter kodlaması ne ise, sen değiştirmediğin sürece varsayılan olarak onu kullanır. Dolayısıyla karakter değişikliği yapmak istiyorsan herzaman sabit bir kodlama kullanmanı öneririm.

ISO da olsa UTF-8 de karakterler string değer olarak aynıdır fakat karakter numaraları seçmiş olduğun encodinge göre değişiklik gösterir. Birinde 100 x e denk gelirken diğerinde Y ye denk gelebilir. Karakter kodundan değişiklik yapacaksan hatalı bir işlem yapmış olursun.

Tam olarak nerede kullanacaksın bu fonksiyonu bilmiyorum fakat benim tavsiyem karakterleri veritabanına olduğu gibi sokman sonra da gösterirken değiştirmek istediğin şeyleri değiştirmen olur.





N/A
Yazar
rambo


avatar

Kayıt: 16.10.2008
01.11.2008-17:41 #52148
░▒▓■□▪▫▬▲►▼◄◊○●◘◙◦☺☻☼♀♂♠♣♥♦♪♫


yukarıdaki karakterler bu mesajımda görünür mü bilmiyorum ama kastettiğim bunlar gibi 0x21-0xFF aralığı dışındaki karakterler. ben bunları tespit edip katardan temizlemek istiyorum. çünkü böyle karakterler latin5'de "Incorrect string value" hatası nedeniyle veritabanına kaydedilmiyor. şimdilik veritabanını karakter setini utf-8 olarak değiştirmeyi düşünmüyorum. ama eğer php ile bu temizliği yapamazsam field'ları utf-8 yapacağım son çare olarak.





rabbit rambo rulezzz


Yazar
burakkanmaz


avatar
Gaziantep
Kayıt: 02.10.2006
01.11.2008-19:57 #52151
Aşağıdaki kod işine yarayabilir peace

<?PHP
function char_replace($string)
    {
        $string = str_replace("◄", "", $string);
        $string = str_replace("▼", "", $string);
        $string = str_replace("►", "", $string);
        $string = str_replace("▲", "", $string);

        return($string);
    }
?>






Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
01.11.2008-19:58 #52152
Öyle yapmak yerine şey yap. İzin verilen karakter listesini bir arraye at onların dışındakileri kabul etme. Çünkü karakter kodundan temizlik yapmaya çalışırsan kodlar tutmayacaktır.





N/A
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
01.11.2008-20:22 #52153
iucoders in veritabanı latin5 bu karakterlerde bende düzgün çıkıyor. senin derdin başka birşey olması lazım.





N/A
Yazar
rambo


avatar

Kayıt: 16.10.2008
01.11.2008-20:41 #52154
burakkanmaz yazdi
 
Aşağıdaki kod işine yarayabilir peace

<?PHP
function char_replace($string)
    {
        $string = str_replace("◄", "", $string);
        $string = str_replace("▼", "", $string);
        $string = str_replace("►", "", $string);
        $string = str_replace("▲", "", $string);

        return($string);
    }
?>

teşekkür ederim ama izin vermediğim karakterlerin tamamı için bu işlem çok zahmetli olur. ayrıca dosyayı utf-8 olarak kaydetmek gerekiyor. üstelik editörler de (dw) böyle karakterler ile çalışırken sapıtıyorlar. regular expression kullanmayı denedim ama 0x0100-0x00FF aralığını tanımıyor. izin verilen aralığı (0x21-0xFF) belirleyip not yaparak preg_replace yaptığımda da temizlik yapmıyor.

şimdilik

$str = iconv('UTF-8', 'ISO-8859-9', $str);

kullanıyorum. o da geçersiz karakterden sonrasını atıyor. bu denemeleri elle yazarak yaptım, dolayısıyla dosyanın formatının da utf-8 olması gerekiyor. henüz http post verileri üzerinde test yapmadım. belki i/o karakter setlerini ayarladığımda istenmeyen karakterler kendiliğinden süzülebilir.

bir de php'de mulitbyte string fonksiyonları varmış. belki de aradığım yanıt onların içinde vardır. bu multibyte string fonksiyonları hakkında bilgisi olan varsa paylaşabilir mi? bu işte yeni sayılırım. fırsat bulduğumda bu konulara kendim de çalışacağım ama bir bilen yardım ederse bu konuda çok zaman kazanabilirim.
tekrar teşekkür ederim ilginiz için.





rabbit rambo rulezzz


Yazar
rambo


avatar

Kayıt: 16.10.2008
01.11.2008-20:47 #52155
orhan yazdi
 
iucoders in veritabanı latin5 bu karakterlerde bende düzgün çıkıyor. senin derdin başka birşey olması lazım.

sayfa kaynağında bütün karakterlerin html entity süzgeçinden geçtiği görülüyor. yani hepsi veritabanına o şekilde kaydedilmiş :)

ben de htmlentities fonksiyonunu deneyeceğim, sonuçları burada paylaşırım.





rabbit rambo rulezzz


Yazar
rambo


avatar

Kayıt: 16.10.2008
02.11.2008-19:10 #52181
bugün http post kullanarak bazı denemeler yaptım.


1) formu gönderen sayfanın karakter seti örneğin ISO-8859-9 olduğunda karakter setine aykırı olan karakterler tarayıcı tarafından html entity olarak encode edilerek sunucuya gönderiliyor.

yani karakteri ♥ koduna dönüştükten sonra sunucuya gönderiliyor. bu nedenle bu tip karakterleri özellikle bir süzgeçten geçirmeye gerek kalmıyor.


2) formu gönderen sayfanın karakter seti UTF-8 ise bütün karakterler (sanırım) olduğu gibi sunucuya gönderiliyor. fakat interpreter ile mysql arasındaki köprü "latin5" olarak ayarlandığında eldeki karakterler latin5'e göre şekil alıyor.

yani karakteri 0xE299A5 olarak sunucuya gönderildiği halde, 3 byte'dan oluşan bu karakter köprüde 3 farklı karaktere ayrılıyor (0xE2, 0x99 ve 0xA5) ve bu şekilde 3 farklı karakter olarak sorunsuzca latin5 olarak ayarlanmış field'a kaydedilebiliyor.


buna göre karakter seti latin5 olan field'lara sorunsuzca veri kaydetmek için bağlatıyı latin5 olarak ayarlamak yeterli sanırım. ben behsettiğim hatayı phpmyadmin ile çalışırken alıyordum ve phpmyadmin mysql bağlantısını utf-8 ile yaptığı için "incorrect string value" hatasını alıyordum sanırım.

mysql_query('set names latin5');








rabbit rambo rulezzz


Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb