[title = İpuçları]

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

[b]PHP
---[/b]

[b]1)[/b] PHP'den COM objeleri kullanmayı deniyorum ama [b]CGI Error diyip[/b] duruyor. İşin ilginç tarafı webde 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ı.
[b]
Türkçe    : Başlat->Ayarlar->Denetim Masası->Yönetimsel Araçlar->Bileşen Hizmetleri
İngilizce : Start->Settings->Control Panel->Administrative Tools->Component Services
[/b]
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, ordan da yetkilere girip bu bölümde özel yetki vererek "[b]Lokal Etkinleştirme[/b]" yetkisini açmanız gerekiyor. Zaten bu bahsettiğim yetki olay görüntüleyicisindeki hata mesajında da belirtiliyor.

[b]***[/b]

[b]2)[/b] 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 döküman okuyun. Büyük olasılıkla başka DLLlere ihtiyaç duyuyordur. [b]PHP'nin tüm extensionları tek bir DLL'den oluşmazlar[/b].

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

[b]***[/b]

[b]3)[/b] Sessionla ilgili sorun yaşıyorum. Session değişkenlerinden birine bir değer verip "[b]header('location:blabla')[/b]" ş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ı "[b]header[/b]" ile değil de HTML'in "[b]meta[/b]" tagiyle yönlendirmek. Yani
[code]
<?php
	...
	...
	...
	header('location:blabla');
	exit;
?>
[/code]
yerine
[code]
<?php
	...
	...
	...
?>
<html>
....
....
<meta http-equiv="Refresh" content="0; url=blabla">
....
....
</html>
[/code]
şeklinde kullanarak bu sorunun üstesinden gelebilirsiniz.

[b]JAVASCRIPT
----------[/b]

[b]1)[/b] 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çersine 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çersinde "[b]gizli.htm[/b]"i sokmuş oluyoruz.
[b]
index_alt.htm
-------------[/b][code]
<html>
...
<frameset rows="*,0">
<frame name="anasayfa" src="index.php"></frame>
<frame name="gizli" src="gizli.htm"></frame>
</frameset>
...
</html>
[/code]
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. Burdaki 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.
[code]
function yap()
{
	....
}

setTimeout("yap()", 1000); // 1 sn sonra
[/code]
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ğ clicke basıldığında çıkan menüyü iptal ediyoruz.
[b]
gizli.htm
-------------[/b][code]
<html>
...
<script>
parent.window.frames["anasayfa"].document.images[0].oncontextmenu = function(){ return false; };
</script>
...
</html>
[/code]
Peki tam olarak ne yaptık burada?

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

Tabii ki bu en basit kullanım örneklerinden biri. Bu yötemle sayfa içersindeki 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.

[b]***[/b]

[b]2)[/b] Dinamik olarak nasıl element yaratabilirim? Bunlara nasıl event ekleyebilirim?

Javascriptte 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.
[code]
<html>
...
<body>
<div id="tasiyici"></span>
<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>
[/code]
Burada "[b]tasiyici[/b]" isimli bir "div"imiz var. HTML içersinde 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 eventini "[b]goster[/b]" fonksiyonuna yönlendiriyoruz. Aslında burada kısaca "[b]goster[/b]" yazabilirdik "[b]function(){ goster(textbox.value); }[/b]" yerine. Fakat bu durumda parametre veremezdik. Biz textbox'ın değerini de fonksiyona yollamak istediğimiz için "[b]function() {}[/b]" ile o noktada dinamik bir fonksiyon yarattık ve "[b]goster[/b]" fonksiyonunu textbox'ın içine yazılan değer ile [b](textbox.value)[/b] ç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 browserlar form tagi olmadan form objelerini göstermezler bile. Günümüz borwserlarının teknolojisine dayanarak bu örneği bu şekilde kullanmaktan çekinmedim.

[b]***[/b]

[b]3)[/b] C/C++'da argv, argc, va_arg bişiler yapıyorduk. Javascript'de 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:
[code]
<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>
[/code]
Bu dosyanın sonucunda:
[b]
Tanım: 7
Çağırılma: 3
[/b]
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;
[url = mailto:c64hydrogen@yahoo.com]skate <at> glance <dot> ws[/url]
[b]
Emir Akaydın
Skate / Glance
[/b]