Argument 1 passed to qtype_multichoice_single_renderer::is_right() must be an instance of question_answer, null given

Argument 1 passed to qtype_multichoice_single_renderer::is_right() must be an instance of question_answer, null given

per Luis de Vasconcelos,
Number of replies: 1
Avatar Particularly helpful Moodlers

I've upgraded a Moodle 2.0.4+ site running on Windows Server, IIS, PHP 5.4 and MSSQL 2008 R2 with FreeTDS to Moodle version 2.2.11 (as part of the upgrade plan to 2.7). The quiz/question engine conversion was done using $plugin->version = 2011092500; of the Question Engine Upgrade Helper admin tool.

When I test some quiz attempts, such as /mod/quiz/review.php?attempt=119881 I get a "Coding error detected, it must be fixed by a programmer: PHP catchable fatal error" error and the whole Moodle display is broken like this:

 

 

 

My PHP Error Log file contains the following:

[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Notice:  Undefined offset: 435774 in D:\MoodleQA2211\question\type\multichoice\renderer.php on line 76
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Stack trace:
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   1. {main}() D:\MoodleQA2211\mod\quiz\review.php:0
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   2. mod_quiz_renderer->review_page() D:\MoodleQA2211\mod\quiz\review.php:251
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   3. mod_quiz_renderer->questions() D:\MoodleQA2211\mod\quiz\renderer.php:57
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   4. quiz_attempt->render_question() D:\MoodleQA2211\mod\quiz\renderer.php:185
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   5. question_usage_by_activity->render_question() D:\MoodleQA2211\mod\quiz\attemptlib.php:1038
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   6. question_attempt->render() D:\MoodleQA2211\question\engine\questionusage.php:359
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   7. question_behaviour->render() D:\MoodleQA2211\question\engine\questionattempt.php:735
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   8. core_question_renderer->question() D:\MoodleQA2211\question\behaviour\behaviourbase.php:141
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   9. core_question_renderer->formulation() D:\MoodleQA2211\question\engine\renderer.php:81
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP  10. qtype_multichoice_renderer_base->formulation_and_controls() D:\MoodleQA2211\question\engine\renderer.php:330
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Notice:  Trying to get property of non-object in D:\MoodleQA2211\question\type\multichoice\renderer.php on line 98
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Stack trace:
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   1. {main}() D:\MoodleQA2211\mod\quiz\review.php:0
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   2. mod_quiz_renderer->review_page() D:\MoodleQA2211\mod\quiz\review.php:251
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   3. mod_quiz_renderer->questions() D:\MoodleQA2211\mod\quiz\renderer.php:57
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   4. quiz_attempt->render_question() D:\MoodleQA2211\mod\quiz\renderer.php:185
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   5. question_usage_by_activity->render_question() D:\MoodleQA2211\mod\quiz\attemptlib.php:1038
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   6. question_attempt->render() D:\MoodleQA2211\question\engine\questionusage.php:359
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   7. question_behaviour->render() D:\MoodleQA2211\question\engine\questionattempt.php:735
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   8. core_question_renderer->question() D:\MoodleQA2211\question\behaviour\behaviourbase.php:141
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   9. core_question_renderer->formulation() D:\MoodleQA2211\question\engine\renderer.php:81
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP  10. qtype_multichoice_renderer_base->formulation_and_controls() D:\MoodleQA2211\question\engine\renderer.php:330
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Notice:  Trying to get property of non-object in D:\MoodleQA2211\question\type\multichoice\renderer.php on line 98
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Stack trace:
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   1. {main}() D:\MoodleQA2211\mod\quiz\review.php:0
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   2. mod_quiz_renderer->review_page() D:\MoodleQA2211\mod\quiz\review.php:251
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   3. mod_quiz_renderer->questions() D:\MoodleQA2211\mod\quiz\renderer.php:57
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   4. quiz_attempt->render_question() D:\MoodleQA2211\mod\quiz\renderer.php:185
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   5. question_usage_by_activity->render_question() D:\MoodleQA2211\mod\quiz\attemptlib.php:1038
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   6. question_attempt->render() D:\MoodleQA2211\question\engine\questionusage.php:359
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   7. question_behaviour->render() D:\MoodleQA2211\question\engine\questionattempt.php:735
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   8. core_question_renderer->question() D:\MoodleQA2211\question\behaviour\behaviourbase.php:141
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   9. core_question_renderer->formulation() D:\MoodleQA2211\question\engine\renderer.php:81
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP  10. qtype_multichoice_renderer_base->formulation_and_controls() D:\MoodleQA2211\question\engine\renderer.php:330
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Notice:  Trying to get property of non-object in D:\MoodleQA2211\question\type\multichoice\renderer.php on line 106
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP Stack trace:
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   1. {main}() D:\MoodleQA2211\mod\quiz\review.php:0
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   2. mod_quiz_renderer->review_page() D:\MoodleQA2211\mod\quiz\review.php:251
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   3. mod_quiz_renderer->questions() D:\MoodleQA2211\mod\quiz\renderer.php:57
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   4. quiz_attempt->render_question() D:\MoodleQA2211\mod\quiz\renderer.php:185
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   5. question_usage_by_activity->render_question() D:\MoodleQA2211\mod\quiz\attemptlib.php:1038
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   6. question_attempt->render() D:\MoodleQA2211\question\engine\questionusage.php:359
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   7. question_behaviour->render() D:\MoodleQA2211\question\engine\questionattempt.php:735
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   8. core_question_renderer->question() D:\MoodleQA2211\question\behaviour\behaviourbase.php:141
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP   9. core_question_renderer->formulation() D:\MoodleQA2211\question\engine\renderer.php:81
[29-Aug-2014 12:03:04 Africa/Johannesburg] PHP  10. qtype_multichoice_renderer_base->formulation_and_controls() D:\MoodleQA2211\question\engine\renderer.php:330
[29-Aug-2014 12:03:04 Africa/Johannesburg] Default exception handler: Coding error detected, it must be fixed by a programmer: PHP catchable fatal error Debug: Argument 1 passed to qtype_multichoice_single_renderer::is_right() must be an instance of question_answer, null given, called in [dirroot]\question\type\multichoice\renderer.php on line 117 and defined
* line 365 of \lib\setuplib.php: coding_exception thrown
* line 215 of \question\type\multichoice\renderer.php: call to default_error_handler()
* line 117 of \question\type\multichoice\renderer.php: call to qtype_multichoice_single_renderer->is_right()
* line 330 of \question\engine\renderer.php: call to qtype_multichoice_renderer_base->formulation_and_controls()
* line 81 of \question\engine\renderer.php: call to core_question_renderer->formulation()
* line 141 of \question\behaviour\behaviourbase.php: call to core_question_renderer->question()
* line 735 of \question\engine\questionattempt.php: call to question_behaviour->render()
* line 359 of \question\engine\questionusage.php: call to question_attempt->render()
* line 1038 of \mod\quiz\attemptlib.php: call to question_usage_by_activity->render_question()
* line 185 of \mod\quiz\renderer.php: call to quiz_attempt->render_question()
* line 57 of \mod\quiz\renderer.php: call to mod_quiz_renderer->questions()
* line 251 of \mod\quiz\review.php: call to mod_quiz_renderer->review_page()

This is probably caused by bad quiz or question attempt data in my database.

The qtype_multichoice_single_renderer::is_right() function seems to be expecting a question_answer id to be passed to it but none (null) was passed, I presume.

How do I determine what that bad data is?

And why does the Moodle theme engine break like this when Moodle encounters this bad quiz/question attempt data?

Average of ratings: -
In reply to Luis de Vasconcelos

Re: Argument 1 passed to qtype_multichoice_single_renderer::is_right() must be an instance of question_answer, null given

per Tim Hunt,
Avatar Core developers Avatar Documentation writers Avatar Particularly helpful Moodlers Avatar Peer reviewers Avatar Plugin developers

The theme breaks because the error message is output before the <head> tag in the HTML, so you end up with a page of invalid HTML, which your browser then quite reasonably fails to render well.

The first error in the logs is form this line https://github.com/moodle/moodle/blob/MOODLE_22_STABLE/question/type/multichoice/renderer.php#L76

The most logical explanation for how this attempt got into this state is that a question has been edited to delete one of the choices, and the was the choice this student selected.

Since that scenario does happen, I am slightly surprise that no one has reported this before, but even in the latest version of Moodle, the code is essentially the same. It would be possible to change it to make it more robust. I guess that is what MDL-29853 is for.

Average of ratings:Useful (2)