我已经实施了一个评级系统,但无法在我的一个数据库表中找到正确的最新评级,它总是落后一步,即它始终存储在当前评级之前的最后评级:< / p>
表'post_rating'包含针对任何内容的每一个投票的行,而'posts_rat_main'表是我遇到麻烦的地方。我希望它能够存储由网站上某个项目的所有个人投票组成的总体评分,并将查询保持在最低限度,但正如所说的那样,它总是在当前运行总数之后投票。
主页
// set up the ratings
$votes = mysql_query("SELECT rat_rating FROM post_rating WHERE rat_ID = $post_ID");
$votesnr = 0;
$totalvotes = 0;
while($vote = mysql_fetch_array($votes)){
$votesnr++;
$totalvotes += $vote['rat_rating'];
}
if($votesnr == 0){
$rating = 0;
}
else {
$rating = $totalvotes/$votesnr;
}
$roundedrating = floor($rating) + round($rating - floor($rating)) / 2 ;
?>
<div>Total Rating</div>
<div class="star-rating" id="rating1result<?php echo $roundedrating; ?> "style="background-position:0 -<?php echo $roundedrating * 32; ?>px;">
<div class="star"></div>
<div class="star"></div>
<div class="star"></div>
<div class="star"></div>
<div class="star"></div>
</div>
<div class="result">
<span style="color:green"><?php echo round($rating,2); ?></span> (<?php echo $votesnr; ?> votes)
</div>
<script type="text/javascript">
$(function(){
$('.star').mouseover(function (){
var star = $(this).index()+1;
var x =(32 * star);
$(this).parent().css('backgroundPosition... ' +(-x)+ 'px');
});
$('.star-rating').mouseout(function (){
var originalresult = $(this).attr('id').split('result')[1];
var y =(32 * originalresult);
$(this).css('background-position','0%' +(-y)+ 'px');
});
});
$('.star').click(function (){
var id = $(this).parent().attr('id').split('ratin...
var vote = $(this).index() +1;
$.ajax({
type: "POST",
url:"save_vote.php",
data: 'id='+ id + '&vote='+ vote + '&stid=<?php echo $post_ID ?>' + '&totv=<?php echo $totalvotes ?>' + '&votes=<?php echo $votesnr ?>'
});
$(this).parent().removeAttr("id");
$(this).parent().html(" ");
window.location.href = "posts/post_view.php?id=<?php echo $post_ID ?>";
});
</script>`
这一切都适用于'post_rating'表,处理程序脚本,我怀疑问题是读取:
$id = intval($_POST['id']);
$vote = intval($_POST['vote']);
$post_ID = intval($_POST['stid']);
$votesnr = $_POST['votes'];
$tot_v = $_POST['totv'];
// set up the ratings
$votesnr = $votesnr;
$totalvotes = $tot_v;
if($votesnr == 0){
$rating = 0;
}
else {
$rating = $totalvotes/$votesnr;
}
$new_rat = round($rating,2);
// Sling in the data
$insert_rat = "INSERT INTO post_rating";
$insert_rat.= " (rat_ID,";
$insert_rat.= " rat_rating,";
$insert_rat.= " rat_user_ID,";
$insert_rat.= " rat_user_name,";
$insert_rat.= " rat_date)";
$insert_rat.= " VALUES";
$insert_rat.= " ('$post_ID',";
$insert_rat.= " '$vote',";
$insert_rat.= " '$member_ID',";
$insert_rat.= " '$member_name',";
$insert_rat.= " NOW())";
$story_update = "UPDATE posts_rat_main";
$story_update.= " SET rating = '$new_rat'";
$story_update.= " WHERE st_ID = '$post_ID'";
mysql_query($insert_rat) or die(mysql_error());
mysql_query($story_update) or die(mysql_error());
所以,每当我更新表'posts_rat_main'时,它都会以当前投票后的一票投票来更新它!?我从教程中得到了一半,并且搞砸了它无济于事。我对javascript很糟糕,只是想不出来,但怀疑问题出现在我的'save_vote'处理程序脚本中,这似乎很简单。
我最近的尝试是将脚本评论为'//设置评级',从'主页'并将其粘贴到save_vote处理程序脚本中,如此处所示,但无济于事。我有点难过,有什么想法吗?
另外作为次要说明,我发现这个剧本有时没有反应,有时需要2到3次点击星星才会注册投票,我无法想象为什么会这样?
任何帮助都非常感激,欢呼。
答案 0 :(得分:1)
答案很简单,您必须将 $ vote 添加到 $ totalvotes ,将 +1 添加到 votesnr :
$rating = ($totalvotes + $vote) / ($votesnr + 1);
这也允许你删除if / else,因为分母至少是1。
答案越长
如果在 post_rating 上有 rat_id,rat_rating 的索引,那么当您想要结果时,通过sql select query执行一个组可能更好一点。除非你确实遇到问题,否则这样的预先优化不值得花时间或麻烦。
如果必须有一个单独的表来存储结果,那么至少使用 post_rating 上的触发器来计算结果,而不是在php中进行。< / p>