5 Stars Rating система
Здравейте,

реших и аз да пусна една такава система за гласуване :)
Системата използва AJAX.


Сега като за начало ще започнем от структурата на базата данни.

Правим си една база данни и вътре слагаме:

CREATE TABLE `star_vote` (
`id` int(15) NOT NULL,
`rating` int(10) NOT NULL default '0',
`glasuvali` int(5) NOT NULL default '0',
UNIQUE KEY(`id`)
);

CREATE TABLE `star_vote_ip` (
`id` int(15) NOT NULL,
`ip` varchar(30) NOT NULL
);



Така след като сме създали и вкарали структурата на таблицата в базата данни, следва да преминем към следващия файл.

Значи създавате си файл connect.php и в него слагате:

<?php
define(DB_HOST, "localhost");
define(DB_USER, "root");
define(DB_PASS, "");
define(DB_NAME, "5stars");

$conn = @mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
@mysql_select_db(DB_NAME, $conn) or die(mysql_error());

define(STARS, 5); // от тук може да окажете колко звезди да се изобразяват
?>


След като сте го създали трябва да промените настройките за връзка с базата данни, като имате възможност да промените и звездите, които да бъдат изобразявани.

Сега следва да си направим файл config.php. В него слагаме:

<?php
require "connect.php";

$id = $_GET['id']; // взимаме ID;

$display_rating = false;
if (is_numeric($id) && $id > 0) // проверяваме дали ID е число и дали е по-голямо от 0
{
$display_rating = true;
$vote_allow = true;

$votes = array();

$row = mysql_fetch_object(mysql_query("SELECT `rating`, `glasuvali`, COUNT(*) as 'kolko' FROM `star_vote` WHERE `id` = '$id' LIMIT 1"));
if ($row -> kolko) // правим проверка дали вече е гласувано поне 1 път за това ID
{
$rating = @round($row -> rating / $row -> glasuvali); // присвояваме рейтинга в променлива $rating

$votes = array_pad($votes, $rating, "starvoted.png"); // пълним масива $votes със starvoted.png(пълни звездички)
$ip_vote = @mysql_result(mysql_query("SELECT COUNT(*) FROM `star_vote_ip` WHERE `id` = '$id' AND `ip` = '".$_SERVER['REMOTE_ADDR']."'"), 0);
if ($ip_vote) $vote_allow = false; // правим проверка дали вече е гласувано през това IP и ако е гласувано забраняваме следващо гласуване
}
$votes = array_pad($votes, STARS, "starunvoted.png"); // допълваме масива $votes със starunvoted.png(празни звездички)
}
?>


Така, готови сме и с този файл. Няма какво да променяте по него.

Сега се предвижваме до файл vote_star.js. В него също няма какво да променяте.

Ето го и неговото съдържание:
var xmlHttp

function vote_star(id, str)
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="vote_star.php"
url=url+"?id="+id
url=url+"&str="+str+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}

function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("star_votes").innerHTML=xmlHttp.responseText;
}
}

function GetXmlHttpObject()
{
var objXMLHttp=null
if (window.XMLHttpRequest)
{
objXMLHttp=new XMLHttpRequest()
}
else if (window.ActiveXObject)
{
objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
}
return objXMLHttp
}


Сега следва файла vote_star.php. В него сложете:
<?php
require "connect.php";

$id = $_GET['id'];
$str = $_GET['str'];
$ip = $_SERVER['REMOTE_ADDR'];

if (is_numeric($id) && $id > 0 && in_array($str, range(1,STARS))) // правим проверка дали ID е число и дали е по-голямо от 0. Правим също проверка дали рейтинга, който сме избрали е от 1 до променливата STARS
{ // ако всико е ОК продължаваме

$votes = array();

$row = mysql_fetch_object(mysql_query("SELECT `rating`, `glasuvali`, COUNT(*) as 'kolko' FROM `star_vote` WHERE `id` = '$id' LIMIT 1"));

if ($row -> kolko) // правим проверка дали вече е гласувано за това ID
{ // ако е гласувано
$ip_vote = @mysql_result(mysql_query("SELECT COUNT(*) FROM `star_vote_ip` WHERE `id` = '$id' AND `ip` = '$ip'"), 0);

$new_glasuvali = $row -> glasuvali;

if (!$ip_vote) // правим проверка дали IP е гласувало за това ID. Ако не е гласувано продължаваме
{
$new_rating = $row -> rating + $str; // добавяме новия рейтинг към стария
$new_glasuvali += 1; // добавяме 1 към общо гласувалите

$rating = @round($new_rating / $new_glasuvali); // изчисляваме средния рейтинг
$votes = array_pad($votes, $rating, "starvoted.png"); // пълним масива $votes със starvoted.png(пълни звездички)

mysql_query("UPDATE `star_vote` SET `rating` = '$new_rating',`glasuvali` = '$new_glasuvali' WHERE `id` = '$id'"); // упдейтваме информацията за даденото ID
mysql_query("INSERT INTO `star_vote_ip` (`id`,`ip`) VALUES ('$id','$ip')"); // записваме IP на гласувалия
}
}
else // ако все още никой не е бил гласувал за това ID
{
$rating = $str;
$new_glasuvali = 1;
$votes = array_pad($votes, $rating, "starvoted.png"); // пълним масива $votes със starvoted.png(пълни звездички)

mysql_query("INSERT INTO `star_vote` (`id`, `rating`, `glasuvali`) VALUES ('$id', '$str', '1')"); // създаваме ново ID с неговия рейтинг
mysql_query("INSERT INTO `star_vote_ip` (`id`,`ip`) VALUES ('$id','$ip')"); // записваме IP на гласувалия
}

$votes = array_pad($votes, STARS, "starunvoted.png"); // допълваме масива $votes със starunvoted.png(празни звездички)

if ($rating)
{
for ($i=0;$i<STARS;$i++)
echo "<img src=\"".$votes[$i]."\" border=\"0\">";
}
echo "<br />Гласували: $new_glasuvali";
}
?>


