小テストの編集画面における評点編集欄において、「保存」ボタンをクリックすると、
無条件に以下のエラーメッセージが表示されて、小テスト編集画面に戻らない不具合が発生する。
エラーメッセージ「データベースからの読み込み中にエラーが発生しました。」
原因を調査したところ、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