1

以下のコードでは、最初に質問を終了してから、回答のリストからOption Type正しい回答 ( Answerfield`) を削除することにより、可能な回答のリストを取得しようとしています。

私の質問は、これを行うには、コードを完成させるために少し助けが必要だということです。$row変数を参照するためにifステートメントの前に呼び出していないことを知っている変数で通知を受けていますが、それに関する私の質問は、$row変数が何として設定されていると思われるか、または$row何か他のものを呼び出す必要がありますか?

受け取った通知の例:

Notice: 未定義の変数: 行中 ... 行中 ...

Notice: 行中 ... で非オブジェクトのプロパティを取得しようとしています ...

一番下のコードを見ると、間違った答えを表示しようとすると別の問題が発生し<?php echo $incorrect_ans[$key]; ?>、単語が表示され続けArrayます。配列を間違って呼び出していますか? 受け取った不正解を表示したい。

以下は完全なコードです

    $query = "SELECT q.SessionId, s.SessionName, q.QuestionId, q.QuestionNo, q.QuestionContent, an.Answer, an.AnswerId, q.QuestionMarks, q.OptionId, o.OptionType
    FROM 
    Question q INNER JOIN Answer an ON q.QuestionID = an.QuestionID
    INNER JOIN Option_Table o ON o.OptionID = q.OptionID
    INNER JOIN Session s ON s.Sessionid = q.Sessionid
    WHERE s.SessionName = ?
    ORDER BY q.QuestionId, an.Answer
       ";

           // prepare query
           $stmt=$mysqli->prepare($query);
           // You only need to call bind_param once
           $stmt->bind_param("s", $assessment);
           // execute query
           $stmt->execute(); 


               // This will hold the search results
            $searchQuestionNo = array();
            $searchQuestionContent = array();
            $totalMarks = array();
            $searchAnswerId = array();
            $searchMarks = array();

            // Fetch the results into an array

           // get result and assign variables (prefix with db)
        $stmt->bind_result($dbSessionId, $dbSessionName, $dbQuestionId, $dbQuestionNo, $dbQuestionContent, $dbAnswer, $dbAnswerId, $dbQuestionMarks, $dbOptionId, $dbOptionType);
              while ($stmt->fetch()) {

                   $specialOptionTypes = array(
            'Yes or No' => array( 'Y', 'N' ),
            'True or False' => array( 'T', 'F' ),
        );

        // Do this for each row:
        if ( array_key_exists( $row->OptionType, $specialOptionTypes ) ) {
            $options = $specialOptionTypes[ $row->OptionType ];
        } else if ( preg_match( '/^([A-Z])-([A-Z])$/', $row->OptionType, $match ) ) {
            $options = range( $match[1], $match[2] );
        } else {
            // issue warning about unrecognized option type
            $options = array();
        }
        $right = str_split( $row->Answer );  // or explode() on a delimiter, if any
        $wrong = array_diff( $options, $right );  

                $searchQuestionNo[] = $dbQuestionNo;
                $searchQuestionContent[] = $dbQuestionContent;
                $incorrect_ans[] = $wrong;
                $searchAnswerId[] = $dbAnswerId;
                $totalMarks[] = $dbQuestionMarks;
                $searchMarks[] = $dbQuestionMarks;
              } 

.... 

          //table row 

          <td class="answertd" name="incorrectanswers[]"><?php
    echo $incorrect_ans[$key];
    ?></td> 

データベース テーブルを表示して、各テーブルの内容を確認したい場合は、以下をご覧ください。

DB テーブル構造:

セッション テーブル (別名試験テーブル)

SessionId(auto)  SessionName
137              XULWQ

質問表:

SessionId  QuestionId QuestionContent  QuestionNo QuestionMarks  OptionId
137        1          Name 2 Things     1         5               5
137        2          Name 3 Things     2         5               2

Option_Table テーブル:

OptionId  OptionType
1         A-C
2         A-D
3         A-E
4         A-F
5         A-G
6         A-H

回答表:

 AnswerId(auto) SessionId  QuestionId  Answer
   200            137        1           B
   201            137        1           F
   202            137        2           D
   203            137        2           A
   204            137        2           C   

アップデート:

唯一の問題は、不正解のレイアウトです。不正解を質問ごとに独自の行に表示する必要があります。

以下は、各質問の正解と不正解です。

Question Number: 1   Correct Answer(s) B     Incorrect Answers A C D
Question Number: 2   Correct Answer(s) A C   Incorrect Answers B D
Question Number: 3   Correct Answer(s) D     Incorrect Answers A B C

以下は、現在のレイアウトとレイアウト方法を示しています。

ここに画像の説明を入力

現在の出力のコードは次のとおりです。

<table border='1' id='penaltytbl'>
<thead>
<tr>
<th class='questionth'>Question No.</th>
<th class='answerth'>Incorrect Answer</th></tr>
</thead>
<tbody>
<?php
$row_span = array_count_values($searchQuestionNo);
$prev_ques = '';
foreach($searchQuestionNo as $key=>$questionNo){

?>

<tr class="questiontd">
    <?php
    if($questionNo != $prev_ques){
    ?>
    <td class="questionnumtd q<?php echo$questionNo?>_qnum" rowspan="<?php echo$row_span[$questionNo]?>">
    <?php echo$questionNo?><input type="hidden" name="numQuestion" value="<?php echo$questionNo?>" />
    </td>
    <?php
    }  
    ?>
<td class="answertd"><?php echo implode(',', $incorrect_ans[$key]);?></td>
</tr>
<?php
$prev_ques = $questionNo;
}
?>
</tbody>
</table>
4

1 に答える 1

2

問題$rowは非常に単純です-変数が$row定義されていません。行をフェッチする代わりに、変数を結果値にバインドしているので$row->OptionType、バインドされた変数に置き換えて$dbOptionType、同様$row->Answer$dbAnswer. 行をフェッチするには、次のようにする必要があります。

$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_object()) {
    // ...
}

コード例では$incorrect_ans、定義された変数も表示されません。おそらく別の場所で実行している可能性がありますが、そうでない場合は$incorrect_ans = array()、たとえば、他のリストを定義している場所に追加します(// This will hold the search results行の下)。

print_r実行してみる$incorrect_ansと、結果配列の構造が表示されます。配列のリストがあり、echo $incorrect_ans[$key];その結果がArray. あなたが行うことができecho implode(',', $incorrect_ans[$key]);、文字で区切られた値を持つ文字列を取得します,

whileループの前に定義することを$specialOptionTypesお勧めします。ループ内でその配列を変更していないため、反復ごとに再作成する理由はないと思います。

nameまた、そのような属性を持たない属性を設定していることにも気付きまし<td>た(私の知る限り)-おそらくいくつかを使用したかったの<input>ですか?

<?php

// .........

$query = "SELECT q.SessionId, s.SessionName, q.QuestionId, q.QuestionNo, q.QuestionContent, an.Answer, an.AnswerId, q.QuestionMarks, q.OptionId, o.OptionType
    FROM 
    Question q INNER JOIN Answer an ON q.QuestionID = an.QuestionID
    INNER JOIN Option_Table o ON o.OptionID = q.OptionID
    INNER JOIN Session s ON s.Sessionid = q.Sessionid
    WHERE s.SessionName = ?
    ORDER BY q.QuestionId, an.Answer";

// prepare query
$stmt=$mysqli->prepare($query);
// You only need to call bind_param once
$stmt->bind_param("s", $assessment);
// execute query
$stmt->execute(); 


// This will hold the search results
$searchQuestionNo = array();
$searchQuestionContent = array();
$totalMarks = array();
$searchAnswerId = array();
$searchMarks = array();
$incorrect_ans = array();

// Fetch the results into an array

// get result and assign variables (prefix with db)
$stmt->bind_result($dbSessionId, $dbSessionName, $dbQuestionId, $dbQuestionNo, $dbQuestionContent, $dbAnswer, $dbAnswerId, $dbQuestionMarks, $dbOptionId, $dbOptionType);
$specialOptionTypes = array(
    'Yes or No' => array('Y', 'N'),
    'True or False' => array('T', 'F'),
);
while ($stmt->fetch()) {
    // Do this for each row:
    if (array_key_exists($dbOptionType, $specialOptionTypes)) {
        $options = $specialOptionTypes[$dbOptionType];
    } else if (preg_match('/^([A-Z])-([A-Z])$/', $dbOptionType, $match)) {
        $options = range($match[1], $match[2]);
    } else {
        // issue warning about unrecognized option type
        $options = array();
    }
    $right = str_split($dbAnswer);  // or explode() on a delimiter, if any
    $wrong = array_diff($options, $right);

    $searchQuestionNo[] = $dbQuestionNo;
    $searchQuestionContent[] = $dbQuestionContent;
    $incorrect_ans[] = $wrong;
    $searchAnswerId[] = $dbAnswerId;
    $totalMarks[] = $dbQuestionMarks;
    $searchMarks[] = $dbQuestionMarks;
} 

// .........

for ($key = 0, $cnt = count($incorrect_ans) ; $key < $cnt ; ++$key) : 
?>
<td class="answertd">
    <?php echo implode(',', $incorrect_ans[$key]); ?>
</td>
<?php 
endfor; 
?>
于 2013-01-09T21:23:11.767 に答える