AJAX & JavaScript & DOM & Php fonemi
Oyal.php
-
<?php
-
-
include "baglan.php";
-
-
$id = $_POST['id'];
-
-
$sql = "SELECT * FROM puanlar WHERE yazi = '" . $id . "'";
-
$puan = 0;
-
$puan += $sonuc['puan'];
-
}
-
$ort = @($puan / $say);
-
$bos2 = 5 - $ortalama2;
-
-
$sql_ = "SELECT * FROM puanlar ";
-
$sql_ .= "WHERE yazi = '" . $id . "' AND veren = '" . $ip . "'";
-
if($say_ == 1) {
-
$bos_ = 5 - $puan_;
-
for($i = 1; $i <= $puan_; $i++) {
-
echo "<img src=\"resimler/mavi.gif\" />";
-
}
-
for($j = 1; $j <= $bos_; $j++) {
-
echo "<img src=\"resimler/gri.gif\" />";
-
}
-
} else {
-
for($i = 1; $i <= $ortalama2; $i++) {
-
echo ");\" />";
-
}
-
for($j = 1; $j <= $bos2; $j++) {
-
echo "\" src=\"resimler/gri.gif\" onmouseover=\"omo(";
-
}
-
}
-
-
-
?>
Sayfanın başına veritabanına bağlantımızı içeren baglan.php dosyasını include ediyoruz. Puan bilgisi alınacak yazının id’sini ve kullanıcının IP adresini ilgili değişkenlere atıyoruz.
Burada IP adresini nerede kullanacağımızla ilgili bilgi vermek istiyorum. Ben bu sistemi kodlarken bir ziyaretçinin birden fazla oy verememesi için ziyaretçinin IP adresini kayıt etme yoluna başvurdum. Aslında amacım temel mantığı göstermek olduğu için ayrıntılara pek takılmadığımı daha önce de söylemiştim. Bu yüzden bir ziyaretçinin birden fazla oy verememesini tamamen böyle bir sistemle sağlamak doğru olmaz. Cookie ve Session gibi başkaca sistemler de kullanmak ve veritabanına da çok fazla yük getirmememesi açısından bir süre sonra kayıtları temizlemek gibi ekstralarla bu sistemi geliştirmek mümkün ve hatta gerekli. Ama yine de kodları çok fazla karıştırmamak açısından ben bu sistemle kodlayacağım.
Değişkenleri atadıktan sonra veritabanından o yazıya verilen toplam puanı puan değişkenine, ortalama puanı da ort değişkenine yazdırıyoruz. Ort değişkenindeki @ işareti; eğer say değişkeni 0 ise, yani o yazıya daha önce kimse puan vermemişse Division by zero yani Sıfırla bölünme hatası vermesini önlemek için konmuştur. Ortalama1 değişkeni ort değişkeninin 2 ondalık hanesi bulunan, ortalama2 değişkeni ise ort değişkeninin hiç ondalık hanesi bulunmayan, yani tamsayı olan halidir. Ortalama2 değişkeni aynı zamanda sarı olan yıldızların sayısı olacağı için bos2 değişkeni ise geriye kalan gri yıldızların sayısı olacaktır.
Bundan sonra bir kontrol yapmamız gerekiyor. Bu kullanıcı aynı yazıya daha önce puan vermiş mi ? Bu kontrolü yapmak için bir sorgumuz ve onu izleyen bir if kalıbımız var. Eğer kullanıcı yazıya daha önce de puan verdiyse; yazıya verilen ortalama puan değil de, yazıya kullanıcının verdiği puan gösterilecek. Ortalama puan ise ifade olarak yer alacak. Kullanıcıya gösterilen yıldızlar ise sarı değil mavi olacak. Eğer kullanıcı ilgili yazıya daha önce puan vermemişse, bu sefer gösterilen yıldızlar sarı olacak, onmouseover durumunda omo(x) adlı JavaScript fonksiyonu çalıştırılacak. Bu fonksiyonda x, o yıldızın kaçıncı yıldız olduğunun numarası oluyor. Yani örneğin 3. yıldızsa, omo(3) fonksiyonu çalıştırılacak ve bu fonksiyonun görevi 3. yıldıza kadar olan tüm yıldızları mavi, diğer yıldızları ise gri yapmak olacak. Onmouseout durumunda, tüm yıldızların eski haline dönmesini sağlayan, parametresiz omout() fonksiyonu çalıştırılacak. Onclick durumunda ise oc(x) fonksiyonu çalıştırılarak kullanıcının yazıya x puan vermesi sağlanacak.
En sona da her durumda yazının ortalama ne kadar puan aldığı ve kaç kişinin puanlamaya katıldığı bilgisi yazılıyor.

