MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

PHP'de hata bulma tekniklerine yaklasim ve basit bir hata-avlama yazilimi gelistirmek: Yazar: Serkan Tarih: 01/04/02

Programlamada Hata Tipleri

- Yazim Hatalari
- Calisma Zamani Hatalari
- 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

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>