Webmaster общности: Predpriemach.com | SearchEngines.bg

    5 Stars Rating система

    Автор: HunteR

    Здравейте,

    реших и аз да пусна една такава система за гласуване 🙂
    Системата използва 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>

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

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

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

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

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

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

    Оставете коментар