moodle2.1.1:「評点」の保存ボタン押下するとDBの読み込みエラーが発生する

moodle2.1.1:「評点」の保存ボタン押下するとDBの読み込みエラーが発生する

- kenta sasaki の投稿
返信数: 2

小テストの編集画面における評点編集欄において、「保存」ボタンをクリックすると、
無条件に以下のエラーメッセージが表示されて、小テスト編集画面に戻らない不具合が発生する。

エラーメッセージ「データベースからの読み込み中にエラーが発生しました。」

原因を調査したところ、SQLの文法が誤っていることが判明。
しかし、本来の仕様がわからないため、SQLの修正内容がこれで正しいものか
どうか確信が持てない状況です。本修正内容で問題がないかどうかご教授頂ければと思います。

◎修正箇所
 ソース:\moodle\mod\quiz\locallib.php
 行数:672行目~700行目辺り

 ◆修正前のSQL
 ---------------------------------------------------------------------------------------
 $changedgrades = $DB->get_records_sql("
        SELECT users.userid, qg.id, qg.grade, newgrades.newgrade
        FROM (
            SELECT userid
            FROM {quiz_grades} qg
            WHERE quiz = :quizid
        UNION
            SELECT DISTINCT userid
            FROM {quiz_attempts} quiza2
            WHERE
                quiza2.timefinish <> 0 AND
                quiza2.preview = 0 AND
                quiza2.quiz = :quizid2
        ) users

        LEFT JOIN {quiz_grades} qg ON qg.userid = users.userid AND qg.quiz = :quizid4

        LEFT JOIN (
            $finalgradesubquery
        ) newgrades ON newgrades.userid = users.userid

        WHERE
            ABS(newgrades.newgrade - qg.grade) > 0.000005 OR
            (newgrades.newgrade IS NOT NULL) AND
            (qg.grade IS NOT NULL)",
            (newgrades.newgrade IS NULL) <> (qg.grade IS NULL)",
        $param);
 ---------------------------------------------------------------------------------------
 ※下から2行目の「(newgrades.newgrade IS NULL) <> (qg.grade IS NULL)",」の中の
 「<>」が文法上間違っているため、正しく元の画面に戻らずエラーになっていました。

              ↓

 ◆修正後
 ---------------------------------------------------------------------------------------
 $changedgrades = $DB->get_records_sql("
        SELECT users.userid, qg.id, qg.grade, newgrades.newgrade
        FROM (
            SELECT userid
            FROM {quiz_grades} qg
            WHERE quiz = :quizid
        UNION
            SELECT DISTINCT userid
            FROM {quiz_attempts} quiza2
            WHERE
                quiza2.timefinish <> 0 AND
                quiza2.preview = 0 AND
                quiza2.quiz = :quizid2
        ) users

        LEFT JOIN {quiz_grades} qg ON qg.userid = users.userid AND qg.quiz = :quizid4

        LEFT JOIN (
            $finalgradesubquery
        ) newgrades ON newgrades.userid = users.userid

        WHERE
            ABS(newgrades.newgrade - qg.grade) > 0.000005 OR
            (newgrades.newgrade IS NOT NULL) AND
            (qg.grade IS NOT NULL)",
//            (newgrades.newgrade IS NULL) <> (qg.grade IS NULL)",
            (newgrades.newgrade IS NULL) AND
            (qg.grade IS NULL)",
        $param);
---------------------------------------------------------------------------------------

◎ご教授頂きたい点
 上記のようにSQL文の「<>」を「AND」に変更することで問題なくエラーが発生しないようになりましたが、
 「AND」として修正してよいか確信がもてません。(もしくは「OR」かもしれなかったりするので)
 moodleの仕様にお詳しい方がいらっしゃいましたら、ご教授頂けると幸いです。

◎環境
 Moodle入手場所:moodle.org
 バージョン:moodle2.1.1
 PHP Version:5.3.8-ZS5.5.0
 Apache Version:2.2.16
 OS:Windows7

kenta sasaki への返信

Re: moodle2.1.1:「評点」の保存ボタン押下するとDBの読み込みエラーが発生する

- Kosuke Tsuchiya の投稿

1ヶ月以上の前の事なので解決済みかもしれませんが、
バージョン2.1.3以降でfixされているようです。

【2.1.1】
(newgrades.newgrade IS NULL) <> (qg.grade IS NULL)

【2.1.3以降】
((newgrades.newgrade IS NULL OR qg.grade IS NULL) AND NOT
          (newgrades.newgrade IS NULL AND qg.grade IS NULL))",
// The mess on the previous line is detecting where the value is
// NULL in one column, and NOT NULL in the other, but SQL does
// not have an XOR operator, and MS SQL server can't cope with
// (newgrades.newgrade IS NULL) <> (qg.grade IS NULL)

 

Kosuke Tsuchiya への返信

Re: moodle2.1.1:「評点」の保存ボタン押下するとDBの読み込みエラーが発生する

- kenta sasaki の投稿

Kousuke Tsuchiya  さん

情報を頂きまして、ありがとうございます。

一か月を経過しておりましたが、確認がとれていない状況でした。

頂いた情報で裏をとることができました。大変助かりました。

ありがとうございます。今後とも宜しくお願いします。