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?