Simple Ajax,jquery and php ratings with no duplicate rating checking through ip adress
Step 1. db table:
CREATE TABLE `rating` ( `counter` int(8) NOT NULL default '0', `value` int(8) NOT NULL default '0', `ip_address` longtext NOT NULL, `data_id` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Step 2. Javascript:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> <script type="text/javascript"> // JavaScript Document $(document).ready(function() { // get current rating Rating(); // get rating function function Rating(){ $.ajax({ type: "GET", url: "update.php", data: "do=getrate&id=1", cache: false, async: false, success: function(result) { // apply star rating to element $("#current-rating").css({ width: "" + result + "%" }); }, error: function(result) { alert("some error occured, please try again later"); } }); } // link handler $('#ratelinks li a').click(function(e){ e.preventDefault(); $.ajax({ type: "GET", url: "update.php", data: "rating="+$(this).text()+"&do=rate&id=1", cache: false, async: false, success: function(result) { Rating(); $("#response").html(result); $("#response").css("color", "#FF0000"); }, error: function(result) { alert("some error occured, please try again later"); } }); }); }); </script>
Step 3. css:
<style> .star-rating, .star-rating a:hover, .star-rating a:active, .star-rating .current-rating { background: url("star.gif") repeat-x scroll left -1000px transparent; } .star-rating { background-position: left top; height: 25px; list-style: none outside none; margin: 0; overflow: hidden; padding: 0; position: relative; width: 125px; } .star-rating li { display: inline; } .star-rating a, .star-rating .current-rating { border: medium none; height: 25px; left: 0; line-height: 25px; outline: medium none; overflow: hidden; position: absolute; text-indent: -1000em; top: 0; } .star-rating a:hover, .star-rating a:active { background-position: left bottom; } .star-rating a.one-star { width: 20%; z-index: 6; } .star-rating a.two-stars { width: 40%; z-index: 5; } .star-rating a.three-stars { width: 60%; z-index: 4; } .star-rating a.four-stars { width: 80%; z-index: 3; } .star-rating a.five-stars { width: 100%; z-index: 2; } .star-rating .current-rating { background-position: left center; z-index: 1; } </style>
Step 4. html:
<div class="rating"> <ul class="star-rating"> <li id="current-rating" class="current-rating" style="width: 80%;"><!-- will show current rating --></li> <span id="ratelinks"> <li><a class="one-star" title="1 star out of 5" href="javascript:void(0)">1</a></li> <li><a class="two-stars" title="2 stars out of 5" href="javascript:void(0)">2</a></li> <li><a class="three-stars" title="3 stars out of 5" href="javascript:void(0)">3</a></li> <li><a class="four-stars" title="4 stars out of 5" href="javascript:void(0)">4</a></li> <li><a class="five-stars" title="5 stars out of 5" href="javascript:void(0)">5</a></li> </span> </ul> <span id="response"></span></div>
Step 5. php:
<?php $ip = $_SERVER['REMOTE_ADDR']; $data_id=(int)$_GET['id']; if($_GET['do']=='rate'){ // do rate rate($ip,$data_id); }else if($_GET['do']=='getrate'){ // get rating getRating($ip,$data_id); } // function to retrieve function getRating($ip,$data_id){ $sql= "select * from rating where data_id='$data_id' "; $result=@mysql_query($sql); $rs=@mysql_fetch_array($result); // set width of star $rating = (@round($rs[value] / $rs[counter],1)) * 20; echo $rating; } // function to insert rating function rate($ip,$data_id){ $sql= "select * from rating where ip_address LIKE '%".$ip."%' and data_id='$data_id' "; $result=@mysql_query($sql); //mysql_num_rows($result); $slect=mysql_fetch_assoc(mysql_query("select * from rating where data_id='$data_id' ")); //$rs=@mysql_fetch_array($slect); $checkIP = unserialize($slect['ip_address']); // if it is an array i.e. already has entries the push in another value if((is_array($checkIP)) ? array_push($checkIP,$ip) : $checkIP=array($ip)); $insertip=serialize($checkIP); if(mysql_num_rows($result)=='0'){ $text = strip_tags($_GET['rating']); $update = "update rating set counter = counter + 1, value = value + ".(int)$_GET['rating']." ,ip_address='$insertip' where data_id='$data_id'"; $result = @mysql_query($update); //echo SUCCESSFULLY_RATED; if($result){ echo 'Successfuly rated'; //rate($ip,$data_id); } if(@mysql_affected_rows() == 0){ $insert = "insert into rating (counter,value,data_id,ip_address) values ('1','".(int)$_GET['rating']."' ,'$data_id','$insertip')"; $result = @mysql_query($insert); } } else{ echo 'already rated'; } } ?>