İpuçları

Plazma'nın 3. sayısı için aklıma gelen ilk 3 PHP ve 3 JavaScript ipucunu sizlerle paylaşmak istedim.

PHP

1) PHP'den COM objeleri kullanmayı deniyorum ama CGI Error deyip duruyor. İşin ilginç tarafı web'de bulabildiğim tüm çözümleri denedim ama hala aynı hatayı alıyorum.

Bu durumda olay görüntüleyiciyi (event viewer) bir kurcalamanızı tavsiye ederim. Sistem'de DCOM hataları görmeniz olası.

Türkçe : Başlat->Ayarlar->Denetim Masası->Yönetimsel Araçlar->Bileşen Hizmetleri

İngilizce : Start->Settings->Control Panel->Administrative Tools->Component Services

Bu bölümden kullanmak istediğiniz bileşene yetki vermeniz gerekiyor. Bileşeni bulup (Örnek: Microsoft Excel Application) üzerine sağ tıkladığınızda çıkan menüden ayrıntılara, oradan da yetkilere girip bu bölümde özel yetki vererek "Lokal Etkinleştirme" yetkisini açmanız gerekiyor. Zaten bu bahsettiğim yetki olay görüntüleyicisindeki hata mesajında da belirtiliyor.

2) PHP'de bir extension'ı açıyorum ve PHP hata vermeye başlıyor. Extension klasörüm doğru, dll mevcut, dll'i PHP'nin kök dizinine, system32 klasörüne, oraya buraya da kopyaladım ama hala aynı hatayı alıyorum, çıldırmak üzereyim.

Bu durumda çalıştıramadığınız DLL hakkında biraz daha doküman okuyun. Büyük olasılıkla başka DLL'lere ihtiyaç duyuyordur. PHP'nin tüm extension'ları tek bir DLL'den oluşmazlar.

Örnek: php_ldap.dll'i kullanmanız için PHP 4.2.x serisine kadar olan versiyonlarda libsasl.dll, 4.3.0 ve üstü versiyonlarda ise libeay32.dll ve ssleay32.dll'i system32'ye kopyalamanız gerekiyor. Bu tür DLL'leri PHP'nin binary paketinde (exe installer'da bu extension dll'leri bulunmaz) bulmanız mümkün. Genellikle "system" isimli bir klasör içerisinde extension DLL'lerin ihtiyaç duyduğu tüm DLL'ler geliyor.

3) Session'la ilgili sorun yaşıyorum. Session değişkenlerinden birine bir değer verip "header('location:blabla')" şeklinde başka bir sayfaya yönlendiriyorum ama o sayfada değişkenin değeri düzgün okunmuyor. Ama sayfayı refresh edince düzeliyor. Niye ki?

Aslında niyesi çok uzun açıklama gerektiriyor ve server tarafında çözümü de mümkün. Ancak bu tür durumlardan kurtulmanın en kesin çözüm yolu sayfayı "header" ile değil de HTML'in "meta" tag'iyle yönlendirmek. Yani

<?php ... ... ...

header('location:blabla'); exit; ?> yerine

<?php ... ... ... ?> <html> .... .... <meta http-equiv="Refresh" content="0; url=blabla"> .... .... </html> şeklinde kullanarak bu sorunun üstesinden gelebilirsiniz.

JAVASCRIPT

1) Elimde bir sayfa var ama kodlarına erişimim yok ya da değiştirmek istemiyorum. O sayfanın HTML yapısını başka türlü kontrol altına alabilir miyim?

Erişiminiz olan sunucularınızda çalışan sayfaların kodları elinizde olmasa bile (örnek: Zend Guard ile encode edilmiş bir proje, compile edilmiş CGI çıktıları v.b.) onlar üzerinde JavaScript kullanarak hakimiyet kurabilirsiniz. Bunun için sayfayı frame içerisine almak gerekiyor. Örnek:

Normalde index.php ile açılan bir sayfamız olduğunu varsayalım. Bu durumda biz aşağıdaki index_alt.htm'i oluşturarak sayfanın görünümünü değiştirmeden araya gizli bir frame içerisinde "gizli.htm"i sokmuş oluyoruz.

index_alt.htm

<html> ... <frameset rows="*,0"> <frame name="anasayfa" src="index.php"></frame> <frame name="gizli" src="gizli.htm"></frame> </frameset> ... </html>

Buradaki rows="*,0" ile index.php'yi tüm alanı, yani browser'ın tamamını kaplayacak şekilde, gizli.htm'i 0 yüksekliğinde yani aşağıda görünmeyecek şekilde tanımlıyoruz. Buradaki sıralama önemli. gizli.htm'i önce tanımlayacak olursan index.php henüz yüklenmeden gizli.htm çalışmış olur ve index.php'nin içinde yüklenen çeşitli bölümlere erişemeyebilir. index.php'nin yüklenmesini garantilemek istiyorsak en geçerli yol gizli.htm'e bir sayaç ekleyerek kodun belirli bir zaman geçtikten sonra çalışmasını sağlamaktır.

function yap() { .... } setTimeout("yap()", 1000); // 1 sn sonra gibi.

Peki gizli.htm tam olarak ne yapmamıza yarıyor? Bu tamamen sizin arzunuza bağlı. Size yapılabileceklerden birini aşağıdaki örnekte veriyorum. Bu örnek yardımıyla index.php'de yüklenen ilk resmin üzerinde sağ click'e basıldığında çıkan menüyü iptal ediyoruz.

