Его результаты неверно отображаются в php / html

Я хочу отобразить все вопросы из выпадающего меню, когда пользователь выбирает All из раскрывающегося меню вопроса и выводит его под ним. Проблема в том, что она не делает этого и делает это хуже, это дает мне неопределенные ошибки смещения, заявляя:

 Notice: Undefined offset: ... in .... on line 605 

Строка 605:

 echo '<p><strong>Question:</strong> ' .htmlspecialchars($arrQuestionNo[$key]). ': ' .htmlspecialchars($arrQuestionContent[$key]). '</p>' . PHP_EOL; 

Мой вопрос в том, как исправить ошибку и отобразить все вопросы, если пользователь выбирает вариант « All ?

У меня есть демоверсия, которую вы можете пройти: DEMO

Выполните следующие шаги:

  • В раскрывающемся меню «Модуль» выберите System Stratergy и отправьте
  • Когда появится раскрывающееся меню «Оценка», выберите POKUB1 и отправьте
  • Вы увидите выпадающее меню студентов и вопросов. Вы можете видеть, что если вы откроете раскрывающиеся меню, в которых есть 3 студента и 2 вопроса. Выберите одного студента и All вопросы и ubmit. Здесь вы увидите ошибки, когда я действительно хочу отобразить все детали вопроса здесь.

КОД:

Вопрос: Выпадающее меню:

 <select name="question" id="questionsDrop"> <option value="0">All</option> <option value=23">1</option> <option value=32">1</option> </select> 

