5 Yıldızlı Ajax Oylama | PHP

Sitelerin çoğunda görmeye başladığımız 5 yıldızlı oylama sistemleri web 2.0 nin vazgeçilmezleri arasında yerini aldı. Buna benzer oylamayı kullanan sitelerden örnek vermek gerecek olursak; Dailymotion, Vidivodo gibi video sitelerinin yanısıra diğer sitelerde de kullanılıyor.Sitenizin kullanıcılarınızla olan etkileşimini artırmak için kullanılan bu tür özellikleri sitemize nasıl entegre edebilceğimizi,database mimarisini ve scriptimizi anlatacağım.

Makale sonunda yapacağımız sistem aşağıdaki demo linkindeki gibi olacaktır.

demo 5 star rating yildizli oylama 5 Yıldızlı Ajax Oylama | PHP

Her ne kadar Ajax ile oylama sistemini anlatacak olsam da , bir site örneği üzerinden anlatarak, daha yararlı olacağını düşünüyorum. Dosyaları sayfanın altına doğru bulabilirsiniz. Sitemizin ise 4 adet bileşeni var: index.php (giriş) sayfası, makale detay sayfası, veritabanı ve oylama sisteminin entegre edilmesi.

Sitenin Yapısı:

Örnek sitemiz, 2 adet sayfadan oluşuyor.

1 – )  index.php: bu sayfa sitemizin giriş sayfası olup veritabanına eklediğimiz makaleleri, ekleme tarihine göre, son eklenen üstte olacak şekilde listelemekte. Makale başlıklarına tıklandığında ise makale detay sayfasına geçiş yapılmakta.

2 – ) makale.php : Bu sayfamız index.php de listelenen makalelerin id sine göre filtreleme yaparak(query string), ilgili makalenin veritabanındaki alanlarını çekmekte.

Bilgisayarınızda bulunması gereken araçlar:

- Gelişmiş Text Editörü (Dreamweaver, NotePad ++)

- Apache sunucusu (ben  xampp ı kullanacağım)

1. ADIM – VERİTABANINI YAPILANDIRMA

Xampp’ ı bilgisayarınıza kurduktan sonra,xampp-control.exe yi çalıştırarak, Apache ve Mysql servislerini başlatın. Web browserınızı(Firefox,Internet Explorer, Chrome vb…) açarak, adres satırına http://127.0.0.1/phpmyadmin  i girin.

- Karşımıza çıkan ekranda, yeni veritabanı oluşturmak için, ismini “5starrating” giriyoruz.

phpmyadmin12 5 Yıldızlı Ajax Oylama | PHP

- Veritabanını oluşturduktan sonra, makale ve ratings isimli iki tablo oluşturacağız.

Makale Tablosu

Makale tablomuzda çok alan kullanmadım. En azından bu makalenin konusu değil. Şimdilik yapacağımız şu:

1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `makale` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`makale_baslik` VARCHAR(250) CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
`makale_giris` longtext CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
`makale_detay` longtext CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
`tarih` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin5 AUTO_INCREMENT=1 ;

Bu makale tablosunun yapısından biraz bahsedelim. Tabloda 5 adet sütun bulunmakta. Makale idsinin tutulacağı id alanı, makale başlığının tutulacağı makale_baslik alanı, makale girişinin bulunacağı(sadece index.php de gözükecek) makale_giris alanı, makale içeriğinin tamamının görüntülenebileceği makale_detay alanı , makalenin yazıldığı tarihin tutulacağı tarih alanı.

Bu alanları değerleri ise:

id –>  int olacak, auto_increment  ve primary key özellikleri
makale_baslik —> varchar 250 karakter, dil ailesiı ise utf8_turkish_ci
makale_giris —> longtext, dil ailesi utf8_turkish_ci
makale_detay —> longtext ve dil ailesi utf8_turkish_ci
tarih —> date değerinden, timestamp olacak, not null özelliği vererek, her yazılan makalede o anki zamanı almasını belirtiyoruz.

Not:  Tasarladığım bu veritabanında makale_giris ile makale_detay alanları birbirinden farklıdır. Bu özelliği koyarak, makale girişini daha spesifik veya dikkat çeken bir ön yazı kullanabiliriz. makale_detay alanında ise yazı bütünlüğünü koruyacak şekilde içeriğimizi post edebiliriz.

Makale Tablosunun İçeriği

