PHP: Hafta 3

php-logo php-logo   {right}Bu yazı 11 Kasım'daki dersle alakalı. Biliyorum, üzerinden yıllar geçmiş ama yazının içeriğine bakınca neden bu kadar geciktiğini anlayacaksınız. Açıklayıcı olması ve vize dönemi yazılmasıdır nedeni.

PHP kursumuzun üçüncü haftasında kullanıcıdan veri çekmeyi öğrendik. Veri göndermek için iki tane (yaygın) metot olduğunu, bu metotların HTTP protokolü tarafından sağlandığı gördük. POST ve GET olan bu metotların özelliklerini, aralarındaki farkları ve hangi durumda hangisinin kullanmanın daha avantajlı olacağı konusunda tartıştık. Daha sonra POST ve GET metotları ile kullanıcıdan iki tane sayı ve bir işlem alıp, ekrana sonucu yazdıran bir hesap makinesi yaptık.

Önümüzdeki ders olan ilk hafta (3 Aralık 2009 Perşembe) hesap makinemizi geliştirmeye devam edeceğiz. Kullanıcıdan gelen verinin geçerliliğinin kontrolü, kullanıcının nasıl çılgınlıklar yapıp programı nasıl yanıltabileceği ve bunlara karşı nasıl uyanık olabileceğimiz üzerinde duracağız. Bunların hemen ardından jQuery kütüphanesini kullanarak aynı hesap makinesini AJAX ile çalıştırıp, aslında asenkron istek ile bilgi çekmenin çok da ahım şahım zorlukları olmadığını göreceğiz.

Böylece veri çekme ile ilgili sorunlarımız tamamlanmış olacak.

Bunların ardından eğer vakit kalırsa (ya da gerekli izinlerin alınması halinde, güme giden derslerden birini tamamlamak adına bir saat ek ders yaparak) PHP'de session'ların ne olduğuna ve neden sessionlara ihtiyaç duyulduğuna bakacağız. Böylece PHP scriptlerimizin çalışıp bitip, her seferinde kullanıcıyı unutması yerine, kullanıcının kim olduğunu hatırlayan zeki scriptlere dönüşmesini sağlayacağız. Hemen arkasından sessionların ne zaman ve ne amaçlarla kullanılmaması gerektiğini görecek ve bu konuda alınması gereken güvenlik önlemleri ile dersi bitireceğiz.

Gelelim derste geçen kod örneklerine ve yararlanılabilecek kaynaklara:

Hesap Makinesi

index.html

[html] <html lang="tr">

<head> <title>Hesap Makinesi</title> </head>

<body> <form action="hesap.php" method="post"> <!-- Method kısmını get yapıp nelerin değiştiğini gözleyiniz. --> 1. Deger: <input type="text" name="deger1" /><br /> 2. Deger: <input type="text" name="deger2" /><br /> <select name="islem"> <option>Topla</option> <option>Cikar</option> <option>Carp</option> <option>Bol</option> </select> <input type="submit" value="Gonder" /> </form> </body> </html> [/html]

hesap.php

 <?php // echo var_dump($_REQUEST); /* Yukarıdaki satırı çalıştırarak, kullanıcıdan gelen bilgilerin PHP'ye nasıl ulaştığını görebilirsiniz. Burada unutulmaması gereken nokta, kullanıcı $_REQUEST ile İSTEDİĞİ BİLGİYİ gönderir. Doğru yanlış, hatalı, eksik, fazla asla bilemezsiniz. $_REQUEST'i bodoslama kullanmak güvenlik açıklarına sebep olur. Önce kullanıcıdan aldığınız veriyi MUTLAKA kontrol edin. Eksik ya da geçersiz olmasın. */

/* Aşağıda hata kontrollerine dair örnekler vardır. Buradaki isset() veya is_numeric() gibi kontroller keyif için ya da karizma olsun diye yapıl- mamaktadır. Gerçek bir program yazarken bunları yazmamanız ÇOK CİDDİ BAŞ AĞRILARINA sebep olabilir. $_REQUEST, $_GET, $_POST, $_COOKIE GÜVENİLMEZDİR! */

/* Kullanıcı islem göndermiş mi? Gönderdiyse bu, bize gelmesi gerekenlerden biri mi? Yoksa "sgdshdfh" gibi bir şey mi? */ if (!(isset($_REQUEST['islem']) && ($_REQUEST['islem'] == "Topla" || $_REQUEST['islem'] == "Cikar" || $_REQUEST['islem'] == "Carp" || $_REQUEST['islem'] == "Bol"))) { hataVer(); /* Hata mesajı yaz ve çık */ } $islem = $_REQUEST['islem']; /* Bu noktadan sonra $islem'e güvenilir. */

