フォーラムの評点の軽微なバグ

フォーラムの評点の軽微なバグ

- Tatsuya Shirai の投稿
返信数: 3

 Moodle1.9.4+です.

 評点(ratings)の最高点を表示するコードに軽いバグ(Warnning)が発生します.

mod/forum/lib.php の function forum_get\ratings_max(),

function forum_get_ratings_max($postid, $scale, $ratings=NULL) {

    if (is_null($ratings)) {
        $ratings = array();
        if ($rates = get_records("forum_ratings", "post", $postid)) {
            foreach ($rates as $rate) {
                $ratings[] = $rate->rating;
            }
        }
    }

function forum_get_ratings_max($postid, $scale, $ratings=NULL) {

    if (is_null($ratings)) {
        $ratings = array();
        if ($rates = get_records("forum_ratings", "post", $postid)) {
            foreach ($rates as $rate) {
                $ratings[] = $rate->rating;
            }
        }
    }

// (Shirai): ここから修正
//
  $count = count($ratings);
    if (!($count = count($ratings))) return "";
// (Shirai): ここまで修正

    $max = max($ratings);

    if ($count == 0 ) {
        return "";

    } else if ($count == 1) { //this works for max
        $rating = reset($ratings);
        return $scale[$rating];
    $count = count($ratings);
    $max = max($ratings);

    if ($count == 0 ) {
        return "";

    } else if ($count == 1) { //this works for max
        $rating = reset($ratings);
        return $scale[$rating];

もし誰も評点を入力していない場合,$ratingsはNULLです.したがって青文字で示したmax()は,少なくとも一つの要素が無いとダメだ,という警告を発します.いくつも解決方法があるのですが,赤字で示したコードを追加するのが一番手軽ではあります.その後の,if ($count == 0)が無駄になりますが.

 同じような処理をいくつかの関数が行っていますね.

 function forum_get_ratings_mean()は問題無さそうです.
 function forum_get_ratings_count()も大丈夫そうです.
 function forum_get_ratings_min()も上記同様の対策が必要です.
 function forum_get_ratings_sum()も大丈夫そうです.
 function forum_get_ratings_summary()も大丈夫.

どうやらmaxとminの二箇所のようですね.

Tatsuya Shirai への返信

Re: フォーラムの評点の軽微なバグ

- Tatsuya Shirai の投稿

この件は,Matt Gibson氏によって既にTrackerに報告済みでした(MDL-16915).

うーん,物凄く分かりやすいバグなので,パパッと直して貰えると助かりますね.

Tatsuya Shirai への返信

Re: フォーラムの評点の軽微なバグ

- Haruhiko Okumura の投稿
ありがとうございます。$max = ... を } else { の下に移動しました。