1
2
3
4
INSERT INTO `makale` (`id`, `makale_baslik`, `makale_giris`, `makale_detay`, `tarih`) VALUES
(693, 'Asp.Net 4.0 Uygulamalarında URL Routing', '<p>Bu yazı <a href="http://www.emrekilinc.com" target="_blank">http://www.emrekilinc.com</a> adresinden alınmıştır. </p><p><img src="img/emre-kilinc.png" width="200"  height="200" />Merhaba arkadaşlar.Bu yazımda Asp.Net MVC ile birlikte hayatlarımıza   giren Routing ''i Asp.Net 4.0  uygulamalarına nasıl entegre   edebileceğimiz üzerinde duracağım.İki senaryomuz var.Birincisi   QueryString almayan sayfalar bir diğer ise QueryString alan sayfalar.İlk   senaryomuzu incelemeye başlayalım.Routing işlemlerini   System.Web.Routing namespace i altından yapacağız.QueryString almayan   bir sayfa için tek yapmamız gereken global.asax ''a aşağıdaki kodu   eklemek ve routing webforms üzerinde çalışacaktır. </p>', '<p>Bu yazı <a href="http://www.emrekilinc.com" target="_blank">http://www.emrekilinc.com</a> adresinden alınmıştır. </p><p><img src="img/emre-kilinc.png" width="200"  height="200" />Merhaba arkadaşlar.Bu yazımda Asp.Net MVC ile birlikte hayatlarımıza   giren Routing ''i Asp.Net 4.0  uygulamalarına nasıl entegre   edebileceğimiz üzerinde duracağım.İki senaryomuz var.Birincisi   QueryString almayan sayfalar bir diğer ise QueryString alan sayfalar.İlk   senaryomuzu incelemeye başlayalım.Routing işlemlerini   System.Web.Routing namespace i altından yapacağız.QueryString almayan   bir sayfa için tek yapmamız gereken global.asax ''a aşağıdaki kodu   eklemek ve routing webforms üzerinde çalışacaktır. </p>\r\n<div><br />\r\n</div>\r\n<div><strong>Global.asax</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<p> </p>\r\n<div><br />\r\n</div>\r\n<div><strong>Routing.aspx</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<p> </p>\r\n<div><img alt="asp.net 4.0  web forms   url routing" src="http://static.emrekilinc.com/Static/post6_1.png" /><br />\r\n</div>\r\n<div><br />\r\n</div>\r\nŞimdi gelelim   diğer senaryomuza.Eğer bu sayfa QueryString alsaydı ekstra olarak ne   yapmamız gerekirdi.Bunun için yapmamız gereken Global.asax ?taki   kodumuza gelecek olan QueryString değerlerini eklemek.Sayfada gelen   veriyi yakalamak için eksi yöntemden farklı bir yöntem kullanarak; <strong>Page.RouteData.Values["değişkenAdi"]</strong> ile yakalayacağız.\r\n<div><br />\r\n</div>\r\n<div><br />\r\n</div>\r\n<div>\r\n  <p><strong>Global.asax</strong></p>\r\n  <p> </p>\r\n</div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><br />\r\n</div>\r\n<div><br />\r\n</div>\r\n<div>\r\n  <p><strong>Routing.aspx</strong></p>\r\n  <p> </p>\r\n</div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><br />\r\n</div>\r\n<div><br />\r\n</div>\r\n<div><strong>Routing.aspx.cs</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><strong><br />\r\n</strong></div>\r\n<div><br />\r\n</div>\r\n<div><br />\r\n</div>\r\nBu kodları yazdıktan sonra <strong>/statiksayfa/Emre/Kılınç</strong> sayfasına gittiğimizde sayfa görüntüsü aşağıdaki gibi olacaktır.\r\n<div><br />\r\n</div>\r\n<div><img alt="asp.net 4.0 web forms   url routing" src="http://static.emrekilinc.com/Static/post6_2.png" /><br />\r\n</div>\r\n<div><br />\r\n</div>\r\n<div><br />\r\n</div>\r\nGördüğünüz gibi   Asp.Net 4.0 ile URL lerimizi kullanıcı ve SEO dostu hale getirmek bu   kadar basit.Bir sonraki makalemde Routing in nasıl çalıştığına   değineceğim.\r\n<div><br />\r\n</div>\r\n<div> Görüşmek üzere...</div>\r\n<div>\r\n  <h2> </h2>\r\n</div>', '2010-07-08 03:46:37'),
(695, 'The Verve - Bittersweet Symphony', '<img src="img/verve.jpg"  width="252" height="216" />cause it''s a bitter sweet symphony that''s life...<br />\r\n  try to make ends   meet , you''re a slave to the money then you die.<br />\r\n  i''ll take you down   the only road i''ve ever been down...<br />\r\n  you know the one that takes you   to the places where all the veins meet, yeah.<br />\r\n  <br />\r\n  no change, i can   change, i can change, i can change,<br />\r\n  but i''m here in my mould , i am   here in my mould.<br />\r\n  but i''m a million different people from one day to   the next...<br />\r\n  i can''t change my mould , no,no,no,no,no,no,no<br />\r\n  <br />', '<p><img src="img/verve.jpg"  width="252" height="216" />cause it''s a bitter sweet symphony that''s life...<br />\r\n  try to make ends   meet , you''re a slave to the money then you die.<br />\r\n  i''ll take you down   the only road i''ve ever been down...<br />\r\n  you know the one that takes you   to the places where all the veins meet, yeah.<br />\r\n  <br />\r\n  no change, i can   change, i can change, i can change,<br />\r\n  but i''m here in my mould , i am   here in my mould.<br />\r\n  but i''m a million different people from one day to   the next...<br />\r\n  i can''t change my mould , no,no,no,no,no,no,no<br />\r\n  <br />\r\n  well   i''ve never prayed,<br />\r\n  but tonight i''m on my knees, yeah.<br />\r\n  i need to   hear some sounds that recognise the pain in me, yeah.<br />\r\n  i let the   melody shine, let it cleanse my mind , i feel free now.<br />\r\n  but the   airwaves are clean and there''s nobody singing to me now.<br />\r\n  <br />\r\n  no   change, i can change, i can change, i can change,<br />\r\n  but i''m here in my   mould , i am here in my mould.<br />\r\n  and i''m a million different people   from one day to the next<br />\r\n  i can''t change my mould,   no,no,no,no,no,no,no<br />\r\n  <br />\r\n  have you ever been down?<br />\r\n  i can change, i   can change...<br />\r\n  <br />\r\n  cause it''s a bittersweet symphony this life.<br />\r\n  trying   to make ends meet, try to find somebody then you die.<br />\r\n  you know i can   change, i can change, i can change,<br />\r\n  but i''m here in my mould, i am   here in my mould.<br />\r\n  and i''m a million different people from one day to   the next.<br />\r\n  i can''t change my mould, no,no,no,no,no,no,no<br />\r\n  <br />\r\n  we''ve   got ya sex and violence melody and silence<br />\r\n  (have you ever been down)<br />\r\n(i''ll   take you down the only road i''ve ever been down)</p>\r\n<p><object width="480" height="384"><param name="movie" value="http://www.dailymotion.com/swf/video/x8zqub"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/x8zqub" width="480" height="384" allowfullscreen="true" allowscriptaccess="always"></embed></object> </p>', '2010-07-08 04:32:30'),
(696, 'Empire Of The Sun - We Are The People', '<img src="img/empireofthesun-we-are-the-people.jpg" width="309" height="205" />we can remember swimming in december,<br />\r\n  heading for the city lights, in   1975<br />\r\n  we share in each other<br />\r\n  nearer than father<br />\r\n  the scent of a   lemon, drips from your eyes<br />\r\n  <br />\r\n  we are the people that rule the world<br />\r\n  a   force running in every boy and girl<br />\r\n  all rejoicing in the world<br />\r\n  take   me now<br />\r\n  we can try<br />\r\n  <br />', '<p><object width="520" height="360"><param name="movie" value="http://www.dailymotion.com/swf/video/xctoo9"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/xctoo9" width="480" height="320" allowfullscreen="true" allowscriptaccess="always"></embed></object> </p><p><img   src="img/empireofthesun-we-are-the-people.jpg" width="309" height="205" />we can remember swimming in december,<br />\r\n  heading for the city lights, in   1975<br />\r\n  we share in each other<br />\r\n  nearer than father<br />\r\n  the scent of a   lemon, drips from your eyes<br />\r\n  <br />\r\n  we are the people that rule the world<br />\r\n  a   force running in every boy and girl<br />\r\n  all rejoicing in the world<br />\r\n  take   me now<br />\r\n  we can try<br />\r\n  <br />\r\n  we lived an adventure<br />\r\n  love in the summer<br />\r\n  followed   the sun till night<br />\r\n  reminiscing other times of life<br />\r\n  for each every   other<br />\r\n  the feeling was stronger<br />\r\n  the shock hit eleven<br />\r\n  got lost   in your eyes<br />\r\n  <br />\r\n  i can’t do well when i think you’re gonna leave me<br />\r\n  but   i know i try<br />\r\n  are you gonna leave me now<br />\r\n  can’t you be believing   now<br />\r\n  <br />\r\n  can you remember and humanize,<br />\r\n  it was still where we’d   energized,<br />\r\n  lie in the sand and visualize like its 75 again<br />\r\n  <br />\r\n  we   are the people that rule the world<br />\r\n  a force running in every boy and   girl<br />\r\n  all rejoicing in the world<br />\r\n  take me now<br />\r\n  we can try<br />\r\n  <br />\r\n  i   can’t do well when i think you’re gonna leave me<br />\r\n  but i know i try<br />\r\n  are   you gonna leave me now<br />\r\n  can’t you be believing now<br />\r\n  <br />\r\n  i know   everything about you<br />\r\n  you know everything about me<br />\r\n  know everything   about us<br />\r\n  <br />\r\n  i can’t do well when i think you’re gonna leave me, but i   know i try<br />\r\n  are you gonna leave me now<br />\r\ncan’t you be believing now</p>', '2010-07-08 04:41:37');

