Рейтинговая система не будет правильно усреднена - PullRequest
1 голос
/ 18 декабря 2011

У меня есть система рейтинга, которая использует следующее уравнение для генерации среднего рейтинга:

((Старый рейтинг * Старая сумма) + Новый рейтинг) / Новый рейтинг

Однако, если текущий рейтинг равен 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");
}
?>

1 Ответ

1 голос
/ 18 декабря 2011
   ((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);
}

Затем вы сможете использовать это более легко в своем коде.Кроме того, если что-то еще является причиной ошибки, вы можете просто выяснить это, протестировав пустую функцию.Если он работает правильно, вы знаете, что ошибка находится в другом месте.

Надеюсь, это поможет.

...