AJAX & Hazır Kütüphaneler eburhan
Uzun bir aradan sonra yeniden merhaba. Uzun zamandır Prototype.js kütüphanesi ile ilgili sizlere bilgiler sunuyorduk. Prototype.js rehberimizin son bulmasından sonra bilgilerimizi pekiştirmek adına örnek bir uygulamanın zamanı gelmişti. Bu örnek uygulamamızda Prototype.js kütüphanesinin AJAX sınıfını kullanarak basit bir oylama sistemi hazırlayacağız. Ziyaretçinin, sorduğumuz bir soruya evet veya hayır şeklinde oy verebilmesini sağlayacağız.
Neler yapacağız?
İlk önce yapacak olduğumuz uygulamaya göz gezdirelim ve yapısını anlamaya çalışalım. Alttaki resimde de gördüğünüz gibi son derece basit bir örnek. Çünkü bu yazıdaki asıl hedef nokta, Prototype.js kütüphanesinin AJAX sınıfının nasıl kullanıldığını görmek ve bu konudaki bilgilerimizi pekiştirmek.

Resim 1
OylaX ismini verdiğim bu uygulamada veritabanından soruyu alıyoruz. Aynı zamanda bu soruya kaç kişinin Evet, kaç kişinin Hayır oyu verdiği bilgisini de alıyoruz. Biraz matematik ile sonuçları yüzde şeklinde görüntülüyoruz. Oyu kullanmak isteyen kişinin ise normal bir şekilde Evet veya Hayır linkine tıklaması yeterli. Yapacağımız bu örnekte soruyu ve cevap yüzdelerini ekrana AJAX ile görüntüleyeceğiz. Cevabı kaydederken de yine AJAX tekniğini kullanacağız.

Resim 2
Uygulamadaki dosyalara da göz atalım. stil.css dosyasında css kodlarımız yer alıyor. prototype.js dosyası ise javascript kütüphanemiz. cevapAl.php dosyası veritabanından soruyu ve evet/hayır sonuçlarını alıyor. Alınan verileri toparladıktan sonra resim 1'deki görüntüyü elde etmemizi sağlıyor. cevapKaydet.php dosyası ise kendisine gönderilen oylama sonucunu veritabanına kaydetmekle yükümlü. index.php dosyası ise ana dosyamız. cevapAl.php ve cevapAl.php dosyalarına AJAX ile bu dosyadan ulaşıyoruz. Bütün AJAX ve JavaScript kodlarımız bu dosya içerisinde.
Tüm bunlardan sonra iş listemizi oluşturmak gerekirse;
- veritabanındaki tabloyu inceleyeceğiz
- cevapAl.php dosyasında soruyu ve evet/hayır sonuçlarını alacağız
- cevapKaydet.php dosyasında oylama sonucunu alıp veritabanına kaydedeceğiz
- index.php dosyasında da cevapAl.php ve cevapKaydet.php dosyalarıyla iletişim kuran JavaScript ve AJAX kodlarını yazacağız
1. Veritabanındaki işlemler
Veritabanı üzerinde yalnızca 1 adet tablo kullanacağız. Ben tablonun ismini oylama olarak kullandım. Altaki resimde de gördüğünüz gibi "oylama" isimli tablonun basit bir yapısı var. no alanı, sorulara benzersiz (unuqie) soru numaraları atamamız için. soru alanında ise ziyaretçinize yöneltmek istediğiniz sorular tutuluyor. Eğer ziyaretçiniz Evet yanıtını verirse, evet alanı 1 artıyor. Aynı şekilde Hayır yanıtını verirse de hayır alanı 1 artıyor.