Ratings Tablosu

Ratings tablosunda, 4 adet alan bulunuyor. Verilen her oyu  veritabanına diğer alanlarla birlikte kaydedeceğimiz için, her bir oyun kendine ait id si olacak. Foreign key olarak tanımlı olan makale id si ni de tutarak, fonksiyonları çağırdığımızda böylece ilgili makalenin ortalaması ve kaç kişinin oy vermiş olduğu gibi özellikleri print yapabileceğiz. Tutacağımız 3. alan ise  oy veren kişinin IP numarası, 4. alan ise verilen her oyun sayısal değeri (1=çok kötü ,5= harika gibi)  kaydedilecek.

id —> int, not null,auto_increment ve primary key (bu verilen her bir oyun id si)
rating_id —>varchar 80 karakter, not null (bu makalemizin id sini tutuyor- Foreign Key )
rating_num  —> int , not null
IP  —> varchar 2 karakter – not null (oy veren kullanıcının IP si)

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `ratings` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`rating_id` VARCHAR(80) NOT NULL,
`rating_num` INT(11) NOT NULL DEFAULT '4',
`IP` VARCHAR(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

sql icon 5 Yıldızlı Ajax Oylama | PHP

SQL Dosyasını indirip, içeri aktar diyerek veritabanını hazır duruma getirebilirsiniz.

!!! Dilerseniz PhpMyAdmin ‘de veritabanı seçiliyken, “İçeriAktar” seçenini tıklayarak makale sonunda bulunan sql dosyasını da import edebilirsiniz.

phpmyadmin2 5 Yıldızlı Ajax Oylama | PHP

Veritabanımızdaki tabloları yapılandırdığımıza göre artık  sayfaları oluşturmaya başlayabiliriz.

phpmyadmin41 e1278959450995 5 Yıldızlı Ajax Oylama | PHP

2 . ADIM – VERİTABANINA BAĞLANTI DOSYAMIZ- Connections/starrating.php

Yukarıda oluşturmuş olduğumuz, veritabanına bağlanmamız için gerekli olan dosyamızı oluşturuyoruz. Sitenin root klasöründe “Connections” isimli bir klasör oluşturup “starrating.php” isimli bağlantı dosyamızı yazıyoruz.

1
2
3
4
5
6
 <?php
$hostname_starrating = "localhost";
$database_starrating = "5starrating";
$username_starrating = "root";
$password_starrating = "";
$starrating = mysql_pconnect($hostname_starrating, $username_starrating, $password_starrating) or trigger_error(mysql_error(),E_USER_ERROR); ?>

hostumuz : localhost
veritabanımız: 5starrating
veritabanı kullanıcımız : root
parola : “” (yok)

3. ADIM – index.php

Tasarım konusunda çok iyi olmadığım için Free Css Templates sitesindeki,Synchronize isimli tema üzerinde çalışacağız.

Daha fazla zaman kaybetmeyip,  php kodlarına geçiş yapalım. Indirmiş olduğumuz, index.html dosyasını, index.php olarak kaydedip, sayfanın en üstüne aşağıdaki kodları yerleştiriyoruz.

1
2
3
4
5
6
7
8
9
<?php require_once('Connections/starrating.php'); ?>
<?php
mysql_select_db($database_starrating, $starrating);
$sorgu_makale = "SELECT * FROM makale ORDER BY tarih DESC";
$makale = mysql_query($sorgu_makale, $starrating) or die(mysql_error());
$row_makale = mysql_fetch_assoc($makale);
$toplam_makale = mysql_num_rows($makale);
?>
<?php mysql_query("SET NAMES latin 5"); ?>

Yukarıdaki kod bloğunun 1. satırında, veritabanımıza bağlantı yaptığımız dosyayı çağırıyoruz. 4. satırda,  makale tablomuzdaki  kayıtları tarihe göre DESC(son girilen en üstte görüntülenecek) olacak şekilde SQL sorgumuzu yazıyoruz. 6. satırda, kayıtlarımızı alıyoruz. Yukarıdaki kod bloğumuz zaten birçok kişinin yapabileceği türden olduğu için üzerinde çok durmuyorum.

PHP kodlarımızı yerleştirdikten sonra yer alan html kodumuzun <div id=”content”> kısmına kadar olan bölümüne birşey yapmıyoruz. Bu alandan sonra döngümüzü başlatarak, makale tablosundan çekmiş olduğumuz,kayıtları  döndürmeye başlayacağız.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License

Name       : Synchronize
Description: A two-column, fixed-width design with dark color scheme.
Version    : 1.0
Released   : 20100223

-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>5 Yıldızlı Ajax Oylama sistemi PHP | 5 Star Rating | Mustafa Resul Çetinel</title>
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper">
<div id="header-wrapper">
<div id="header">
<div id="logo">
<h1><a href="#">Mr. cetinel </a></h1>
<p>5 Yıldızlı Ajax Oylama Sistemi | Mustafa Resul Çetinel </p>
</div>
</div>
</div>
<!-- end #header -->
<div id="page">
<div id="page-bgtop">
<div id="page-bgbtm">
<div id="content">[/html]

<div id="content"> tag inden sonra ise php kodları olarak şunları yazıyoruz.

[php]<?php do { ?>
<div>
<p><span><?php echo $row_makale['tarih']; ?></span></p>
<h2><a href="makale.php?id=<?php echo $row_makale['id']; ?>"><?php echo $row_makale['makale_baslik']; ?></a></h2>
<div style="clear: both;">&nbsp;</div>
<div>
<p><?php echo $row_makale['makale_giris']; ?></p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
</div>
<?php } while ($row_makale = mysql_fetch_assoc($makale)); ?><div style="clear: both;">&nbsp;</div>
</div></div></div></div></div></div></body></html>

1. satırda başlattığımız döngümüzde, veritabanımızdaki kayıtların nerede  ve nasıl gözükmesini istediğimizi belirtiyoruz. Mesela makale başlığının  görüntüleneceği alan olarak <h2> taginin bulunduğu yere <?php echo $row_makale['makale_baslik']; ?> kodunu yazarak, makalenin başlığını print yapıyoruz. Link olarak ise, makale.php sayfasını vererek,gidecek ola sorgu parametresini id(makale.php?id=), değerini ise, veritabanından çekmiş olduğumuz makalenin id si olarak tanımlamamız gerekiyor. Bunu da dinamik olarak çekersek, her döngü sonucu listelenen makalenin kendi detay sayfasına gitmesini sağlıyoruz. Değer alanı olarak da makale tablosundaki , makale id siniprint yapıyoruz(<?php echo $row_makale['id']; ?>)

<?php } while ($row_makale = mysql_fetch_assoc($makale)); ?> satrıyla d a başlatmış olduğumuz döngüyü sonlandırıyoruz.

