1

我有一个评分系统,它使用以下等式生成评分平均值:

((旧评级*旧时金额)+新评级)/新评级金额

但是,如果当前评分是 3,并且它被评分过一次,当我给它评分 3 时,它说新评分是 2.5

这里有什么错误?这是完整的代码。

<?php
session_start();
include("lib/db.php");
$db = new DBConnect;
if(isset($_POST['rating']) && is_numeric($_POST['rating']) && is_numeric($_POST['story']))
{
    if($_POST['rating'] > 5 || $_POST['rating'] < 1){die("INVALID RATING");}
    $rating = mysql_real_escape_string($_POST['rating']);
    $story = mysql_real_escape_string($_POST['story']);
    $c = $db->query("SELECT * FROM cdb_stories WHERE id=$story");
    $c = mysql_fetch_array($c);
    $u_name = mysql_real_escape_string($_SESSION['logged_in']);
    $uid = $db->query("SELECT id FROM cdb_users WHERE username='{$u_name}'");
    if(mysql_num_rows($uid) < 1){die("NOT LOGGED IN");}
    $uid = mysql_fetch_array($uid);
    $ratingd = $db->query("SELECT * FROM cdb_ratings WHERE userid='{$uid['id']}'");
    if(mysql_num_rows($ratingd) > 0)
    {
        $ratingd = mysql_fetch_array($ratingd);
        $new_rate = (($c['rating']*$c['rating_amt'])-$ratingd['rating']+$rating)/$c['rating_amt'];
        $db->query("UPDATE cdb_stories SET rating={$new_rate} WHERE id={$story}");
        $db->query("UPDATE cdb_ratings SET rating={$rating} WHERE userid='{$uid['id']}'");
        die();
    }
    $new_num = $c['rating_amt']+1;
    $new_rate = (($c['rating']*$c['rating_amt'])+$rating)/$new_num;
    $db->query("UPDATE cdb_stories SET rating_amt={$new_num}, rating={$new_rate} WHERE id={$story}");
    $db->query("INSERT INTO cdb_ratings VALUES({$uid['id']},{$rating},{$story})");
}
else
{
    die("INVALID FIELDS");
}
?>
4

1 回答 1

1
   ((Rating * Times) + New) / (Times + 1)

对于您的价值观:

   ((3 * 1) + 3) / (1 + 1)
=  (   3    + 3) / 2
=              6 / 2
=              3

所以这个过程在数学上看起来是正确的。

我建议您将计算放入它自己的带有参数的函数中,这样您就不会被该批次中的其余代码激怒。这将使您更容易调试:

function new_rate($rating, $times, $new)
{
    return (($rating * $times) + $new) / ($times + 1);
}

然后,您可以在代码中更轻松地使用它。此外,如果其他原因是错误的原因,您可以通过测试裸函数来简单地找出。如果它运行正确,则您知道错误位于其他位置。

希望这可以帮助。

于 2011-12-17T23:45:45.717 回答