Resim 5

Resim 6
Oyver.php
-
<?php
-
-
include "baglan.php";
-
-
$id = $_POST['id'];
-
$puan = $_POST['puan'];
-
-
$sql = "SELECT * FROM puanlar WHERE yazi = '" . $id . "' AND veren = '";
-
$sql .= $veren . "'";
-
if($say == 0) {
-
$sql = "INSERT INTO puanlar (yazi, puan, veren) VALUES('" . $id;
-
$sql .= "', '" . $puan . "', '" . $veren . "');";
-
}
-
-
?>
Bu dosya ise puanların veritabanına yazılma işlemini gerçekleştiriyor. Öncelikle baglan.php ile veritabanı bağlantısı sağlandıktan sonra puan verilen yazının id’si, verilen puan, ve puan verenin IP adresi ilgili değişkenlere yazılıyor. Daha sonra ise, eğer puan veren kişi daha önce de aynı yazıya puan vermemişse, puan verme işlemi tamamlanarak veritabanına yazılıyor. Bu dosya sadece bir işlem yapan bir dosya, geri döndürdüğü bir değer yok.
Ana Sayfanın Ajax ile İlgili Kısımları
Ana sayfada prototype.js’yi dahil ettikten sonraki kısma şu JavaScript fonksiyonlarını ekliyoruz.
-
<script type="text/javascript">
-
Event.observe(window, 'load', oyal, false);
-
-
function oyal() {
-
$('oylama').innerHTML = 'Oy alınıyor ...';
-
var sc = 'id=<?php echo $_GET['id']; ?>';
-
var nesne = new Ajax.Updater('oylama', 'oyal.php', {method: 'post', parameters: sc});
-
}
-
-
function omo(kac) {
-
for(i = 1; i <= kac; i++) {
-
dizi[i] = $('r' + i).src;
-
$('r' + i).src = 'resimler/mavi.gif';
-
}
-
var bos = 5 - kac;
-
for(j = 1; j <= bos; j++) {
-
t = kac + j;
-
dizi[t] = $('r' + t).src;
-
$('r' + t).src = 'resimler/gri.gif';
-
}
-
}
-
-
function omout() {
-
for(i = 1; i <= 5; i++) {
-
$('r' + i).src = dizi[i];
-
}
-
}
-
-
function oc(kac) {
-
$('oylama').innerHTML = 'Oy gönderiliyor ...';
-
var sc = 'id=<?php echo $_GET['id']; ?>&puan=' + kac;
-
var nesne = new Ajax.Request('oyver.php', {method: 'post', parameters: sc, asynchronous: false});
-
oyal();
-
}
-
</script>
Event.observe(window, 'load', oyal, false); satırı, prototype.js’nin bize yaptığı bir güzellik ve sayfa yüklenir yüklenmez oyal() fonksiyonunun çalıştırılmasını sağlıyor.
Oyal() fonksiyonu öncelikle div’imize Yükleniyor tarzında bir yazı yazdırıyor. Daha sonra puanı alınacak yazının id’sini gönderilmek üzere sc değişkenine yazdırıyor. Bir sonraki satırda ise oyal.php dosyasına sc değişkeni parametreleri içerecek şekilde post metoduyla gönderilirken, sonuçlar da oylama adlı div’e yazdırılıyor.
Omo(kac) fonksiyonu ise belirtilen yıldıza kadar olan yıldızların hepsinin mavi renge, diğerlerinin ise gri renge dönüşmesini sağlıyor. Bunu yaparken de yıldızların ilk hallerini dizi adlı dizi değişkene aktarıyor.
Omout() fonksiyonu yıldızların hepsinin ilk hallerine dönmesini sağlıyor. Bunu dizi adlı değişkeni kullanarak yapıyor.
Oc(kac) fonksiyonu ise istenen puanın yazıya verilmesini sağlıyor. Öncelikle ekrana Yükleniyor tarzında bir yazı yazdıktan sonra, sc değişkenine, gönderilecek parametreleri yazıyor. Bu parametreler yazının id’si ve verilen puan oluyor. Daha sonra oyver.php dosyasına bu parametreler gönderilerek puanın verilmesi sağlanıyor ve en son olarak da puanlar güncellenmiş haliyle oyal() fonksiyonu ile ekrana yazdırılmış oluyor.
Bu son fonksiyonda aklınıza takılmış olduğunu düşündüğüm iki soruyu cevaplayayım. Birincisi neden Ajax.Updater değil de Ajax.Request kullandığımızı sorabilirsiniz. Bunun sebebi dosyanın geri bir değer döndürmemesidir. Dosya sadece işlemimizi yapmış olur böylece. İkinci mevzu ise niye asynchronous: false ifadesini kullandığımızı sorabilirsiniz. Ben yaptığım denemelerde bazen oyal() fonksiyonuyla alınan puanların içinde bir adım önce verilen puanların hesaba katılmayabildiğini gördüm. İki işlem arasında çok kısa bir zaman aralığı olduğundan, bir işlem tamamlanmadan diğerinin tamamlanması yanlış sonuçlara neden olabiliyordu. Bu yüzden bir işlemin başlaması için diğer işlemin tamamlanmasını bekleme olayını sağlamış oldum.
Yıldızların üzerine gelindiğinde farenin el şekline dönüşmesi için de yine head bölümüne şu kodu ekleyebiliriz :
-
<style type="text/css">
-
img.yildiz { cursor: pointer; }
-
</style>
Tüm bunlardan sonra puanlama sistemimizi tamamlamış oluyoruz. Denemelerimizi yapıp emeğimizin ürününü almak gerçekten keyifli ... Böylece bundan sonraki uygulamalarımızda bu sistemi kullanabiliriz. Hayırlı olsun !
Tabii daha önce de belirttiğim gibi benim bu yazıyı yazarken asıl amacım sistemin temel mantığının nasıl olduğunu göstermek olduğundan birçok ayrıntıyı es geçmek durumunda kaldım. Bu ayrıntılar da tamamlanarak başkaca özellikler de eklenirse kusursuz uygulamalara imza atılabilir.
Yazıyı elimden geldiğince anlaşılır yazmaya özen gösterdim. Anlaşılmayan yerler varsa (iletisim [at] gokhanozturk [nokta] com [nokta] tr) e-posta adresimi kullanarak bana soru sorabilirsiniz. Bundan sonra da başkaca konularda makale yazmak isterim. Umarım siz Ajax-Tr ziyaretçilerine yararlı olabilirim.
Uygulamaya ait dosyaları indirebileceğiniz ve uygulamayı test edebileceğiniz bağlantılar aşağıdadır. Kalın sağlıcakla ...
Uygulamayı İndirin
Uygulamayı Test Edin
Gökhan ÖZTÜRK (fonemi)
Sayfalar: 1 2
Toplamda 7740 kez okunmuş.
Şu an 1 kişi okuyor.
En fazla 6 kişi aynı anda okumuş.
Bugün 10 kez okunmuş.
Etiketler: ajax, javascript, orta, oylama, php, prototype, puanlama
Trackback Yorumları takip et Baskı Önizleme