Bağlantıyı kapatmak için , sayfanın en altına,

1
2
3
<?php
mysql_free_result($makale);
?>

Sonuç olarak index.php sayfasında bulunan kodlar şöyle oluyor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php require_once('Connections/starrating.php'); ?>
<?php
mysql_select_db($database_starrating, $starrating);
$sorgu_makale = "SELECT * FROM makale ORDER BY tarih DESC";
$makale = mysql_query($sorgu_makale, $starrating) or die(mysql_error());
$row_makale = mysql_fetch_assoc($makale);
$toplam_makale = mysql_num_rows($makale);
?>
<?php mysql_query("SET NAMES latin 5"); ?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License

Name       : Synchronize
Description: A two-column, fixed-width design with dark color scheme.
Version    : 1.0
Released   : 20100223

-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>5 Yıldızlı Ajax Oylama sistemi PHP | 5 Star Rating | Mustafa Resul Çetinel</title>
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper">
<div id="header-wrapper">
<div id="header">
<div id="logo">
<h1><a href="#">Mr. cetinel </a></h1>
<p>5 Yıldızlı Ajax Oylama Sistemi | Mustafa Resul Çetinel </p>
</div>
</div>
</div>
<!-- end #header -->
<div id="page">
<div id="page-bgtop">
<div id="page-bgbtm">
<div id="content">
<?php do { ?>
<div>
<p><span><?php echo $row_makale['tarih']; ?></span></p>
<h2><a href="makale.php?id=<?php echo $row_makale['id']; ?>"><?php echo $row_makale['makale_baslik']; ?></a></h2>
<div style="clear: both;">&nbsp;</div>
<div>
<p><?php echo $row_makale['makale_giris']; ?></p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
</div>
<?php } while ($row_makale = mysql_fetch_assoc($makale)); ?><div style="clear: both;">&nbsp;</div>
</div>
<!-- end #content -->
<div id="sidebar">
<ul>
<li>
<div id="search" >
<form method="get" action="#">
<div>
<input type="text" name="s" id="search-text" value="" />
<input type="submit" id="search-submit" value="Arama" />
</div>
</form>
</div>
</li>
<li>
<h2><strong>Quae nocent docent</strong></h2>
<p>&quot;The quiter you become, The more you are able to hear &quot; </p>
</li>
<li>
<h2>Kategoriler</h2>
<ul>
<li><a href="#">Solaris</a></li>
<li><a href="#">Php</a></li>
<li><a href="#">Ajax</a></li>
<li><a href="#">ASP.NET</a></li>
<li>Linux</li>
</ul>
</li>
<li>
<h2>Blogroll</h2>
<ul>
<li><a href="#">Emre Kılınç </a></li>
<li><a href="#">Consectetuer adipiscing elit</a></li>
<li><a href="#">Metus aliquam pellentesque</a></li>
<li><a href="#">Suspendisse iaculis mauris</a></li>
<li><a href="#">Urnanet non molestie semper</a></li>
<li><a href="#">Proin gravida orci porttitor</a></li>
</ul>
</li>
</ul>
</div>
<!-- end #sidebar -->
<div style="clear: both;">&nbsp;</div>
</div>
</div>
</div>
<!-- end #page -->
</div>
<div id="footer">
<p>Copyright (c) 2008 Sitename.com. All rights reserved. Design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>.</p>
</div>
<!-- end #footer -->
</body>
</html>
<?php
mysql_free_result($makale);
?>

