它没有在php/html表中正确显示数据
我有一个“答案”数据库表如下: 答题台它没有在php/html表中正确显示数据,php,html,mysql,sql,database,Php,Html,Mysql,Sql,Database,我有一个“答案”数据库表如下: 答题台 AnswerId SessionId QuestionId Answer 13 AAA 1 A 14 AAC 1 True 现在你们可以看到,AAA考试(课时)中有一个问题1的答案,这是AAC考试(课时)中一个问题1的答案 以下是“问题”表: 问题表: SessionId QuestionId QuestionContent NoofAnswers ReplyId Qu
AnswerId SessionId QuestionId Answer
13 AAA 1 A
14 AAC 1 True
现在你们可以看到,AAA考试(课时)中有一个问题1的答案,这是AAC考试(课时)中一个问题1的答案
以下是“问题”表:
问题表:
SessionId QuestionId QuestionContent NoofAnswers ReplyId QuestionMarks OptionId
AAA 1 What is 2+2? 1 1 5 2
AAC 1 Is 3+3 = 6? 1 1 5 25
现在,我有了一个搜索功能,用户可以从一个问题中输入一个术语并编译搜索。因此,例如,如果用户在“2+2”中输入,那么下面是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
但问题是它显示了一个额外的行,它在下面显示:
QuestionContent Option Type Number of Answers Answer Number of Replies Number of Marks
What is 2+2? A-D 1 A True Single 5
What is 2+2? A-D 1 A True Single 5
现在我的问题是,为什么它显示两行,为什么它在“答案”列下包含答案“True”,而该问题的答案应该是“A”?我相信这是因为两个问题都有相同的问题ID(问题编号),但它们都属于不同的SessionId,所以这应该不是问题
下面是代码(我简化了代码,以便您更容易阅读并希望看到问题),它执行查询并输出结果:
<?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
FROM Answer an
INNER JOIN Question q ON q.QuestionId = an.QuestionId
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);
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;
}
?>
在选择查询中包含一个.QuestionId
$questionquery = "
SELECT DISTINCT an.QuestionId,q.QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT(DISTINCT Answer SEPARATOR '') AS Answer, r.ReplyType,
q.QuestionMarks
FROM Answer an
INNER JOIN Question q ON q.QuestionId = an.QuestionId
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"))."
";
您已将group by用于.QUISTIONID
,但未将其包含在select列中,因为有多个数据即将到来。这里的问题似乎与您定义的db模式无关,我的意思是,答案表上的唯一值应该是answerID或SessionId+QUISTIONID,因此,如果您在查询中使用该表,您还应该在与问题表的连接条件中包含SessionId,我的意思是,至少在这里,不同会话中的两个不同问题可能具有相同的问题ID是关键问题
因此,您的代码应该如下所示:
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"))."
";
上面的SQL查询已更新,以反映更新后的问题
新问题仍然与相同的问题有关,即查询没有指定会话,因此会话中的不同问题可能会混合在一起,我建议您在选择列表中查询会话ID以获取正确的数据,如果不想显示,则将其隐藏在页面上,但是请记住,您需要记录,如果您有一些其他详细信息页面来显示问题,您仍然需要将sessionID和QuestionId一起传递到该页面以识别唯一的数据这已修复了一个问题,但随后会导致另一个问题。我会更新我的问题,让你知道另一个问题是什么。给我5分钟好的,我用新问题更新了问题。我不认为这与查询有关。我想这是我在php/html表格的“答案”栏下存储答案的方式,但我不确定抱歉回复太晚,我的答案也更新了,请检查并让我知道它是否解决了您的问题这没有改变任何东西。但是我有一个稍微不同的问题,如果你想破解这个问题,我更新了问题对不起,回复晚了,我的答案也更新了,请检查并让我知道它是否解决了你的问题