1

以下に「回答」データベーステーブルがあります。

回答表

AnswerId SessionId QuestionId Answer
13       AAA       1          A
14       AAB2      2          A
15       AAB2      2          B

ご覧のとおり、Exam (Session) AAA の質問 1 には 1 つの回答があり、Exam (Session) AAB2 の質問 2 には 2 つの回答があります。

以下は「質問」表です。

質問表:

SessionId  QuestionId QuestionContent NoofAnswers ReplyId QuestionMarks OptionId
AAA        1          What is 2+2?    1           1       5             2
AAC        1          3+3 and 4+4 ?   2           2       10            6

これで、ユーザーが質問から用語を入力して検索をコンパイルする検索機能ができました。たとえば、ユーザーが「+」を入力した場合、php/html テーブルに表示される結果は次のようになります。

   QuestionContent Option Type  Number of Answers Answer Number of Replies  Number of Marks
   What is 2+2?    A-D          1                 A      Single               5
   3+3 and 4+4?    A-H          2                 AB     Multiple             5

しかし問題は、追加の回答が表示されていることです。これは以下に表示されています。

   QuestionContent Option Type  Number of Answers Answer Number of Replies  Number of Marks
   What is 2+2?    A-D          1                 A AB     Single               5
   3+3 and 4+4?    A-H          2                 A AB     Multiple             5

今私の問題は、なぜ両方の行に間違った答えが表示されるのですか? 1 行目は「A」のみ、2 行目は「AB」のみである必要があります。

以下は、クエリを実行して結果を出力するコードです (読みやすく、うまくいけば問題を確認できるように縮小しました)。

<?php

//connect to db


    // Build the query
    $questionquery = "
SELECT DISTINCT q.QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT(DISTINCT Answer SEPARATOR '') AS Answer, r.ReplyType, 
       q.QuestionMarks, q.SessionId 
  FROM Answer an 
  INNER JOIN Question q ON q.QuestionId = an.QuestionId and an.SessionId = q.SessionId
  JOIN Reply r ON q.ReplyId = r.ReplyId 
  JOIN Option_Table o ON q.OptionId = o.OptionId 
      WHERE ".implode(" AND ", array_fill(0, $numTerms, "q.QuestionContent LIKE ?"))."
      GROUP BY an.SessionId, an.QuestionId
      ORDER BY ".implode(", ", array_fill(0, $numTerms, "IF(q.QuestionContent LIKE ?, 1, 0) DESC"))."
    ";

    // Make the referenced array
    $referencedArray = make_values_referenced(array_merge(
      array(str_repeat("ss", $numTerms)), // types
      $termArray,                         // where
      $termArray                          // order by
    ));


    // Bind parameters
    if (!call_user_func_array(array($stmt, 'bind_param'), make_values_referenced($referencedArray))) {
      die("Error binding parameters: $stmt->error"); 
    }


    // This will hold the search results
    $searchResults = array();
    $searchOption = array();
    $searchNoofAnswers = array();
    $searchAnswer = array();
    $searchReply = array();
    $searchMarks = array();

    // Fetch the results into an array
    if (!$stmt->num_rows()) {
      $stmt->bind_result($dbQuestionContent,$dbOptionType,$dbNoofAnswers,$dbAnswer,$dbReplyType,$dbQuestionMarks, $dbSessionId); 
      while ($stmt->fetch()) {
        $searchResults[] = $dbQuestionContent;
        $searchOption[] = $dbOptionType;
        $searchNoofAnswers[] = $dbNoofAnswers;
        $searchAnswer[] = $dbAnswer;
        $searchReply[] = $dbReplyType;
        $searchMarks[] = $dbQuestionMarks;
      }
    }

  }


      $questionnum = sizeof($searchResults);

    // If $searchResults is not empty we got results
    if (!empty($searchResults)) {
      echo "<p>Your Search: '$inputValue'</p>";  
      echo"<p>Number of Questions Shown from the Search: <strong>$questionnum</strong></p>";
      echo "<table border='1' id='resulttbl'>
      <tr>
      <th class='questionth'>Question</th>
      <th class='optiontypeth'>Option Type</th>
      <th class='noofanswersth'>Number of <br/> Answers</th>
      <th class='answerth'>Answer</th>
      <th class='noofrepliesth'>Number of <br/> Replies</th>
      <th class='noofmarksth'>Number of <br/> Marks</th>
      </tr>\n";
      $script = '';
      foreach ($searchResults as $key=>$question) {
      $script .= 'var key_' . $key . '="' . str_replace('"','\"', $question) . '";' . PHP_EOL;
        echo '<tr class="questiontd">'.PHP_EOL;
        echo '<td>'.htmlspecialchars($question).'</td>' . PHP_EOL;
        echo '<td class="optiontypetd">'.htmlspecialchars($searchOption[$key]).'</td>' . PHP_EOL;
        echo '<td class="noofanswerstd">'.htmlspecialchars($searchNoofAnswers[$key]).'</td>' . PHP_EOL;
        echo '<td class="answertd">'.htmlspecialchars(implode(' ', $searchAnswer)).'</td>' . PHP_EOL; 
        echo '<td class="noofrepliestd">'.htmlspecialchars($searchReply[$key]).'</td>' . PHP_EOL;
        echo '<td class="noofmarkstd">'.htmlspecialchars($searchMarks[$key]).'</td>' . PHP_EOL;
        echo "<td class='addtd'><button type='button' class='add' onclick=\"parent.addwindow(key_$key,'$searchMarks[$key]','$searchNoofAnswers[$key]','$searchOption[$key]','$searchReply[$key]','$searchAnswer[$key]');\">Add</button></td></tr>";
}
        echo "</table>" . PHP_EOL;
        echo '<script type="text/javascript">' . PHP_EOL;
        echo $script;
        echo '</script>' . PHP_EOL;


}
?>
4

1 に答える 1

0

クエリ自体が何を返すかを確認しましたか? したがって、問題がクエリにあるのか、結果の操作にあるのかを特定できます。

結果をフェッチすると$searchAnswer、行を追加する配列が作成されます。次に、テーブルに配列全体を出力し$searchAnswerます (内破します)。これは問題ではありませんか?

于 2012-10-11T11:10:04.777 に答える