4. ADIM – makale.php (MAKALE DETAY  SAYFASI )

makle.php sayfasının en üstünde bulunan kısmına php kodlarımızı yerleştirelim.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php require_once('Connections/starrating.php'); ?>
<?php
$colname_makalefiltreleme = "-1";
if (isset($_GET['id'])) {
$colname_makalefiltreleme = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);
}
mysql_select_db($database_starrating, $starrating);
$sorgu_makalefiltreleme = sprintf("SELECT * FROM makale WHERE id = %s", $colname_makalefiltreleme);
$makalefiltreleme = mysql_query($sorgu_makalefiltreleme, $starrating) or die(mysql_error());
$row_makalefiltreleme = mysql_fetch_assoc($makalefiltreleme);
$toplam_makalefiltreleme = mysql_num_rows($makalefiltreleme);
?>
<?php mysql_query("SET NAMES latin 5"); ?>

index.php de listelemiş olduğumuz makalelerin detayını görmek için bir önceki sayfada parametre ve değerini belirtmiştik. Şimdi ise bu parametre ve değeri bu sayfada yakalamamız gerekiyor. Parametremiz değişmiyor ve yakalayacak olduğumuz değer de gelen int veriye göre makale id mizi kullanrak, makalenin diğer detaylarını çekmek olacak.index.php deki kodlardan fark olarak sadece bir değeri yakalamak oluyor. $sorgu_makalefiltreleme = sprintf(“SELECT * FROM makale WHERE id = %s”, $colname_makalefiltreleme);  satırındaki %s değerini $colname_makalefiltreleme  parametresinden alıyoruz. $colname_makalefiltreleme nin değerini de bir önceki sayfadan gönderilen değeri $GET['id'] ile alarak makale filtrelemesini de yapmış oluyoruz.

