Mantik Hatalari
Yazim Hatalari
Konusma dillerinde oldugu gibi programlama dillerinde de
bazi yazim kurallari ve yapilar vardir.Her programlama dillinde
oldugu gibi PHP icerisinde de daha onceden belirlenmis komut
yapilari ve yazim teknikleri vardir.Konusma dillerinde hata
yapsaniz dahi karsinizdaki sizin ne dediginizi anlayabilir,fakat
programlama dillerinde yapacaginiz kucuk bir yanlis hata
mesajinin ekrana gelmesini saglar.
Yazim kurallarina ornek PHP de her satirin bitiminde noktali
virgul isaretinin kullanilmasi gosterilebilir.Bir baska
ornek ise degikene bir duzyazi tipinde veri atarken mutlaka
veriyi tirnak isaretlerinin arasina yazmalisiniz...
Yazim hatasi olusturmak icin asagidaki gibi bir program
yazin.program toplam uc satirdan olusuyor ve ikinci satirinda
asil isi yapan komut var :
Ornek 1 :
<?php
$tarih = date (m.d.y');
?>
Boyle bir kodun ciktisi asagidaki gibi olur :
Parse error: parse error in c:\nusphere\apache\nsdocs\pro_hatasi1.php
on line 2
Goruldugu gibi ikinci satirda bir hata mesyadana geldigi
acikca belirtilmektedir.
Simdi de ayni kodu asagidaki gibi degistirin :
<?php
$tarih = date ('m.d.y);
?>
Simdi program ciktisi asagidaki gibi olacaktir :
Parse error: parse error in c:\nusphere\apache\nsdocs\pro_hatasi2.php
on line 4
Su anda hatanin dorduncu satirda oldugu soylenmektedir.Bu
nasil olur? Cunku program zaten hepsi uc satirdan olusuyor.
Eger bir komutta bu sekilde bir tirank hatasi yaparsaniz
ve tum programiniz 1000 satirdan olusuyorsa buyuk ihtimmalle
asagidaki gibi bir hata alirsiniz ve zamaninizin cogu bu
hatayi hangi satirda aradiginizi yapmakla gecer :)
Parse error: parse error in c:\nusphere\apache\nsdocs\pro_hatasi2.php
on line 1001
Sonuc olarak yazim hatalari en kolay bulunup yok edilen
hatalar olarak degerlendirilir.
Calisma Zamani Hatalari
Konuyu anlatabilmek icin hemen giriste bir ornek veriyorum.Tahmin
ediyorum hepiniz ornege bakarak bu tip hatalar ile neyi
kastettigimizi anlayacaksiniz :
<?php
include ("dosyaadi.php");
?>
Evet yukaridaki kod parcasi yuzde yuz hatasiz olmasina ragmen
calisma zamaninda ilgili dosya yerinde bulunamaz ise cok
basit bir hata mesajinin uretilemsine neden olabilir :
Warning: Failed opening 'dosyaadi.php' for inclusion (include_path='')
in c:\nusphere\apache\nsdocs\pro_hatasi3.php on line 2
Yukaridaki "include" komutu ile bazi dosyalar komple programin
icine eklenebilmektedir.Eger eklenecek program yerinde bulunmazsa
bir hata mesaji ueretilir.
Bir baska calisma zamani hatasi ornegi "sifira bolunme"
olayidir.Matematikte bir sayinin sifira bolunmesi tanimsizdir.Bu
nedenle eger programda bir sayiyiy sifira bolmeye tessebbus
ederseniz hata mesaji uretilir :
<?php
$i=10;
$j=0;
$k=$i/$j;
?>
Yaratilacak hata mesaji asagidaki gibidir :
Warning: Division by zero in c:\nusphere\apache\nsdocs\pro_hatasi4.php
on line 4
Mantik Hatalari
Mantik hatalari bulunmasi en zor programcilik hatalaridir.yazim
veya yapi olarak dogru oldugu halde programcinin istedigi
gorev yerine baska islevler yerine getiren kod parcalari
bunlara ornek verilebilir.Tarihte yapilan butun buyuk yazilim
hatalari bu cesit hatalardir.
Ornek :
<?php
for ($i=0; $i<10; $i++);
{
echo "Bu bir deneme mesajidir <BR>";
}
?>
Evet kodun kendisinde hata olmamasina ragmen (PHP yukaridaki
kod ile ilgili herhangi bir sikayette bulunmaz.) kod istenilen
sekilde davranmayacaktir.Dikkat ederseniz PHP deki yazim
kuralini uygulayrak her biten satira bir noktali virgul
ekledim.Bu sebeple dongunun "echo" komutunun oldugu satirla
olan baglantisini kesmis oldum.Boyle bir programin ciktisi
asagidaki sekilde olacaktir :
Bu bir deneme mesajidir
Aslinda asagidaki gibi bir ciktinin ekrana gelmesi istenmektedir
:
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Bu bir deneme mesajidir
Hata bulma tekniklerinde bir degiskenin, programin
belirli bir kisminda sahip oldugu degerini bilmek gercekten
cok onemlidir.Boylece programin sizin istediginiz sekilde
calisip,calismadigini kontrol etme firsatiniz dogar.
Bu anafikirden hareketle sayfamiza gelen degiskenlerin tasidigi
degerleri HTML sayfasinda yorum haline getirip yazacak (Boylece
gercekten sayafada goruntulenmedigi halde sayfanin HTML
kodunda yer alacak.) kucuk bir hizmet/hata bulma yazilimi
hazirlayalim :
<?php
/*
Oturum numarasi alabilmek ve bunu ornekte gorebilmek icin
oturumu baslatiyorum
Bunun programin isleyisinde bir etkisi yoktur.
*/
session_start;
/*
Bu sayafaya ulasan butun HTML degiskenlerini aliyor onlari
isliyor ve sonunda
bir HTML yorumu olarak sayfanin kaynak kodunda gosteriyoruz.
*/
echo "\n<!-- Degisken Degelerine Bakis -->\n\n";
echo "<!-- GET DEGISKENLERI -->\n";
echo "<!-- ". degerleri_goster($HTTP_GET_VARS) ."-->\n";
echo "<!-- POST DEGISKENLERI -->\n";
echo "<!-- ". degerleri_goster($HTTP_POST_VARS) ."-->\n";
echo "<!-- SESSION (Oturum) DEGISKENLERI -->\n";
echo "<!-- ". degerleri_goster($HTTP_SESSION_VARS)
."-->\n";
echo "<!-- COOKIE (Cerez) DEGISKENLERI -->\n";
echo "<!-- ". degerleri_goster($HTTP_COOKIE_VARS) ."-->\n";
echo "Bu sayafaya gonderilen degisken isimlerini ve degerlerini
gormek icin \n";
echo "sayfanin HTML kaynak kodunu goruntuleyiniz.";
/*
degerleri_goster fonksiyonu argument olarak bir dizi ismi
almaktadir.
boylece fonksiyona gecirilen dizideki tum elementler teker
teker indis-deger
ikilisi seklinde listelenmektedir.Bizler bu fonksiyonun
ciktisindan o dizi ile
ilgili tum bilgileri sayfanin icinde bir HTML yorumu olarak
gorebilmekteyiz.
*/
function degerleri_goster($array)
{
if (is_array($array))
{
$eleman_sayisi = count($array);
$cikti = " ";
if ($eleman_sayisi)
{
$sayac = 0;
$cikti .="{ ";
//Her elementin indis ve degerini ciktiya ekle.
foreach ($array as $var => $deger)
{
$cikti .= "$var = $deger";
if ($sayac++ < ($eleman_sayisi-1))
{
$cikti .= ", ";
}
}
$cikti .= "}";
}
return $cikti;
}
else
{
//Eger dizi degilse,
return $array;
}
}
?>
Ornek Dosyalar
http://www.turk-php.com/ornekler/hataya_ayiklama_ornek.php
http://www.turk-php.com/ornekler/hata_ayiklama.php
http://www.turk-php.com/ornekler/hataya_ayiklama_ornek.phps
http://www.turk-php.com/ornekler/hata_ayiklama.phps
http://www.turk-php.com/ornekler/pro_hatasi1.php
http://www.turk-php.com/ornekler/pro_hatasi2.php
http://www.turk-php.com/ornekler/pro_hatasi3.php
http://www.turk-php.com/ornekler/pro_hatasi4.php
http://www.turk-php.com/ornekler/pro_hatasi5.php
Serkan Hadi Ceylani
serkan@turk-php.com