Resim 3
Bu yazının sonunda bu veritabanını MySQL veritabanı üzerinde tek hamlede oluşturabilmenizi sağlayan SQL dosyası mevcut. Dosyayı oradan alabilirsiniz.
2. cevapAl.php dosyasını hazırlayalım
cevapAl.php dosyasında resim 3'deki tablomuzdan soruyu ve evet/hayır sonuçlarını çekeceğiz. Kaç no'lu sorunun çekileceğini cevapAl.php dosyasına POST ettiğimiz bir veri ile belirleceğiz. Şimdi kodlamaya geçelim.
-
<?php
-
// Soru numarasını al
-
$soruNo = $_POST['soruNo'];
-
-
// Veritabanına bağlan
-
-
// Soru numarasına göre bilgileri sorgula
-
$sql = "SELECT * FROM oylama WHERE no = $soruNo";
-
-
// Veritabanından alınan bilgiler
-
$no = $veri['no'];
-
$soru = $veri['soru'];
-
$evet = $veri['evet'];
-
$hayir = $veri['hayir'];
-
-
// Yüzdeleri hesapla
-
$toplamOy = $evet + $hayir;
-
?>
-
-
<p id="soru">
-
</p>
-
<p id="cevap">
-
<a href="javascript:cevapKaydet('e', <?php echo $no; ?>);" title="<?php echo $evet ; ?> kişi">Evet</a> (%<?php echo $evetYuzde; ?>)
-
-
<a href="javascript:cevapKaydet('h', <?php echo $no; ?>);" title="<?php echo $hayir; ?> kişi">Hayır</a> (%<?php echo $hayirYuzde; ?>)
-
</p>
Yaptığımız ilk iş 3. satırda bu dosyaya gönderilmiş soru numarasını almak. Daha sonra veritabanı bağlantısı kuruyoruz. 11. satırdan itibaren veritabanımızdaki "oylama" isimli tablomuza sorgu gönderiyoruz. Bu sorgulama soru numarasına göre yapılıyor. 16. satırdan itibaren veritabanından dönen bilgileri daha rahat kullanabilmemiz için değişkenlere atıyoruz. 22. satırdan sonra ise evet ve hayır sonuçlarını ekranda yüzde olarak gösterebilmemizi sağlayan matematiksel işlemleri yapıyoruz. PHP'nin yerleşik round fonksiyonu ile elde ettiğimiz sonucu tam sayı olarak yuvarlıyoruz. Böylece sonuç %55,53 gibi bir değer çıkarsa ekranda %55 olarak görünüyor. 27. satırdan itibarense, Resim 1'deki görüntüyü elde etmek için HTML kodlarıyla biçimlendirme yapıyoruz. Ayrıca Evet ve Hayır linklerine cevapKaydet isimli JavaScript fonksiyonunu da ekliyoruz. Bu fonksiyonu index.php sayfasında ayrıntısıyla ele alacağız.
Toplamda 9839 kez okunmuş.
Şu an 1 kişi okuyor.
En fazla 6 kişi aynı anda okumuş.
Bugün 23 kez okunmuş.
Etiketler: ajax, css, javascript, kütüphane, orta, php, prototype, veritabani
Trackback Yorumları takip et Baskı Önizleme

