4

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

以下の手順に従います。

  • Module ドロップダウン メニューで、System Stratergy を選択して送信します。
  • 評価のドロップダウン メニューが表示されたら、POKUB1 を選択して送信します
  • 生徒と質問のドロップダウン メニューが表示されます。ドロップダウン メニューを開くと、3 人の生徒と 2 つの質問があることがわかります。生徒とAll質問を1人選んで提出してください。質問のすべての詳細をここに表示したい場合、ここにエラーが表示されます。

コード:

質問のドロップダウン メニュー:

<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
4

2 に答える 2

2

これを試してみてください.......

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

または、userIDでグループ化した場合...

$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']
    }
}
于 2013-02-08T16:40:41.083 に答える
0

ループは、次のように入力された配列をforeach反復処理しています。questions

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

これは、連想配列ではなく、インデックス付き配列であることを意味します。キーは0と1です。

しかし、あなたはエコー$arrQuestionNo[$key]して$arrQuestionContent[$key]。これらは連想配列であり、そのキーは学生IDであり、0から始まるインデックスではありません(これらのID番号を持つ学生がいる場合を除く)。

また、フェッチループを実行するたびに、初期化して空の配列にします$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;
  }
}
于 2013-02-07T09:04:26.570 に答える