Veritabanında bulunan diğer alanları(makale_detay,makale_baslik,tarih …)  html kodumuzda görmek istediğimiz html  tagleri arasında print yapıyoruz.

index.php sayfamızda yaptığımız gibi bağlantımızı kapatıyoruz.

Tüm makale.php Kodumuz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php require_once('Connections/starrating.php'); ?>
<?php
$colname_makalefiltreleme = "-1";
if (isset($_GET['id'])) {
$colname_makalefiltreleme = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);
}
mysql_select_db($database_starrating, $starrating);
$sorgu_makalefiltreleme = sprintf("SELECT * FROM makale WHERE id = %s", $colname_makalefiltreleme);
$makalefiltreleme = mysql_query($sorgu_makalefiltreleme, $starrating) or die(mysql_error());
$row_makalefiltreleme = mysql_fetch_assoc($makalefiltreleme);
$toplam_makalefiltreleme = mysql_num_rows($makalefiltreleme);
?>
<?php mysql_query("SET NAMES latin 5"); ?>< ?
include("includes/rating_functions.php");
?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License

Name       : Synchronize
Description: A two-column, fixed-width design with dark color scheme.
Version    : 1.0
Released   : 20100223

-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>5 Yıldızlı Ajax Oylama sistemi PHP | 5 Star Rating | Mustafa Resul Çetinel</title>
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />

<link rel="stylesheet" type="text/css" href="css/rating_style.css" media="screen" />

<script type="text/javascript" src="js/prototype.js"></script>

<script type="text/javascript" src="js/rating_update.js" ></script>

</head>

<body>
<div id="wrapper">
<div id="header-wrapper">
<div id="header">
<div id="logo">
<h1><a href="index.php">Mr. cetinel </a></h1>
<p>5 Yıldızlı Ajax Oylama Sistemi | Mustafa Resul Çetinel </p>
</div>
</div>
</div>
<!-- end #header -->
<div id="page">
<div id="page-bgtop">
<div id="page-bgbtm">
<div id="content">
<div>
<p><span><?php echo $row_makalefiltreleme['tarih']; ?> </span></p>
<h2><a href="makale.php?id=<?php echo $id; ?>"><?php echo $row_makalefiltreleme['makale_baslik']; ?> </a></h2>
<div style="clear: both;">&nbsp;

<table width="200" border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td>&nbsp;</td>
<td><span>&nbsp;< ? echo pullRating($row_makalefiltreleme['id'],true,false,true); ?></span>&nbsp;</td>
</tr>
</table>
</div><br />
<br />
<br />
<br />
<br />

<div>
<p><?php echo $row_makalefiltreleme['makale_detay']; ?>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
</div>
<div style="clear: both;">&nbsp;</div>
</div>
<!-- end #content -->
<div id="sidebar">
<ul>
<li>
<div id="search" >
<form method="get" action="#">
<div>
<input type="text" name="s" id="search-text" value="" />
<input type="submit" id="search-submit" value="Arama" />
</div>
</form>
</div>
</li>
<li>
<h2><strong>Quae nocent docent</strong></h2>
<p>&quot;The quiter you become, The more you are able to hear &quot; </p>
</li>
<li>
<h2>Kategoriler</h2>
<ul>
<li><a href="#">Solaris</a></li>
<li><a href="#">Php</a></li>
<li><a href="#">Ajax</a></li>
<li><a href="#">ASP.NET</a></li>
<li>Linux</li>
</ul>
</li>
<li>
<h2>Blogroll</h2>
<ul>
<li><a href="#">Emre Kılınç </a></li>
<li><a href="#">Tumblr</a><a href="#"></a></li>
</ul>
</li>
</ul>
</div>
<!-- end #sidebar -->
<div style="clear: both;">&nbsp;</div>
</div>
</div>
</div>
<!-- end #page -->
</div>
<div id="footer">
<p>Copyright (c) 2008 Sitename.com. All rights reserved. Design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>.</p>
</div>
<!-- end #footer -->
</body>
</html>
<?php
mysql_free_result($makalefiltreleme);
?>