/* Birinci sayı atanmış ve sayısal bir değer mi? */ if (!(isset($_REQUEST['deger1']) && is_numeric($_REQUEST['deger1']))) { hataVer(); /* Hata mesajı yaz ve çık */ } $deger1 = $_REQUEST['deger1'];

/* İkinci sayı atanmış ve sayısal bir değer mi? */ if (!(isset($_REQUEST['deger2']) && is_numeric($_REQUEST['deger2']))) { hataVer(); /* Hata mesajı yaz ve çık */ } $deger2 = $_REQUEST['deger2'];

if($islem == "Topla") { echo $deger1 + $deger2; } elseif ($islem == "Carp") { echo $deger1 * $deger2; } elseif ($islem == "Cikar") { echo $deger1 - $deger2; } else { echo $deger1 / $deger2; }

function hataVer() { die("Hatali bir veri var! Siz kimi kandiriyorsunuz?"); /* Die, bir mesaj vererek programın çalışmasını durdurur. */ } ?>

Kaynak dosyasını istediğiniz gibi kullanabilir, kendinizce yeni özellikler eklemeye çalışabilir, orasını burasını oynadığınızda nelerin değiştiğini gönül rahatlığıyla inceleyebilirsiniz.

Önerilen Kaynaklar

HTML Formları

(HTML formları ile gönderilen verilerin PHP'ye nasıl yansıdığını her HTML elementi için (checkbox vs.) ayrı ayrı inceleyiniz.)

PHP POST GET REQUEST

Bu sayfaların alt kısımlarındaki örnekleri mutlaka inceleyip, anlamadıklarınızı ya da ilginç bulduklarını deneyiniz, takıldığınız yerde bana sorunuz.

Diğerleri

İsteğe Bağlı Ödev

Dersin sonunda isteğe bağlı bir ödev vermiştim. Burada da hatırlatmakta fayda var:

Dirençlerin değerleri üzerlerine renk kodu olarak işlenmektedir. Dirençlerin üzerine işlenen bu dört renklerin değerlerine bakılarak dirençlerin değerleri hesaplanabilir. Sizden istenen kullanıcıdan renkleri almak ve direncin değerinin kaç ohm ve kaç kiloohm olduğunu ekranda göstermenizdir.

Kullanıcıdan veri aldığınız ekranda mı, yeni ekranda mı göstereceğiniz ve benzeri tasarım sorunları tamamen size kalmıştır.

Dirençlerle ilgili tabloya buradan ulaşılabilir. Ödevlerinin kontrolünün yapılmasını ve ödevlerinde ne gibi eksik/açıklar olduğu konusunda yorum isteyenler ödevlerini bana elektonik posta olarak gönderebilirler.

Dönem Sonu Değerlendirmesi Hakkında Duyuru

Biliyorsunuz kurs bitiminde başarılı bulunanlara sertifika verilecek. PHP kursu için "başarılı olmak" şu şekilde değerlendirilecek: Dönemin bitimine doğru, derste anlatılanların hepsini içeren ve bunun yanında gereken noktalarda internetin nimetlerinden yararlanmayı da gerektiren bir proje vereceğim. Sizden verilen süre içerisinde (en az bir hafta) bu projeyi tamamlamanız beklenecek. Daha sonra bu projelerin kaynak kodlarını tek tek inceleyeceğim. Projeniz fonksiyonel tasarım, hatasızlık, güvenlik gibi kategoriler altında ayrı ayrı değerlendirilecek. Bunlar sonucunda belirli bir puanı aşan projelerin sahipleri başarı sertifikalarını alacaklar.

Vereceğim proje dünyanın en zor tasarlanabilir programı olmasa da, sadece internetten kod bulup kopyala yapıştır yapılabilecek kadar basit bir şey de olmayacak. Bu yüzden verdiğim alıştırmaları yapmaya çalışmanızı, takıldığınız yerleri sormanızı ve en önemlisi kendiniz yeni bir şeyler denemenizi şiddetle öneriyorum. PHP, (hatta bilgisayarla ilgili neredeyse her şey) sadece derste, haftada bir seansla öğrenilebilecek bir şey değil.

Herkese iyi geceler.