1

我在下面有一个“答案”数据库表:

答案表

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

现在您可以看到,考试(会议)AAA 中的问题 1 有 1 个答案,而这些是考试(会议)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

现在我的问题是为什么它在两行中都显示错误的答案?第一行只能是“A”,第二行只能是“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 回答