gizli.htm

<html> ... <script> parent.window.frames["anasayfa"].document.images[0].oncontextmenu = function(){ return false; }; </script> ... </html>

Peki tam olarak ne yaptık burada?

parent ile bir üst obje seviyesine çıktık, yani index_alt.htm'de tanımladığımız frame'lerin her ikisinin de bulunduğu seviyeye. Daha sonra window.frames["anasayfa"] diyerek "anasayfa" yani "index.php"nin yer aldığı bölüme ulaştık. document.images bu sayfada yer alan tüm resimlerin bulunduğu dizi. document.images[0] ile ilk resmi seçtik. Son olarak "oncontextmenu" ile sağ mouse click event'ini kendi yarattığımız bir fonksiyona yönlendirdik. Bu fonksiyon ise "return false" komutuyla event'i gerçekleşmeden durdurmaya yarıyor. return false yerine alert('deneme') yazarak da script'i test edebilirsiniz.

Tabii ki bu en basit kullanım örneklerinden biri. Bu yöntemle sayfa içerisindeki hemen her şeyi kontrol etmeniz, elementler eklemeniz, değiştirmeniz hatta yok etmeniz mümkün. Ancak unutmayın ki bu kullanım lokal sayfalar için geçerlidir. Yani web server elinizin altında değilse ve index_alt.htm, gizli.htm dosyalarını index.php'nin olduğu server'a koyamıyorsanız, bu durumda bu yöntem işe yaramayabilir.

2) Dinamik olarak nasıl element yaratabilirim? Bunlara nasıl event ekleyebilirim?

Javascript'te az önce gördüğümüz örnekteki event tanımlama kullanımı her zaman işe yarıyor mu? Aslında çoğunlukla yarar. Ancak bir de dinamik olarak yaratılan elementler var ki bu durumda işler biraz değişebiliyor. Size aşağıdaki kullanımı tavsiye ediyorum.

<html> ... <body> <div id="tasiyici"></div> <script> function goster(yazi) { alert("Textbox'a girmiş olduğunuz yazı: "+yazi+"\nİşte dinamik elementlerin gücü!"); } var textbox = document.createElement('input'); textbox.setAttribute('type','text'); textbox.setAttribute('size','50');

var button = document.createElement('input'); button.setAttribute('type','button'); button.value = 'Onayla'; if(document.addEventListener) // Firefox button.addEventListener('click',function(){ goster(textbox.value); },false); else if(document.attachEvent) // Internet Explorer button.attachEvent('onclick',function(){ goster(textbox.value); });

tasiyici.appendChild(textbox); tasiyici.appendChild(button); </script> </body> </html>

Burada "tasiyici" isimli bir "div"imiz var. HTML içerisinde başka da bir şey yok. Biz script alanında dinamik olarak bir textbox bir de button tanımlıyoruz (ikisi de input elementinin türevleridir). Daha sonra button'a Firefox'da addEventListener, Internet Explorer'da attachEvent komutlarıyla click event'ini "goster" fonksiyonuna yönlendiriyoruz. Aslında burada kısaca "goster" yazabilirdik "function(){ goster(textbox.value); }" yerine. Fakat bu durumda parametre veremezdik. Biz textbox'ın değerini de fonksiyona yollamak istediğimiz için "function() {}" ile o noktada dinamik bir fonksiyon yarattık ve "goster" fonksiyonunu textbox'ın içine yazılan değer ile (textbox.value) çağırdık.

Aslında input gibi form nesneleri bir form olmadan kullanılmaz. Ancak bu örnekte örneği daha da karmaşıklaştırmamak için form kullanmadım. Bazı eski browser'lar form tag'i olmadan form objelerini göstermezler bile. Günümüz browser'larının teknolojisine dayanarak bu örneği bu şekilde kullanmaktan çekinmedim.

3) C/C++'da argv, argc, va_arg bişiler yapıyorduk. Javascript'te fonksiyonların argüman sayılarını nasıl alabilirim?

Javascript argümanlar konusunda C'den daha esnek. Örneğin fonksiyona fonksiyonun tanımındaki argüman sayısından daha az veya daha fazla argüman verebilirsiniz ve Javascript hata çıkarmaz. İlginç bir şekilde fonksiyonun kaç argümanla çağırıldığı ve tanımında kaç argüman olduğu ayrı ayrı sayılabilir. Örnek:

<html> ... <script> function deneme(a,b,c,d,e,f,g){ var tanimlandigiArgumanSayisi = deneme.length; var cagirildigiArgumanSayisi = deneme.arguments.length; alert("Tanım: "+tanimlandigiArgumanSayisi+"\nÇağırılma: "+cagirildigiArgumanSayisi); } deneme(1,2,3); </script> ... </html>

Bu dosyanın sonucunda:

Tanım: 7

Çağırılma: 3

Yazacaktır. Yani 7 argümanlı bir fonksiyon tanımladık ancak 3 argüman ile çağırdık.

Bunlar düzensiz bir şekilde aklıma gelen ipuçlarıydı. Kategori ve sayı olarak artarak devam etmesi muhtemeldir.

Benimle irtibata geçmek isteyenler için e-mail adresim;

skate <at> glance <dot> ws (mailto:c64hydrogen@yahoo.com)

Emir Akaydın

Skate / Glance