jeudi 26 mars 2015

PHP Ratings - Dynamically populate a page with all rated items in database

for a few years I have been using a simple cpanel built in php ratings system. Does anyone know if it is possible to dynamically populate a php page with all rated items in database.? and If so, what the best way to achieve this?


My main goal is to read all rated items from database & order them from highest rated to lowest rated.


the php ratings consists of 5 files. ratings.php ratings.css ratings.js ratings.gif and ratings.sqlite


I will provide code(s) below.


ratings.php



<?php
class rating{

public $average = 0;
public $votes;
public $status;
public $table;
private $path;

function __construct($table){
try{
$pathinfo = pathinfo(__FILE__);
$this->path = realpath($pathinfo['dirname']) . "/database/ratings.sqlite";
$dbh = new PDO("sqlite:$this->path");
$this->table = $dbh->quote($table);
// check if table needs to be created
$table_check = $dbh->query("SELECT * FROM $this->table WHERE id='1'");
if(!$table_check){
// create database table
$dbh->query("CREATE TABLE $this->table (id INTEGER PRIMARY KEY, rating FLOAT(3,2), ip VARCHAR(15))");
$dbh->query("INSERT INTO $this->table (rating, ip) VALUES (0, 'master')");
} else {
$this->average = $table_check->fetchColumn(1);
}
$this->votes = ($dbh->query("SELECT COUNT(*) FROM $this->table")- >fetchColumn()-1);
}catch( PDOException $exception ){
die($exception->getMessage());
}
$dbh = NULL;
}

function set_score($score, $ip){
try{
$dbh = new PDO("sqlite:$this->path");
$voted = $dbh->query("SELECT id FROM $this->table WHERE ip='$ip'");
if(sizeof($voted->fetchAll())==0){

$dbh->query("INSERT INTO $this->table (rating, ip) VALUES ($score, '$ip')");
$this->votes++;

//cache average in the master row
$statement = $dbh->query("SELECT rating FROM $this->table");
$total = $quantity = 0;
$row = $statement->fetch(); //skip the master row
while($row = $statement->fetch()){
$total = $total + $row[0];
$quantity++;
}
$this->average = round((($total*20)/$quantity),0);
$statement = $dbh->query("UPDATE $this->table SET rating = $this->average WHERE id=1");
$this->status = '(thanks!)';
} else {
$this->status = '(already scored)';
}

}catch( PDOException $exception ){
die($exception->getMessage());
}
$dbh = NULL;
}
}

function rating_form($table){
$ip = $_SERVER["REMOTE_ADDR"];
if(!isset($table) && isset($_GET['table'])){
$table = $_GET['table'];
}
$rating = new rating($table);
$status = "<div class='score'>
<a class='score1' href='? score=1&amp;table=$table&amp;user=$ip'>1</a>
<a class='score2' href='?score=2&amp;table=$table&amp;user=$ip'>2</a>
<a class='score3' href='?score=3&amp;table=$table&amp;user=$ip'>3</a>
<a class='score4' href='?score=4&amp;table=$table&amp;user=$ip'>4</a>
<a class='score5' href='?score=5&amp;table=$table&amp;user=$ip'>5</a>
</div>
";
if(isset($_GET['score'])){
$score = $_GET['score'];
if(is_numeric($score) && $score <=5 && $score >=1 && ($table==$_GET['table']) && isset($_GET["user"]) && $ip==$_GET["user"]){
$rating->set_score($score, $ip);
$status = $rating->status;
}
}
if(!isset($_GET['update'])){ echo "<div class='rating_wrapper'>"; }
?>
<div class="sp_rating">
<div class="rating">Rating:</div>
<div class="base"><div class="average" style="width:<?php echo $rating- >average; ?>%"><?php echo $rating->average; ?></div></div>
<div class="votes"><?php echo $rating->votes; ?> votes</div>
<div class="status">
<?php echo $status; ?>
</div>
</div>
<?php
if(!isset($_GET['update'])){ echo "</div>"; }
}

if(isset($_GET['update'])&&isset($_GET['table'])){
rating_form($_GET['table']);
}


ratings.css



.rating_wrapper *{margin:0; border:0; padding:0;}
.rating_wrapper {overflow:hidden; height:16px;}
.sp_rating{font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; font- size:11px; line-height:1.7em; color:#5f5f5f; display:block;}
.rating{float:left; padding-right:4px;}
.base{background:url(ratings.gif) 0 0 no-repeat; width:85px; height:100%; float:left; padding-right:4px; overflow:hidden;}
.average{background:url(ratings.gif) 0 -16px no-repeat; text-indent:-9999px;}
.votes{float:left; padding-right:4px;}
.score{ background:url(ratings.gif) 0 0 no-repeat; width:85px; height:100%; float:left; position:relative;}
.score a{display:block; height:100%; float:left; text-indent:-9999px; position:absolute; overflow:hidden; line-height:1em;}
.score1 {width:20%; z-index:55;}
.score2 {width:40%; z-index:54;}
.score3 {width:60%; z-index:53;}
.score4 {width:80%; z-index:52;}
.score5 {width:100%; z-index:51;}
.score a:hover{ background:url(ratings.gif) bottom right no-repeat;}
.status {height:16px; width:100px; overflow:hidden; position:relative;}

.score_this{ height:100%; overflow:hidden;}
.score_this a{color:#f37800;}


ratings.js



$(document).ready(function() {
$('.status').prepend("<div class='score_this'>(<a href='#'>Rate Artist</a>) </div>");
$('.score_this').click(function(){
$(this).slideUp();
return false;
});

$('.score a').click(function() {
$(this).parent().parent().parent().addClass('scored');
$.get("rating/rating.php" + $(this).attr("href") +"&update=true", {}, function(data){
$('.scored').fadeOut("normal",function() {
$(this).html(data);
$(this).fadeIn();
$(this).removeClass('scored');
});
});
return false;
});
});


Thank you in advance, any and all help is appreciated.


Aucun commentaire:

Enregistrer un commentaire