MultiServis.Net //PHP El Kitabı

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

Hata Yapilari'nin Ele Alinmasi - BOLUM 1 Yazar: Serkan Tarih: 01/03/02

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

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