Ниже приведен код, который определяет отображение в зависимости от того, какие параметры выбраны из раскрывающегося меню вопроса.

  function StudentAnswers() { $selectedstudentanswerqry = " SELECT sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId, QuestionNo, QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT( DISTINCT Answer ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, QuestionMarks, GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime, MouseClick, StudentMark FROM Student st INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId) INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId) INNER JOIN Question q ON (sa.QuestionId = q.QuestionId) INNER JOIN Answer an ON q.QuestionId = an.QuestionId LEFT JOIN Reply r ON q.ReplyId = r.ReplyId LEFT JOIN Option_Table o ON q.OptionId = o.OptionId "; // Initially empty $where = array('q.SessionId = ?'); $parameters = array($_POST["session"]); $parameterTypes = 'i'; // Check whether a specific question was selected $p_question = empty($_POST["question"])?'':$_POST["question"]; switch($p_question){ case 0: //dont' add where filters break; default: $where[] = 'q.QuestionId = ?'; $parameters[] .= $_POST["question"]; $parameterTypes .= 'i'; } // If we added to $where in any of the conditionals, we need a WHERE clause in // our query if(!empty($where)) { $selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where); global $mysqli; $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry); // You only need to call bind_param once if (count($where) == 1) { $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]); } else if (count($where) == 2) { $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]); } } $selectedstudentanswerqry .= " GROUP BY sa.StudentId, q.QuestionId ORDER BY StudentAlias, q.SessionId, QuestionNo "; // get result and assign variables (prefix with db) $selectedstudentanswerstmt->execute(); $selectedstudentanswerstmt->bind_result($detailsStudentId,$detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId,$detailsQuestionNo, $detailsQuestionContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks,$detailsStudentAnswer,$detailsResponseTime, $detailsMouseClick,$detailsStudentMark); $selectedstudentanswerstmt->store_result(); $selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); $question = array(); while ($selectedstudentanswerstmt->fetch()) { $arrQuestionNo = array(); $arrQuestionContent = array(); $arrQuestionNo[ $detailsStudentId ] = $detailsQuestionNo; $arrQuestionContent[ $detailsStudentId ] = $detailsQuestionContent; $questions[] = $arrQuestionNo; $questions[] = $arrQuestionContent; } $selectedstudentanswerstmt->close(); ?> ........................................................................................... <h2>STUDENT'S ANSWERS</h2> <?php foreach ($questions as $key=>$question) { echo '<p><strong>Question:</strong> ' .htmlspecialchars($arrQuestionNo[$key]). ': ' .htmlspecialchars($arrQuestionContent[$key]). '</p>' . PHP_EOL; } } ?> 

ОБНОВИТЬ:

Структура студенческой таблицы:

 CREATE TABLE `Student` ( `StudentId` int(10) NOT NULL AUTO_INCREMENT, `StudentForename` varchar(25) NOT NULL, `StudentSurname` varchar(25) NOT NULL, `StudentAlias` varchar(15) NOT NULL, `StudentEmail` varchar(50) NOT NULL, `StudentUsername` varchar(20) NOT NULL, `StudentPassword` varchar(50) NOT NULL, `StudentDOB` date NOT NULL, `Year` int(2) NOT NULL, `CourseId` int(6) NOT NULL, `Active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`StudentId`), KEY `FK_Course` (`CourseId`) ) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 

Структура таблицы вопросов:

 CREATE TABLE `Question` ( `QuestionId` int(10) NOT NULL AUTO_INCREMENT, `SessionId` int(10) NOT NULL, `QuestionNo` int(3) NOT NULL, `QuestionContent` varchar(5000) NOT NULL, `NoofAnswers` int(2) NOT NULL, `ReplyId` int(1) NOT NULL, `QuestionMarks` int(4) NOT NULL, `OptionId` int(2) NOT NULL, PRIMARY KEY (`QuestionId`) ) ENGINE=InnoDB AUTO_INCREMENT=357 DEFAULT CHARSET=utf8 

Попробуй …

 $question = array(); while ($selectedstudentanswerstmt->fetch()) { // assuming you don't need the StudentId $questions[] = array('no' => $detailsQuestionNo, 'content' => $detailsQuestionContent); } 

а также

 foreach ($questions as $key => $question) { echo '<p><strong>Question:</strong> ' . htmlspecialchars($question['no']) . ': ' . htmlspecialchars($question['content']) . '</p>' . PHP_EOL; } 

РЕДАКТИРОВАНИЕ

Или вы можете попробовать это, если ваша группировка по вопросу:

 $question = array(); while ($selectedstudentanswerstmt->fetch()) { if (true === isset($questions[$detailsQuestionId])) { $questions[$detailsQuestionId]['students'][] = $detailsStudentId; } else { $questions[$detailsQuestionId] = array(); $questions[$detailsQuestionId]['no'] = $arrQuestionNo; $questions[$detailsQuestionId]['content'] = $arrQuestionContent; $questions[$detailsQuestionId]['students'] = array(); $questions[$detailsQuestionId]['students'][] = $detailsStudentId; } } foreach ($questions as $questionId => $question) { // $question['no'] // $question['content'] foreach($question['students'] AS $key => $studentId) { // $studentId } } 

Или если ваша группировка по идентификатору пользователя …

 $students = array(); while ($selectedstudentanswerstmt->fetch()) { if (false === isset($students[$detailsStudentId])) { $students[$detailsStudentId] = array(); } $students[$detailsStudentId][$detailsQuestionId] = array('no' => $arrQuestionNo, 'content' => $arrQuestionContent; } foreach ($students AS $studentId => $questions) { // $studentId foreach ($questions AS $questionId => $question) { // $questionId // $question['no'] // $question['content'] } } 

Ваш цикл foreach выполняет итерацию по массиву questions , заполненную:

  $questions[] = $arrQuestionNo; $questions[] = $arrQuestionContent; 

Это означает, что это индексированный массив, а не ассоциативный массив; ключи – 0 и 1.

Но тогда вы эхо $arrQuestionNo[$key] и $arrQuestionContent[$key] . Это ассоциативные массивы, ключи которых являются идентификаторами учеников, а не индексы начиная с 0 (если только у вас нет учеников с этими идентификационными номерами).

Кроме того, вы каждый раз инициализируете $arrQuestionNo и $arrQuestionContent в пустой массив через цикл выборки. Поэтому, когда вы эхом отдаете результаты в конце, они просто содержат вопросы из последней строки, которая была выбрана.

Вы должны использовать многомерный массив:

 while ($selectedstudentanswerstmt->fetch()) { $questions[$detailsStudentId][$detailsQuestionNo] = $arrQuestionContent; } 

Тогда ваш цикл печати должен быть:

 foreach ($questions as $studentId => $studentQuestions) { echo '<h2>Student '.htmlspecialchars($studentId).' Answers</h2>'. PHP_EOL; foreach ($studentQuestion as $questionNo => $content) { echo '<p><strong>Question:</strong> ' .htmlspecialchars($questionNo). ': ' .htmlspecialchars($content). '</p>' . PHP_EOL; } }