課題モジュールで提出物一覧が表示されない問題について part2

課題モジュールで提出物一覧が表示されない問題について part2

- Kenichi Magara の投稿
返信数: 10

いつもお世話になっております。表題の件について、ご指南ください。

2年前にも同様のスレッドがあるようですが、

http://moodle.org/mod/forum/discuss.php?d=101835

当方も1.94から1.99にバージョンを上げると、同様の症状になってしまいました。当然ながらバージョンアップ前は正常に表示されておりました。

添付画像のように、数十件の提出課題があるにも関わらず、ページの移動リンクだけで「表示するデータはありません」と言われます。

ロール設定、パーミッション設定等、[課題を表示する]には管理者や教員に対して許可のチェックが入っています。というより、バージョンアップ以前の正常に表示されていた時点から設定を変えた覚えはありません。

FreeBSD 8.1-RELEASE + Apache 2.2.16 + PHP 5.3.3 + MySQL 5.5.5 + Moodle 1.99
Moodleは、portsからインストールしております。

添付 Moodle.png
Kenichi Magara への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

 何らかのエラーが発生している可能性は高いですね.

 まず,データベースやmodataフォルダを見て提出された課題の数やその具体的な情報(ユーザidや提出課題のファイル名など)を抽出するところは正常に動作している.ところがそのデータ群(配列?)を受け渡されて一部のみ表示する関数(何番目の課題から何個分の課題を表示する)の中でエラーが発生(あるいは正常にデータなしになってしまう)しているようですね.”名:すべて”から下の部分は呼び出された関数で生成しています.

 正確に言うとPHPの動作が止まってしまうようなFatalエラーは発生していないと思います.Notice undefinedほにゃらら系か,配列の要素が存在しない,オブジェクトのメンバが存在しない,といった類のわーニングが発生していると思います.その情報が重要ですので,Moodleのエラー報告レベルを上げて下さい.できればDevelopperですね.

http://moodle.org/mod/forum/discuss.php?d=101835#p449873

評点平均: お役立ち度: ★★★★★★★ (1)
Tatsuya Shirai への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

ちなみに,この1画面20名分(と設定されていますね)のデータを表示するのは,

