Здравейте,
сега съм решил да споделя с вас една система за гласуване, която преди време правих за 1 сайт, който така и не беше завършен.
Това е така наречената 5 Stars Rating система.
Сега като за начало ще започнем от структурата на базата данни.
Правим си една база данни и вътре слагаме:
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);if (!$ip_vote) // правим проверка дали IP е гласувало за това ID. Ако не е гласувано продължаваме
{
$new_rating = $row -> rating + $str; // добавяме новия рейтинг към стария
$new_glasuvali = $row -> 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;
$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">";
}
}
?>
Така почти приключихме. Остана ни само 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 }
}
?>
</div>
<?php
}
else echo "<b>Невалидно ID!</b>";
?></body>
</html>
Това е урока. Ако всичко сте направили както трябва, би трябвало да ви се получи това -> ДЕМО
А и да не забравя. Ето и картинките от системата. Сложете ги при файловете.
http://uroci.net/downloads/vote2.zip
Ето и как да го използвате. Отваряте си index.php като след него слагате ?id=[тук ID]
Примерно: site.com/index.php?id=1
За всяко ID рейтинга е индивидуален :)
Надявам се системата да ви е от полза!