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 に答える