(109 oy, ortalama 4.42)
# yakuter | 15 Temmuz 2007, 17:55
Çok teşekkür ederim Gökhan bu mükemmel makale için. Paylaşmayı bir şeyler öğretmeyi seven kişi sayısı arttıkça daha da faydalı bir site ortaya koyabileceğimize inanıyorum.
# grkn | 15 Temmuz 2007, 19:36
Gerçekten çok yararlı bir makale fonemi
Eline sağlık
# University Update - AJAX - AJAX Puanlama Uygulamasi | 15 Temmuz 2007, 22:42
[…] YouTube Link to Article ajax AJAX Puanlama Uygulamasi » Posted at ajax-tr.com | Türkçe AJAX Kaynagi on Sunday, July 15, 2007 AJAX Puanlama Uygulamasi AJAX & JavaScript & Dom & Php fonemi Merhabalar, Öncelikle kendimi tanitayim … etmeye basladigim Ajax Türkiye sitesi Ajax-Tr.Com’a konuk yazar olarak yazmanin benim için bir kivanç kaynagi oldugunu belirtmek isterim. Ajax hakkinda benim ve bu isle ilgilenen herkesin birçok sey View Entire Article » […]
# Nous | 15 Temmuz 2007, 23:42
çok teşekkürler hocam.. yararlı bir makale olmuş..
# edves | 16 Temmuz 2007, 15:07
cok guzel acıklayıcı bır makale olmus ellerine saglık. devamını beklıyoruz
# önder | 16 Temmuz 2007, 18:48
bunu asp ile nasıl yapılabileceğini de anlatsanız çok güzel olacak o zaman
# yakuter | 16 Temmuz 2007, 21:04
ASP kodlamayı biliyorsan sorun yok. Yukarıdaki uygulamada PHP ile yaptığımız şeyleri (veritabanından veri okumak gibi…) ASP ile yaparsın ve uygulama ASP ile yapılmış olur. Javascript, html ve AJAX uygulamalarında ASP ile PHP arasında fark yok. Fakat şu var ki eğer ASP programlama konusunda bilginiz yoksa öncelikle o konuda çalışmanızı tavsiye ederim.
# salih | 22 Temmuz 2007, 22:21
Bence Çok güzel Bi çalışma Olmuş Emeğinize sağlık
# Slyther | 23 Temmuz 2007, 00:22
size bi asp ci lazım
# yakuter | 23 Temmuz 2007, 00:25
#Slyther, makale yazıp da konuk yazar olarak sitemizde yazmak isteyen kimseyi geri çevirmedik. Eğer bu sitedeki formatta yazmayı düşünürsen bekleriz
# Slyther | 23 Temmuz 2007, 06:14
tabi ASP konusunda bende insanları aydınlatmak isterim. php örneklerin yanı sıra ASP’de olmalı herkes php kullanmıyor değil mi : ) e-posta adresim sizde var, bilgi verirseniz yardımcı olmak isterim.
# salih | 02 Ağustos 2007, 04:13
Emeğinize Sağlık fakat
yazınca firefox ve internet explorerde gözüküyor oylama fakat operada görünmüyor bunu nasıl fixleriz Şimdiden teşekkürler
# fonemi | 13 Ağustos 2007, 22:17
Pardon bir süre yoktum cevap veremedim o yüzden. Opera ile test sayfasını açtım ama bir sorun göremedim. Acaba kodun bir kısmını yazarken hata mı yaptınız ?
# salih | 15 Ağustos 2007, 16:05
http://62.68.207.82/~makalec/diyet/ton-balikli-diyeti-denediniz-mi.html
Misal Burada
# hgirua | 17 Ağustos 2007, 23:11
inanılmaz güzel bir makale ajax karşı büyük bir ilgim var bu benim çok işime yarayacak çok teşekkürşer üstad emeğine sağlık…
# levent | 25 Ağustos 2007, 01:35
puanlama uygluamasını asp ile nasıl yapabiliriz bunu sitemde kullanmak istiyorum fakat php olduğu için kullanamıyorum
# Fubace | 01 Eylül 2007, 00:45
$id = $_POST[’id’];
$veren = $_POST[’veren’];
$puan = $_POST[’puan’];
$puan = @round($puan);
$veren = getenv(”REMOTE_ADDR”);
kafama bi yer takıldı.
oyver.php de $veren değişkenine önce posttan geleni atıyorsunuz.daha sonra da remote_addr global değişkenini atıyorsunuz.madem remote_addr kullanıcaksınız neden yukarısında posttan gelen veriyi alıyorsunuz.
# Taygun Kocabıyık | 01 Eylül 2007, 23:13
Merhabalar
Bu makaleyi yazan ve bizlerle paylaşan Gökhan Öztürk’e öncelikle teşekkürlerimi sunmak istiyorum.
Gerçekten faydalı ve açık anlatılmış bir yazı. PHP bilmememe rağmen sadece yazıları okuyarak ASP olarak kendime uyarlayabildim. Eğer yayınlarsanız döküman haline getirip yollamaktan büyük zevk duyucam. Ayrıca müsadeniz olur ise kaynak belirterek ASP versiyonunu diğer sitelerdede paylaşmak istiyorum. ASP ile ajax kullanımı nedense çok az ve neredeyse hiç örnek yok.
Tekrar teşekkürler
Saygılar
# fonemi | 02 Eylül 2007, 12:39
@salih : Dediğin problemi inceliyorum en kısa zamanda sana dönerim. Yalnız örnek uygulamanın Opera’da sorun çıkarmayıp senin uygulamanın çıkarması ilginç tabii.
@Fubace : Kodu yazarken önce IP adresinin bir önceki sayfadan gelmesine karar vermiştim ancak aktarımda bir problem oldu. O yüzden IP adresini o sayfada almaya karar verdim. Önceki kodu orada unutmuşum.
# Murat Karabük | 28 Eylül 2007, 22:11
Merhabalar ; bende bu script’i inceledim.Gayette güzel ellerine sağlık yanlız kafama bişey takıldı.Mesela en cok oy alanlar bölümü yapmak istesek??
# Harmankaya | 21 Ekim 2007, 19:55
Demo sayfa hata veriyor. Düzenlerseniz sevinirim.