moodle/mod/assignment/lib.phpの,function display_submissions(),この後半部分にある,

        /// Print quickgrade form around the table
        if ($quickgrade){
            echo '<form action="submissions.php" id="fastg" method="post">';
            echo '<div>';
            echo '<input type="hidden" name="id" value="'.$this->cm->id.'" />';
            echo '<input type="hidden" name="mode" value="fastgrade" />';
            echo '<input type="hidden" name="page" value="'.$page.'" />';
            echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
            echo '</div>';
        }

        $table->print_html();  /// Print the whole table

        if ($quickgrade){
            $lastmailinfo = get_user_preferences('assignment_mailinfo', 1) ? 'checked="checked"' : '';
            echo '<div class="fgcontrols">';
            echo '<div class="emailnotification">';
            echo '<label for="mailinfo">'.get_string('enableemailnotification','assignment').'</label>';

このたった一行のコードです.この$tableというオブジェクトに格納されているデータに基いて表示されます.

Tatsuya Shirai への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

この$table->print_html()の直前で,$tableの中身をvar_dump()して見るとかなり多くの情報が得られます.

このページで表示しようとしている20名分のデータは$table->dataに配列の形で入っています.この配列の数がゼロならば”表示するデータはありません”となるでしょう.

この変数$tableはflexible_tableというクラスです.このクラスはmoodle/lib/tablelib.phpで定義されているようです.実際,function print_html()という関数の中で,

        if (empty($this->data)) {
            print_heading(get_string('nothingtodisplay'));
            return true;
        }

このようにメンバ変数であるdataがempty(空)かどうかを見ています.多分,var_dump($table->data)はnullと表示されるでしょう.では,なぜ$table->dataが空っぽなのか,ですね.$table->add_data()が呼ばれていないか,あるいはadd_data()が失敗(flexible_tableクラスのsetupが未完)している場合,の二つが考えられます.

Tatsuya Shirai への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

もう少し因果関係を上流に辿って行きましょう.$table->add_data($row);はmod/assignment/lib.phpのfunction display_submissions()の中で一箇所でしか使われていません(libphpの中でも一箇所です).

この$table->dataに20人分の学生のデータを格納する$table->add_data()関数が呼ばれない理由は,とりあえず一つしかありません.少々,上にソースリストを辿る(ブロックのネストを上がる)と,

        $table->pagesize($perpage, count($users));

        ///offset used to calculate index of student in that particular query, needed for the pop up to know who's next
        $offset = $page * $perpage;

        $strupdate = get_string('update');
        $strgrade  = get_string('grade');
        $grademenu = make_grades_menu($this->assignment->grade);

        if (($ausers = get_records_sql($select.$sql.$sort, $table->get_page_start(), $table->get_page_size())) !== false) {
            $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, array_keys($ausers));
            foreach ($ausers as $auser) {
                $final_grade = $grading_info->items[0]->grades[$auser->id];

このようなコードがあります.この赤い文字で表した$ausersという配列(20人分のユーザデータ)の取得が失敗していると思われます.試しに,このif文と$grading_info = ... の行の間に,var_dump($ausers);を追加して見て下さい.もし何かが表示されるならば20人分のデータの取得に成功しています.もし何も表示されない,あるいはnullと表示されるのであればデータベースからのデータの抽出に失敗したか,条件に該当するデータが存在しなかったということです.まずはこちらを確認して見て下さい.それからget_records_sql()の条件をチェックしましょう.

評点平均: お役立ち度: ★★★★★★★ (1)
Kenichi Magara への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

まだ原因がハッキリしていません.

原因にしたがって,このディスカッションを管理全般に関するフォーラム,Moodle開発者フォーラム,あるいはインストール・アップグレードに関するフォーラムに移動します.

Tatsuya Shirai への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Kenichi Magara の投稿

白井先生、ご丁寧にありがとうございます。

まだデバッグ途中ですが、その経過を報告いたします。ご指摘のように

echo 'get_records_sql Start';
if (($ausers = get_records_sql($select.$sql.$sort, $table->get_page_start(), $table->get_page_size())) !== false) {
    echo 'get_records_sql() true!!';
    var_dump($ausers);

と入れてみました。結果、get_records_sql Start は出ますが get_records_sql true!! が出ない、つまり get_records_sql() に失敗しています。

そもそも、そのすぐ上の方で

$table->setup();
if (empty($users)) {
    print_heading(get_string('nosubmitusers','assignment'));
    return true;
}

とあり、添付画像にもページ移動リンクが表示されていることから、

$table->pagesize($perpage, count($users));
printf("count(users)=%d\n", count($users));

で確認すると44という数字が表示されます。get_records_sql() が怪しいところまでは突き止めました。

あと情報として、MoodleデバッグモードをDEVELOPERにしたphp.logも下記に示します(見やすくなるよう若干編集してあります)。

[09-Sep-2010 10:07:58] PHP Notice:  BIGINT UNSIGNED value is out of range in '(`moodle`.`s`.`timemarked` - `moodle`.`s`.`timemodified`)'

SELECT u.id, u.firstname, u.lastname, u.picture, u.imagealt,
                          s.id AS submissionid, s.grade, s.submissioncomment,
                          s.timemodified, s.timemarked,
                          COALESCE(SIGN(SIGN(s.timemarked) + SIGN(s.timemarked - s.timemodified)), 0) AS status FROM mdl_user u LEFT JOIN mdl_assignment_submissions s ON u.id = s.userid
                                                                  AND s.assignment = 140 WHERE u.id IN (404,340,456,1109,571,446,348,347,338,363,581,939,296,416,398,368,437,426,314,438,475,382,379,313,439,391,355,448,324,385,359,397,291,336,443,460,578,369,409,315,454,318,295,323)  ORDER BY lastname ASC

  • line 686 of lib/dmllib.php: call to debugging()
  • line 966 of lib/dmllib.php: call to get_recordset_sql()
  • line 1174 of mod/assignment/lib.php: call to get_records_sql()
  • lin in /usr/local/www/moodle/lib/weblib.php on line 7005

Kenichi Magara への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

>  BIGINT UNSIGNED value is out of range in '(`moodle`.`s`.`timemarked` - `moodle`.`s`.`timemodified`)'

これがどうもよく分からないですね.COALESCEの所かとも思ったのですが,'moodle'がどこから出てくるのか...? sは mdl_assignment_submissions ですので,ここのtimemarkedやtimemodifiedの型や値がよろしくないのでしょうか? 当方では,どちらも種別がbigint(10), 属性がUNSIGNEDで,timemodifedには0以外のタイムコードが記録されており,timemarkedは評価前のモノは0,評価済みのものはタイムコードが記録されています.ただし,遥か昔の提出物についてはtimemodifiedがゼロでtimemarkedにタイムコードが記録されているエントリもありますね.ちなみにtimecreatedは全てゼロです.

Tatsuya Shirai への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Kenichi Magara の投稿

お世話になっております。

結論から申しますと、Moodleがおかしいのではなく、こちらの環境設定ミスでした。

後進のため恥を偲んで報告いたしますと...

Moodleのアップグレードと同時に行った、MySQLの5.1系から5.5系へのアップグレードでのミスです。

「out of range」の表示を見て、Moodleソースをデバッグするのを中断し、
## これでおかしいなら、もっと報告が上がっているはずなので、
## Moodleのコードを追っかける(疑う)のをヤメました(^^;)
作業記録やPHP/MySQL/システム周りをチェックしたところ、mysql_upgrade でエラーになっておりました。あとは言わずもがなですが...めんどくさいのでMySQLを5.1系に戻したところ、すんなり表示されました。

お騒がせして申し訳ございません。もうすぐ授業が始まるプレッシャーと、しょーもないミスの発覚からか、酷い脱力感です orz

Kenichi Magara への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- Tatsuya Shirai の投稿

ギリギリ間に合ってよかったですね!

さて,内容としてはアップグレード/インストールに関する問題のようですので,そちらのフォーラムにディスカッションを移動します.

#という訳で,全般的日本語フォーラムから移動しました.

Tatsuya Shirai への返信

Re: 課題モジュールで提出物一覧が表示されない問題について part2

- FUJIKAWA Masahiro の投稿

私も同様な現象に遭遇しました。参考のため、投稿します。

最初に構築した環境は、以下の通りです。

・Windows 7

・Apache 2.2.17

・MySQL 5.5.9

・PHP 5.3.5

・fs_moodle 19_4-10-01

 

上記の環境で使用していると、「提出物一覧が表示されない」問題と遭遇しました。

MySQLを5.1.58 にダウングレードしたら、問題解決しました。

評点平均: お役立ち度: ★★★★★★★ (1)