2011-12-17 3 views
1

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

((старый рейтинг * Old Times Amount) + Новый рейтинг)/Новый рейтинг количество

Однако, если номинальный ток 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
((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); 
} 

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

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

+0

$ new_rate = (($ c ['rating'] * $ c ['rating_amt']) - $ ratingd ['rating'] + $ rating)/$ c ['rating_amt']; это расчет рейтинга изменений. Если вы посмотрите дальше, вы найдете оригинал. – CommunistPancake

+0

@CommunistPancake: Я удалил эту часть из своего ответа, спасибо за указание. Должен признаться, что у меня проблемы с чтением кода, поэтому я думаю, что это вызвало проблему с поиском правильной части. – hakre