(32 oy, ortalama 3.97)
# ismailaltuntas | 10 Haziran 2007, 10:11
Güzel makale olmuş tebrikler…
# eburhan | 10 Haziran 2007, 10:22
Bu uygulamayı temel alarak şunun gibi web sitelerini rahatça yapabilirsiniz.
http://www.evet-hayir.com/
http://www.left-or-right.com/
# grkn | 10 Haziran 2007, 11:06
başarılı bir makele eburhan, teşekkürler ve tebrikler.
# Erdem | 10 Haziran 2007, 19:03
Peki bu uygulamayı nasıl döngü içine sokacağız? mesela forech döngüsüyle veritabanından alınan sırasıyla yazılar var tek sayfada ve bunlara nasıl ekleyeceğiz? id si 1 den başlayıp 5 kadar giden tek sayfada farklı makaleler diğelim. hepsinin ayrı ayrı oylaması olacak.
# bgoral | 11 Haziran 2007, 10:23
Merhaba,
Kendi kütüphanemizi yazalımmı, yazarsak ne kazanırız. Ne kaybederiz? Niye herkesin ajax kütüphanesi var, kurallar belli değilmi, niye hergün kütüphane çıkıyor? Hepsi gerçekten birbirinden farklımı.
Makaleniz güzel tebrikler, ancak bence bu sitede daha ziyade örnek uygulamalar vermek yerine, teknolojik gelişmeler paylaşılıp tartışılmalı. Mesela,
1. google gears ve client caching nedemek, gereklimi,
2. grease monkey’e millet neden kasıyor. sadece hack amaçlımı.
3. Scripletler gereklimi, neden gerekli, ne demek bu scriptlet.
4. Flex diye bişey var, caching, proxying, veya xmlhttp layeri olarak kullanılıyor, eskiden kullanılan flash yerine. Niye bu adamlar bunları kullanıyor. XmlHttpRequest neden yetmiyor.
5. Ajaxta serverside ne olmalı. RoR,Python, Php,lisp,java,perl hangisi neden önemli neden önemsiz. Hangisi kullanılabilir. Php bazı uygulamaları yapmak için neden yeterli değil, yetersiz olduğu noktalar neler.
6. AjaxTr prototype, jquery, mootools, dojo extensionlarımızı paylaştığımız bir yer olsunmu gibi
Umarım çok şey istemiyorumdur, ama bence şu öğrenme ve öğretme modundan çıkıp, tartışma ve paylaşma moduna geçersek bu konuda çok hızlı ilerleriz.
Bir de bir link vermek istiyorum. ben tüm videoları izlemedim ama eminim izleyip javascript konusunda bir çok yanlışımızdan kurtulabiliriz.
http://video.yahoo.com/video/profile?sid=33385
Teşekkürler.
# eburhan | 11 Haziran 2007, 13:10
@bgoral
Bu tartışmalar için zaten bir “tartışma grubu” mevcut. Buradan ulaşabilirsin. Bu grupta istediğin gibi tartışma açabilirsin.
# orhan | 12 Haziran 2007, 15:30
Ellerine sağlık @eburhan, gerçekten bu kadar teorik bilginin üzerine enfes bir uygulama olmuş, tebrikler.
# Murat | 13 Haziran 2007, 10:50
Erdem’in sordugu soruyu soracaktim ben de. Bu ajax ile birden fazla oylanabilen anketi nasıl gösteririz?
# Hasan | 15 Haziran 2007, 21:45
Tşekkürler gerçekten güzel bir makale olmuş.
# Ahmet Eyüp ARTIR | 17 Haziran 2007, 12:59
elinize sağlık , çok faydalı olacağına eminim…
# yakuter | 17 Haziran 2007, 17:20
@murat ve Erdem, bahsettiğiniz konuyu ancak kod ile açıklayabiliriz ki bu da yorumlarla olacak şey değil. Ajax Nedir e-posta grubunda dilediğiniz gibi görüşebiliriz
@bgoral, yorumun için çok teşekkürler. Aslında biz hem öğretmek hem de paylaşmak istiyoruz. Sonuçta bilgi olmadan tartışma olmaz. Siteyi kurarken ilk amacımız AJAX konusunu öğretmek ve örnekler, uygulamalar sunmaktı. Sonradan gördük ki bu konuyu enine boyuna tartışmak da gerekli fakat eburhan ve ben malesef bu hıza yetişemiyoruz. Bir makaleyi yazmak bile 2 saati bulabiliyor.
Benim stajım Erhan’ın da sınav stresi bitsin, bakacağız duruma
# Harun | 26 Haziran 2007, 19:40
Güzel makale elinize sağlık
# Emre | 10 Ekim 2007, 12:45
Merhaba
gerçekten güzel bir makale ancak localhost um da deniyorum ve veritabanından sadece 1 id numaraları soruyo çekiyor 1 den sonrakiler ekrana gelmiyor sorun bende mi acaba
# Yusuf Bekar | 28 Aralık 2007, 19:34
Asp olarakda cevirdim
Default.asp
____________________________________
Oyla v1.0 ( Professional Web Developer Mc YuSuF)
Event.observe(window, ‘load’, aktifOylama, false);
function aktifOylama()
{
cevapAl(1);
}
function cevapKaydet(cevapTuru, soruNo)
{
$(’cevap’).innerHTML = ‘Oy kaydediliyor …’;
var myAjax = new Ajax.Updater(
‘cevap’,
‘Kaydet.asp’,
{
method: ‘post’,
parameters: ‘cevapTuru=’ + cevapTuru + ‘&soruNo=’ + soruNo,
onComplete: aktifOylama
});
}
function cevapAl(soruNo)
{
$(’kapsayici’).innerHTML = ‘Sonuç alınıyor …’;
var myAjax = new Ajax.Updater(
‘kapsayici’,
‘Cevap.Asp’,
{
method: ‘post’,
parameters: ’soruNo=’ + soruNo
});
}
__________________________________________
Cevap.asp
________________________________________________
0 Then
EvetYuzde = int((Evet / Toplam) * 100)
HayirYuzde = int((Hayir / Toplam) * 100)
Else
EvetYuzde = 0
HayirYuzde = 0
End IF
%>
);” title=” kisi”>
EVET (%)
);” title=” kisi”>
HAYIR (%)
_____________________________________________
kaydet.asp
_____________________________________________
Set Conn=Server.CreateObject(”Adodb.Connection”)
Conn.Open “Provider=Microsoft.Jet.oleDb.4.0;Data Source=” & Server.Mappath(”Db.mdb”)
Turu = Request.Form(”cevapTuru”)
SoruID = Request.Form(”soruNo”)
IF Turu=”e” Then
Conn.ExeCute(”Update Sorular Set Evet = Evet + 1 Where ID=”&SoruID&”")
Else
Conn.ExeCute(”Update Sorular Set Hayir = Hayir + 1 Where ID=”&SoruID&”")
End If
___________________________________________________
veritabanı Acces
Tablo adı : Sorular
Sütün adı Türü
ID otomatik sayı
Soru not
Evet sayı
hayır sayı
kolay gelsin
# Cem | 20 Şubat 2008, 22:52
cok güzel bir calisma Allah razi olsun. Yalniz Erdem’in sordugu soruyu ben de tekrar dile getirmek istiyorum : “bu uygulamayi nasil döngü icine sokacagiz?”
sevgili yakuter, Ajax Nedir e-posta grubunda, konunun aciklanabilecegini yazmisti ancak orada da arastirmalarima ragmen, ne yazik ki bu konuyla ilgili bir bilgi bulamadim. yardimci olabilirseniz cok sevinirim.
kolay gelsin