Sus salidas detallan incorrectamente en php / html

Quiero mostrar todas las preguntas del menú desplegable cuando el usuario selecciona All en el menú desplegable de preguntas y lo muestra debajo. El problema es que no está haciendo esto y para empeorarlo, me está dando errores de compensación indefinidos que dicen:

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

La línea 605 es:

 echo '

Question: ' .htmlspecialchars($arrQuestionNo[$key]). ': ' .htmlspecialchars($arrQuestionContent[$key]). '

' . PHP_EOL;

Mi pregunta es cómo solucionar el error y mostrar todas las preguntas si el usuario selecciona la opción All ?

Tengo una demostración que puedes ver: DEMO

Sigue los pasos a continuación:

  • En el menú desplegable del Módulo, seleccione System Stratergy y envíe
  • Cuando aparece el menú desplegable Evaluación, seleccione POKUB1 y envíe
  • Verá los estudiantes y el menú desplegable de preguntas. Puede ver que si abre los menús desplegables, hay 3 estudiantes y 2 preguntas. Seleccione un solo estudiante y All preguntas y ubmit. Aquí es donde verá los errores cuando realmente quiera mostrar todos los detalles de la pregunta aquí.

CÓDIGO:

Menú desplegable de preguntas:

  All 1 1  

A continuación se muestra un código que determina la visualización dependiendo de qué opciones se seleccionen del menú desplegable de preguntas.

  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(); ?> ........................................................................................... 

STUDENT'S ANSWERS

$question) { echo '

Question: ' .htmlspecialchars($arrQuestionNo[$key]). ': ' .htmlspecialchars($arrQuestionContent[$key]). '

' . PHP_EOL; } } ?>

ACTUALIZAR:

Estructura de la tabla de estudiantes:

 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 

Estructura de la tabla de preguntas:

 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 

Dale una oportunidad …….

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

y

 foreach ($questions as $key => $question) { echo '

Question: ' . htmlspecialchars($question['no']) . ': ' . htmlspecialchars($question['content']) . '

' . PHP_EOL; }

EDITADO

O puede intentar esto si su agrupación por pregunta:

 $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 } } 

O si su agrupación por ID de usuario …

 $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'] } } 

Su ciclo foreach está iterando sobre el conjunto de questions , que se rellenó con:

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

Esto significa que es una matriz indexada, no una matriz asociativa; las teclas son 0 y 1.

Pero luego $arrQuestionNo[$key] y $arrQuestionContent[$key] . Estas son matrices asociativas, cuyas claves son ID de estudiante, no índices que comienzan en 0 (a menos que tenga estudiantes con estos números de ID).

Además, inicializa $arrQuestionNo y $arrQuestionContent a una matriz vacía cada vez a través del bucle de búsqueda. Entonces, cuando hace eco de los resultados al final, estos solo contienen las preguntas de la última fila que se obtuvo.

Deberías usar una matriz multidimensional:

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

Entonces su ciclo de impresión debería ser:

 foreach ($questions as $studentId => $studentQuestions) { echo '

Student '.htmlspecialchars($studentId).' Answers

'. PHP_EOL; foreach ($studentQuestion as $questionNo => $content) { echo '

Question: ' .htmlspecialchars($questionNo). ': ' .htmlspecialchars($content). '

' . PHP_EOL; } }