5. ADIM – 5 YILDIZLI OYLAMA ALANI ( 5 STAR RATING )

Yukarıdakilerle php sayfalarının normal çalışma prosedürünü anlatmış olduk. Peki ya 5 yıldızlı oylamayı nasıl entegre edeceğiz veya nasıl yapacağız diye soruyorsanız. Bu bölümde bu aşamaları bulabilirsiniz.

Öncelikle bu oylama sisteminin dosyalarına bakalım.

- css klasörü altında,  yıldızların görsel bir hale gelmesi için kullandığımız, rating_style.css

- include klasörü altındaki, rating_process.php, rating_functions.php ve rating_config.php dosyaları

- js klasörü altındaki , rating_update.js dosyası

Sayfanın altına doğru bulunan linkten bu  dosyaları indirebilirsiniz.

Jordan Boesch tarafından geliştirilen ve www.boedesign.com sitesinde yer alan bu dosyaları(Türkçe) kendi sistemimize entegre edeceğiz.

1 – İlk olarak sitemizin kök dizininde, include, js  ve css isimli klasörler oluşturup, sayfanın altında bulacağınız linkten bu dosyaları indirip buraya yapıştırıyorsunuz.

2 – makale.php dosyasını açarak php kodlarımızın bitip, html kodlarımızın başladığı yere şu dosyayı çağırıyoruz.

1
2
3
< ?
include("includes/rating_functions.php");
?>

3 -  <head> taginden önceki yere tıklayarak şu yolları belirtiyoruz.

1
<script src="js/rating_update.js" type="text/javascript"></script>

Böylece hem css dosyamızı alarak yıldızlarımızı görsel halegetiriyorz, hem de rating_update.js dosyasını alarak, sayfada refresh yapmadan ajax ile oylama işlemini yapabiliyor olacağız . 4 -  Son olarak ise , oylanacak olan makalenin id sini bu alana bildirmek kaldı. Jordan Boesch tarafından yapılan fonksiyonlarda şöyle bir kod yazarak anında ratings tablosuna kayıt yapabiliyoruz.

1
< ? echo pullRating($row_makalefiltreleme['id'],true,false,true); ?>

Yukarıdaki kodu sitemizin tasarımına göre, dilediğimiz yere koyabiliriz.  Bu kodu açıklamak gerekirse $row_makalefiltreleme['id']   : index.php sayfasından gönderip, makale.php sayfasında yakalmış olduğumuz makalenin id si .Böylece makalenin ortalama puanının kaç olduğunu veya puan verme işlemini yapıp yapamayacağımızı görebiliyoruz.Yani kısaca makale id miz olacak. (int veri tipinde) 2. alan- true /false :3/5 şeklinde gösterilip gösterilmeyeceğini tanımlar. true olursa 5 üzerinden derecelendirilmesi gösterilir. false olursa gösterilmez. ben true olarak ayarladım. 3. alan -true/false : yüzde cinsinden hesaplamasını gösterir. 46/100 gibi. ben bunu false oalrak ayarladım . 4. alan true/false : oylamaların gösterilip gösterilmeyeceği, true diyerek gösterilmesini sağlıyoruz. 5. alan – ‘novote’ : eğer sonuncu alan olarak, bu değeri yazarsak, oylamalara kapatmış oluruz. Peki bu özelliği nerelerde kullanabiliriz. Diyelimki kullanıcılarımız index.php sayfasına geldiler. Ama makalenin içeriğini görmeden oy vermeleri pek sağlıklı olmayacağı için burada (index.php sayfası için) ‘novote’ stringini kullanarak, oylama yapılmasını engelleyebiliriz. Ama makale.php sayfasında ise oylamaya izin vermek için ‘novote’ stringini kullanmayarak, oylamayı aktif hale getiririz. Normal sitemize entegre etmek için kullanacak olduğumuz kod bloğu şu

1
< ? echo pullRating(maklenizin veya gelen değerin id si ,true,false,true); ?>

Böylelikle makale.php sayfasının son hali şöyle oluyor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php require_once('Connections/starrating.php'); ?>
<?php
$colname_makalefiltreleme = "-1";
if (isset($_GET['id'])) {
$colname_makalefiltreleme = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);
}
mysql_select_db($database_starrating, $starrating);
$sorgu_makalefiltreleme = sprintf("SELECT * FROM makale WHERE id = %s", $colname_makalefiltreleme);
$makalefiltreleme = mysql_query($sorgu_makalefiltreleme, $starrating) or die(mysql_error());
$row_makalefiltreleme = mysql_fetch_assoc($makalefiltreleme);
$toplam_makalefiltreleme = mysql_num_rows($makalefiltreleme);
?><?php mysql_query("SET NAMES latin 5"); ?>
< ?
include("includes/rating_functions.php");
?>< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License

Name       : Synchronize
Description: A two-column, fixed-width design with dark color scheme.
Version    : 1.0
Released   : 20100223