Така почти приключихме. Остана ни само index.php.

Създайте го и сложете в него:
<?php
require "config.php";
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Демо</title>
<?php
if ($display_rating)
{
?>
<script src="vote_star.js" type="text/javascript"></script>
<script type="text/javascript">
function star_vote(id)
{
for (i=1;i<=<?=STARS?>;i++)
{
if (i <= id)
{
document[i].src="starvoted.png";
}
else
{
document[i].src="starunvoted.png";
}
}
}
function normal()
{
<?php
for ($i=0,$i2=1;$i<STARS;$i++,$i2++)
{
echo "document[$i2].src=\"".$votes[$i]."\";\n";
}
?>
}
</script>
<?php
}
?>
</head>
<body>

<?php
if ($display_rating)
{
?>
<b>Гласувай:</b>
<div id="star_votes">
<?php
for ($i=0,$i2=1;$i<STARS;$i++,$i2++)
{
?>
<?php if ($vote_allow) { ?><a href="javascript:void(null)" onMouseOver="star_vote('<?=$i2?>')" onMouseOut="normal()" onClick="vote_star('<?=$id?>', '<?=$i2?>')"><?php } ?><img id="<?=$i2?>" src="<?=$votes[$i]?>" border="0"><?php if ($vote_allow) { ?></a><?php }
}
?><br />
Гласували: <?=$row -> glasuvali?>
</div>
<?php
}
else echo "<b>Невалидно ID!</b>";
?>

</body>
</html>



Това е урока. Ако всичко сте направили както трябва, би трябвало да ви се получи това -> ДЕМО

А и да не забравя. Ето и картинките от системата. Сложете ги при файловете.

http://hunter-bg.net/demo/starvoted.png
http://hunter-bg.net/demo/starunvoted.png


Ето и как да го използвате. Отваряте си index.php като след него слагате ?id=[тук ID]

Примерно: site.com/index.php?id=1

За всяко ID рейтинга е индивидуален :)


Надявам се системата да ви е от полза!

/ Трябва да сте регистриран за да напишете коментар /
От: bgchannel
14:26 15-09-2009
Като гледам доста добре разбираш от рейтинг системи можеш ли да се свържеш с мене на skyep: sladkia66 имам един въпрос към тебе ако ли не напиши си skypeto или e-mail за връска. Благодаря ти предварително !
От: paco
16:31 04-03-2010
првя всичко както е обеснено и като я пусна на моя сървър и ми дава грешка
От: Gavin
18:14 04-03-2010
@paco, всичко е ок! тествал съм я на localhost и всичко върви..ако я тестваш на платен хостинг няма как да не тръгне..
От: pich
22:49 02-04-2010
Имам един въпрос примерно аз имам новина. И искам на нея да сложа тази рейтинг система в таблицата на новината като има ми е idnews как да направя за примерно за всяка една новина да отчита различно. Ще добавя всичко това което си написал за в сял в таблицата на новината а не в различни.
Въпроса ми е как да направя системата да има различен вот за всяка една новина като в таблицата на новината името и е записано под обозначение idnews
От: paco
9:03 03-04-2010
да пробвах я на платен хостинг и всичко си е ок нямам проблеми мерси много
От: paco
20:43 03-04-2010
в монета линковете към снимките не работят оправете ги
От: topchokt
10:02 03-05-2010
Ето линковете към снимките:
http://web-tourist.net/userfiles/1/2104.png
http://web-tourist.net/userfiles/1/2105.png


Много добра система . Благодаря на HunteR .
От: M1tq
10:09 01-10-2010
а как да го направя да взима ид което е ид-то н ададен потребител от сайта ?
От: Lo0pY
23:55 10-03-2011
HunteR Много ще се радвам ако малко преработиш системата и я напваиш да е за цикъл Примерно има цикъл с новини и от отвън да се оценява и да може по няколко една след други... Аз иначе я ползвам в момента ама не ми е удобна от много.. а незнам мн AJAX да си преработя кода да не зема от гет, а да взема от ид-то.
От: bobbykokala
18:54 01-05-2011
Аз имам проблем. Като оценя със звездичка и думата "Гласували:" отдолу става на маймуница. Като обновя и се оправя. Не съм слагал utf-8 енкодинга от кода,защото целия сайт използва windows-1251.
От: HunteR
19:50 01-05-2011
Запази vote_star.php с ANSI кодировка. ;)
От: bobbykokala
23:54 01-05-2011
Беше си на ANSI. Промених го на UTF-8 без BOM и така стана.
От: DevNull
12:51 29-06-2011
Ето демо на урока : http://wthost.nbox.eu/5starrating/?id=1 . в близката една година ще работи :)
От: winers
22:21 04-08-2011
Пише ми Невалидно ID! ..
От: winers
22:22 04-08-2011
А оправих се мерси :)
1