Bundan onceki bolumlerde
programlamanin temelleri uzerine konustuk.Su andan itibaren
kendi web uygulamanizi yazacak bilgi birikimine sahipsiniz.Buraya
kadar anlatiklarimiz gercekten anlasilmasi zor konulardi ve
siz bu kisimi basari ile bitirdiniz.Anlatilmasi gereken zorlu
bir tek konu kaldi iste bu konu yani hatalarin ele alinmasi,bilinmesi
ve yok edilmesi...
Programcilik ile ilgileneler bir ingilizce terimi cok iyi bilirler
"bug"...
"Bug" ingilizcede bocek, veya argo olarak kullanilirsa "icerideki
muhbir" olarak adlandirilir.Yazilim dunyasinda ise programin
icinde yer alan ve sartlar olusunca ortaya cikan hatalarin
tamamina verilen genel isimdir.
Hata ele almak asagidaki sekilde siniflandirilabilir :(Ayni
zamanda yazinin ana basliklaridir.Bu bolumde ilk uc ana madde
detayli olarak aciklanmaya calisilmistir.)
Guvenlik veya
estetik nedenlerden dolayi hata yapisini ele almak
Programdaki yazim
hatalari (syntax errors)
Mantiksal hatalar
Daha iyi programlama
pratikleri
"Regular expressions"'
kullanilarak kullanicidan gelen verileri filtrelemek
Debugging
PHP icerisinde yer alan hata yapilari (Error Handling
in PHP)
Programin guvenligi, bir fabrikadaki "is guvenligi"inden
farksizdir ve mutlaka ozel olarak ele alinmalidir.
PHP diger programlama dillerinden farkli olarak yanlizca
web uzerinde kullanilabilir.Bu nedenle "standart cikti"(output)
ve "standart hatalar"akisi kullanmaz. C,C++,Java gibi diger
programlama dillerinde hata mesajlari, programin basit ciktisindan
ayridir.
CGI teknolojisinde oldugu gibi PHP hata mesajlarini
default olarak web server'in log dosyalarina gondermez.PHP
icin hata mesajlarini gosterebilecegi en uygun yer onun
icin bir nevi ev olan kullanicin "browser"i yani
"internet tarayicisi"dir.
Iste bu olay bazi negatif etkilere sebep olmaktadir.
Guvenli kalmasi gereken bilgiler aciga cikiyor...(Insecure
Information)
Hassas bilgi olarak kabul edilen,web server uzerinde yer
alan dosya yollari bu sekilde kullanicinin gozlerinin onune
sunuluyor.Ornek olarak bir dosyanin acilamadigini "soylerken"
yanlizca dosya adini degil tum "server path" tabir edilen
dosyanin hardisk uzerindeki yolunuda sergilemis oluyor.Bu
bilgi kotu niyetli kisilerin elinde bir silaha donusebiliyor.(Cracker
veya Hacker icin tek silahin tecrube degil, ele gecirdigi
bilgi oldugu kabul edilmektedir.)
Cirkin gorunume sebep oluyor...
PHP hata mesajlarini gonderirken en mukkemmel tasarlanmis
web sitelerini bile gorunum olarak bir felakete ceviriyor.
Webmaster icin prestij ve is kaybina neden oluyor.Bir dosyanin
server uzerinde bulunamadigi hatasi cogu kullanici tarafindan,yaratilan
web sitesinin yonetici ve tasarimcilarina "amator" damgasi
vurulmasina sebep oluyor.
"File not found : /home/turkphp/www/dosya.php"
Gorunmez hata mesajlari
PHP hata mesajlarini HTML olarak kullanicin internet tarayicisinda
goruntuler.Eger bu hata mesaji HTMl icerisinde "yorum" yapilan
bir bolgeye denk gelirse kullanicin browserinda goruntulenmez.
<!--
YORUM ,YORUM, YORUM.
Hata Mesaji
Hata Mesaji
Hata Mesaji
YORUM, YORUM, YORUM.
-->
Dinamik olarak yaratmaya calistiginiz bir "javascript" kodu
icin bu olay pekala mumkundur.
<!--
<script language="JavaScript">
Kodlar buraya giriyor...
HATA MESAJI
Kodlar buraya giriyor...
</SCRIPT>
-->
Veya daha da kotusu soyle bir HTML kodunun arasindan hatayi
yakalamak daha da zor olacaktir.
<table align ="center" width="200" HATA MESAJI>
Internet Tarayicilari (Browserlar) hatali HTML kodlarina
karsi cok toleransli davranirlar.Bu nedenle hatali gordukleri
bir HTML kodunu basitce gozardi edebilirler.Iste bu olay
sizin beklediginiz sekilde butun PHP hatalarinin ekranda
gorunmesini engeller.
Hata Tipleri
Bir programda hatayi, nasil ve nerede aramaniz gerektigini
ogrenince isiniz biraz daha kolaylasacaktir.Biz bu nedenle
PHP icerisinde yer alan hata tiplerini ikiye ayiriyoruz
:
Yazim Hatalari(Syntax Error)
Bilgisayar cihazlari yapi itibari ile hassas cihazlardir.Bu
hassasiyet su sekilde aciklanabilir :
Eger bir kisi size ogleden sonra 4 gibi yataktan kalakarken
"gunaydin" derse, siz kisinin ne demek istedigini anlarsiniz.Bilgisayarlar
bu tip bir mantiktan yoksunlardir...Bu nedenle,
Asagidaki gibi yazilan bir satir hata mesaji dondurur...
eco "Serkan";
iste PHP boyle bir yazilim gorunce hemen "parse error"
hata mesaji dondurur.Cunku siz basitce bir harfi "h" unutmus
olmakla onun yazilan komutun algilanamamasina sebep olursunuz.Siz
biliyorsunuzdur ne demek istediginizi ama gordugunuz gibi
bilgisayarin boyle bir mantigi yoktur...(Bilgisayar sizin
ne dusundugunuzu anlayabilecek kapasitede bir aygit degildir)
"Parse error" yaratmak icin bir baska klasik yolda satirlarin
sonun yazilmasi gereken ";" noktali virgul isaretinin unutulmasidir.
Simdi bir "parse error" ciktisi gormek icin asagidaki linki
tiklayiniz.
http://www.turk-php.com/ornekler/eco.php
Diger bir yolda acilan dongulerin duzgun kapatilmamasindan
dolayi olsuan "parse error" mesajidir.
<?php
if ($Secim == "Evet")
{
echo "Dogru cevap verdiniz";
echo "$Cevap = ";
else
{
echo "Yanlis cevap verdiniz";
}
?>
Bu sekilde yapilan hatalara milyonlarca ornek verilebilir.PHP
icerisinde boyle hatalar yaptiginiz zaman hemen bir uyrai
mesaji alirsiniz.Bu mesaj genelde size problemi cozmekte
yardimci olur.
"Syntax Error" dedigimiz yazim hatalari ornegin Turkce gibi
insanlarin anlasmak icin kullandigi dillerdeki gramer hatalari
gibidir.
"Syntax Error" Hatasina Yol Acan 5 Ana Neden
Yazim Hatalari
:
Komutlari harfiyen dogru yazdiginiza emin olun...
Yapi Hatalari:
Yapilari dogru olarak kapattiginiza emin olun.Bircok insan
dongulerde actigi bir parentezi kapatmayi unutuyor.Kodlarinizi
girintili yaparsaniz bu sorunu en az sekilde yasarsiniz.Bir
dongunun icinde yazilan kodlar 10 sayfa surebilir.Eger kodlarinizi
duzgunce yerlestirirseniz kolaylik saglamis olursunuz.
for ($Dongu1 =0; $Dongu1<15; $Dongu1++)
{
for ($Dongu2 =0; $Dongu2<15; $Dongu2++)
{
............Kodlar buraya giriyor
}
}
Satirin sonundaki
noktali virgul isaretini unutmayin...
Fonksiyon ismi
yanlis yaziliyor...
Eger "htmlspecialchar ()" komutunu kullanirsaniz ,
Fatal error : Call to undefined function: htmlspecialchar
().
hatasini alirsiniz.Komutun dogru kullanimi su sekildedir.
htmlspecialchars ()
Text ifadeler
tirnkalarla duzgun kapatilmiyor...
echo "Merhaba Dunya;
bunun sonucunda "parse error" alirsiniz.Dogrusu,
echo "Merhaba Dunya"; seklindedir.
Mantik Hatalari
Ikinci tip hata cesitleri mantiksal hatalardir.Bulunup yok
edilmesi "syntax error"'a gore cok daha zordur.
Programi yazim hatalari bakimindan yuzde yuz kontrol etsenizde
burada anlatilacak olan gata cesidini yakalamniz her zaman
mumkun olmayabilir.Programi ilk denediginizde calismasi
duzgun olabilir.Ancak programa girilen bazi verilerde
eger program herhangi bir sonuc dondurmuyorsa veya hata
mesaji donduruyorsa programin icinde mantik hatasi aranmasi
gereklidir.
Bu konu tamamen programin yapisindan kaynaklanir.Asagida
bu konuyu madde madde incelemeye calisalim.
Calisma Zamani Hatalari(Runtime Errors)
Programin icinde veritabanlari,dosylar gibi isletim sisteminin
parcasi olan ogelerle calisiliyorsa bu tip hatalar ortaya
cikabilir.Kullanici izinleri,dosyanin yerinde olmamasi gibi...
Sifira Bolunme Hatasi
Bir pozitif sayiyi bir degiskenin sakladigi degere bolmek
istediniz ama bir nedenden dolayi degisken herhangi bir
deger tasimiyor,iste o zaman aslinda sayiyi sifira boluyorsunuz
demektir.Bilgisayar tabii ki hata mesaji dondurur.(Matematikte
bir sayinin sifira bolumu tanimsizdir.Bu bilgi artik yaklasik
olarak aldigim 20 adet yuksek matematik ve fizik dersinden
sonra beynime kazinmisti.Her muhendislik dersinde mutlaka
bir defa orataya cikar kendisi :)
Bu problem her zaman kendisini size gostermeyebilir.Programcinin
bu konuda hassas davranmasi ve yapilan islemlerde boyle
bir ihtimalden uzak durulmasi gerekir.Bir ornek vererek
konuyu aciklayalim.
<?
?>
<?php
//kuleler.php
$a_kulesinin_yuksekligi = 0;
$b_kulesinin_yuksekligi = 12;
if ($a_kulesinin_yuksekligi == $b_kulesinin_yuksekligi)
{
$bayrak = 1;
}
else {
if ($a_kulesinin_yuksekligi > $b_kulesinin_yuksekligi)
{
$uzun_kulenin_adi = "KULE A";
$kisa_kulenin_adi = "KULE B";
$uzun_kulenin_yuksekligi = $a_kulesinin_yuksekligi;
$kisa_kulenin_yuksekligi = $b_kulesinin_yuksekligi;
}
else {
$uzun_kulenin_adi = "KULE B";
$kisa_kulenin_adi = "KULE A";
$uzun_kulenin_yuksekligi = $b_kulesinin_yuksekligi;
$kisa_kulenin_yuksekligi = $a_kulesinin_yuksekligi;
}
$bayrak = 0;
}
if ($bayrak == 1) {
echo("Iki kuleninde yuksekligi esit!");
}
else {
$yukseklik_orani = $uzun_kulenin_yuksekligi / $kisa_kulenin_yuksekligi;
echo("Bu durumda, ${uzun_kulenin_adi}
${yukseklik_orani} kat daha yuksek
${kisa_kulenin_adi}!");
}
?>
Ornek Dosyalar
Not :
$a_kulesinin_yuksekligi = 0;
$b_kulesinin_yuksekligi = 12;
Degerlerini degistirerek
hazirladigim uc adet ornegi servera yerlestirdim.Ilginizi
cekecegini zannediyorum...
Programda bir
onemli ayrintida, bir durum olustugunda ona bir $bayrak degiskeni
atayarak daha sonra bu durumu "if" yapisiyla beraber kullanabilmek
gosterilmistir.Bir tasla iki kus...Before starting something
learn first :)
http://www.turk-php.com/ornekler/kuleler.php
($a_kulesinin_yuksekligi = 0; $b_kulesinin_yuksekligi =
12;)
http://www.turk-php.com/ornekler/kuleler1.php
($a_kulesinin_yuksekligi = 3; $b_kulesinin_yuksekligi =
12;)
http://www.turk-php.com/ornekler/kuleler2.php
($a_kulesinin_yuksekligi = 12; $b_kulesinin_yuksekligi =
12;)
Programi asagidaki sekilde yazarak guvenli ve hatalar'dan
arinmis hale getirebilirsiniz...
<?php
//kuleler.php
$a_kulesinin_yuksekligi = 0;
$b_kulesinin_yuksekligi = 12;
if ($a_kulesinin_yuksekligi == $b_kulesinin_yuksekligi)
{
$bayrak = 1;
}
else {
if ($a_kulesinin_yuksekligi > $b_kulesinin_yuksekligi)
{
$uzun_kulenin_adi = "KULE A";
$kisa_kulenin_adi = "KULE B";
$uzun_kulenin_yuksekligi = $a_kulesinin_yuksekligi;
$kisa_kulenin_yuksekligi = $b_kulesinin_yuksekligi;
}
else {
$uzun_kulenin_adi = "KULE B";
$kisa_kulenin_adi = "KULE A";
$uzun_kulenin_yuksekligi = $b_kulesinin_yuksekligi;
$kisa_kulenin_yuksekligi = $a_kulesinin_yuksekligi;
}
$bayrak = 0;
}
if ($bayrak == 1) {
echo("Iki kuleninde yuksekligi esit!");
} else {
if ($kisa_kulenin_yuksekligi == 0) {
echo("Kisa kulenin yuksekligi sifir olamaz !");
}
else {
$yukseklik_orani = $uzun_kulenin_yuksekligi / $kisa_kulenin_yuksekligi;
echo("Bu durumda, ${uzun_kulenin_adi}
${yukseklik_orani} kat daha yuksek
${kisa_kulenin_adi}!");
}
?>
Ornek Dosya
http://www.turk-php.com/ornekler/kuleler3.php
Her turlu gorus ve onerinizi serkan@turk-php.com adresine
gonderebilirsiniz....
Saygilar,
Serkan Hadi Ceylani
serkan@turk-php.com
|