-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>5 Yıldızlı Ajax Oylama sistemi PHP | 5 Star Rating | Mustafa Resul Çetinel</title>
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />

<link rel="stylesheet" type="text/css" href="css/rating_style.css" media="screen" />

<script type="text/javascript" src="js/prototype.js"></script>

<script type="text/javascript" src="js/rating_update.js" ></script>

</head>

<body>
<div id="wrapper">
<div id="header-wrapper">
<div id="header">
<div id="logo">
<h1><a href="index.php">Mr. cetinel </a></h1>
<p>5 Yıldızlı Ajax Oylama Sistemi | Mustafa Resul Çetinel </p>
</div>
</div>
</div>
<!-- end #header -->
<div id="page">
<div id="page-bgtop">
<div id="page-bgbtm">
<div id="content">
<div>
<p><span><?php echo $row_makalefiltreleme['tarih']; ?> </span></p>
<h2><a href="makale.php?id=<?php echo $id; ?>"><?php echo $row_makalefiltreleme['makale_baslik']; ?> </a></h2>
<div style="clear: both;">&nbsp;

<table width="200" border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td>&nbsp;</td>
<td><span>&nbsp;< ? echo pullRating($row_makalefiltreleme['id'],true,false,true); ?></span>&nbsp;</td>
</tr>
</table>
</div><br />
<br />
<br />
<br />
<br />

<div>
<p><?php echo $row_makalefiltreleme['makale_detay']; ?>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
</div>
<div style="clear: both;">&nbsp;</div>
</div>
<!-- end #content -->
<div id="sidebar">
<ul>
<li>
<div id="search" >
<form method="get" action="#">
<div>
<input type="text" name="s" id="search-text" value="" />
<input type="submit" id="search-submit" value="Arama" />
</div>
</form>
</div>
</li>
<li>
<h2><strong>Quae nocent docent</strong></h2>
<p>&quot;The quiter you become, The more you are able to hear &quot; </p>
</li>
<li>
<h2>Kategoriler</h2>
<ul>
<li><a href="#">Solaris</a></li>
<li><a href="#">Php</a></li>
<li><a href="#">Ajax</a></li>
<li><a href="#">ASP.NET</a></li>
<li>Linux</li>
</ul>
</li>
<li>
<h2>Blogroll</h2>
<ul>
<li><a href="#">Emre Kılınç </a></li>
<li><a href="#">Tumblr</a><a href="#"></a></li>
</ul>
</li>
</ul>
</div>
<!-- end #sidebar -->
<div style="clear: both;">&nbsp;</div>
</div>
</div>
</div>
<!-- end #page -->
</div>
<div id="footer">
<p>Copyright (c) 2008 Sitename.com. All rights reserved. Design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>.</p>
</div>
<!-- end #footer -->
</body>
</html>
<?php
mysql_free_result($makalefiltreleme);
?>

d5keg 5 Yıldızlı Ajax Oylama | PHPTüm Dosyaları İndirmek İçin İkona Tıklayınız

pixel 5 Yıldızlı Ajax Oylama | PHP

Related posts:

  1. PHP ve Mysql İle Dinamik RSS Besleme(Feed) Oluşturma
679 gün ago by in Php & Mysql | You can follow any responses to this entry through the RSS feed. You can leave a response, or trackback from your own site.
6 Comments to 5 Yıldızlı Ajax Oylama | PHP
    • hasan akgün
    • hocam merhaba sistemi kurdum çok güzel çalışıyor fakat ben sadece yıldızların çıkmasını istiyorum 1 oy verildi 2 oy verildi vs. çıkmasını istemiyorum nasıl yapabiliriz ? yardımcı olursanız sevinirim

      • admin
      • makaleye bir daha göz atarsanız. kaçırdığınız ayrıntıyı daha rahat görebilirsiniz.
        < ? echo pullRating($id ,true,false,true); ?>
        tekrar hatırlatmak gerekirse, yukarıdaki kodda bulunan birinci alan ($id değeri), sayfamızın id si oluyor, ikinci alan ise 5 üzerinden değerlendirmeleri(3/5, 1/5 gibi) , üçüncü alan ise yüzde türünden değerlendirmeleri (38/100, 64/100 .. gibi) , dördüncü olan alan ise kaç oy verildiğini (1 oy verildi, 2 oy verildi ) gösteriyor.Yani sizin sorunuzu düzeltmek için bu alanı false yapmanız yeterlidir.

    • Murat Başbuğ
    • Çok teşekkürler. O kadar aramama rağmen türkçe bir anlatım bulamamıştım. Projemi tamamlamama yardımcı oldu. Hem daha güzel göüküyor sitem ..

    • Yavuz
    • Çok teşekkür ederim. çok işime yaradı bu oy sistemi. Şiirbul.net sitesinde de kullandım çok hoş durdu.

      İyi çalışmalar…

    • can
    • Merhaba seo kısmında sorun yaşıyorum
      You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘[L,NC]‘ at line 1
      hatasını veriyor bunu nasıl çözümlerim acaba

Leave A Response

* Required