0

我有 2 个小问题需要帮助来处理以下代码:

echo "<table border='1' id='markstbl'>
      <tr>
      <th class='questionth'>Question No.</th>
      <th class='questionth'>Question</th>
      <th class='answerth'>Answer</th>
      <th class='answermarksth'>Marks per Answer</th>
      <th class='noofmarksth'>Total Marks</th>
      </tr>\n";
                $previous_question_id = null;
          foreach ($searchQuestionContent as $key=>$question) {
            if ($previous_question_id == $searchQuestionId[$key]) {
          $searchQuestionId[$key] = '';
          $question = '';
          $searchMarks[$key] = '';
      }else{
          $previous_question_id = $searchQuestionId[$key];
      }
        echo '<tr class="questiontd">'.PHP_EOL;
        echo '<td class="optiontypetd">'.htmlspecialchars($searchQuestionId[$key]).'</td>' . PHP_EOL;
        echo '<td>'.htmlspecialchars($question).'</td>' . PHP_EOL;
        echo '<td class="answertd">';
        echo $searchAnswer[$key];
        echo '</td>' ;
        echo '<td class="answermarkstd"><input class="individualMarks" name="answerMarks[]" id="individualtext" type="text" "/></td>' . PHP_EOL;
        echo '<td class="noofmarkstd">'.htmlspecialchars($searchMarks[$key]).'</td>' . PHP_EOL;
}      
        echo '</tr>';
        echo "</table>" . PHP_EOL;

问题 1:如果您查看上表,我有一列将包含文本输入。现在每个文本输入将属于“答案”列中的每个答案。我的问题是文本输入是否正确设置,我在name属性中包含 [] 来设置数组?我[]应该在文本输入代码中包含什么内容吗?还有什么我应该包含的内容吗?

问题 2:目前,上面的代码使表格看起来像JSFIDDLE1中的这个示例。但我希望该表显示为本示例JSFIDDLE2。如您所见,另一个表中的空白行是行跨度,因此它看起来像问题,总分看起来像它在一个单元格中。我怎样才能让上面的表格看起来像 JSFIDDLE2?

更新:

以下是完整代码,无论何时使用,我仍然会收到未定义$rowspans[....的索引。下面的代码是否正确:

$assessment = $_SESSION['id'] . $sessionConcat;

$query = "SELECT q.SessionId, s.SessionName, q.QuestionId, q.QuestionContent, an.Answer, q.QuestionMarks 
FROM Session s 
INNER JOIN Question q ON s.SessionId = q.SessionId
JOIN Answer an ON q.QuestionId = an.QuestionId AND an.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
$searchQuestionId = array();
$searchQuestionContent = array();
$searchAnswer = array();
$searchMarks = array();

// Fetch the results into an array

// get result and assign variables (prefix with db)
$stmt->bind_result($dbSessionId, $dbSessionName, $dbQuestionId, $dbQuestionContent, $dbAnswer, $dbQuestionMarks);
while ($stmt->fetch()) {
$searchQuestionId[] = $dbQuestionId;
$searchQuestionContent[] = $dbQuestionContent;
$searchAnswer[] = $dbAnswer;
$searchMarks[] = $dbQuestionMarks;
}   

?>      

</head>

<body>

<form id="QandA" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">


<?php 

echo "<table border='1' id='markstbl'>
<tr>
<th class='questionth'>Question No.</th>
<th class='questionth'>Question</th>
<th class='answerth'>Answer</th>
<th class='noofmarksth'>Total Marks</th>
</tr>\n";
$previous_question_id = null;
$rowspans = array_count_values($searchQuestionId);
foreach ($searchQuestionContent as $key=>$question) {
if ($previous_question_id == $searchQuestionId[$key]) {
$searchQuestionId[$key] = '';
$question = '';
$searchMarks[$key] = '';
}else{
$previous_question_id = $searchQuestionId[$key];
}
echo '<tr class="questiontd">'.PHP_EOL;
echo '<td class="optiontypetd">'.htmlspecialchars($rowspans[$searchQuestionId[$key]]).'</td>' . PHP_EOL;
echo '<td>'.htmlspecialchars($question).'</td>' . PHP_EOL;
echo '<td class="answertd">';
echo $searchAnswer[$key];
echo '</td>';        echo '<td class="noofmarkstd">'.htmlspecialchars($searchMarks[$key]).'</td>' . PHP_EOL;
}
echo '</tr>';
echo "</table>" . PHP_EOL;

?>

<p><input id="submitBtn" name="submitMarks" type="submit" value="Submit Marks" /></p>

</form>
4

1 回答 1

1

Q1。是的,您甚至可以在[].

Q2。似乎$searchQuestionId在您的循环之前已填充,对吗?在这种情况下,您可以使用array_count_values存储每个 ID 的频率并在循环期间访问该数组:

在你的循环之前:$rowspans = array_count_values($searchQuestionId);

在循环期间访问 rowspan 值:$rowspans[$searchQuestionId[$key]]

您必须删除该行$searchQuestionId[$key] = '';,否则您将无法访问正确的$rowspan密钥。

最后,您必须设置更多if语句来跳过<td>某些行上的 s。

$previous_question_id = null;
$rowspans = array_count_values($searchQuestionId);
foreach ($searchQuestionContent as $key=>$question) {

    // removed logic, not necessary to set empty strings if you're skipping them

    echo '<tr class="questiontd">'.PHP_EOL;

    if ($previous_question_id != $searchQuestionId[$key]) {
        echo '<td class="optiontypetd" rowspan="'.$rowspans[$searchQuestionId[$key]].'">'.htmlspecialchars($searchQuestionId[$key]).'</td>' . PHP_EOL;
        echo '<td rowspan="'.$rowspans[$searchQuestionId[$key]].'">'.htmlspecialchars($question).'</td>' . PHP_EOL;
    }

    echo '<td class="answertd">';
    echo $searchAnswer[$key];
    echo '</td>' ;
    echo '<td class="answermarkstd"><input class="individualMarks" name="answerMarks[]" id="individualtext" type="text" "/></td>' . PHP_EOL;

    if ($previous_question_id != $searchQuestionId[$key]) {
        echo '<td class="noofmarkstd" rowspan="'.$rowspans[$searchQuestionId[$key]].'">'.htmlspecialchars($searchMarks[$key]).'</td>' . PHP_EOL;
    }

    // moved this to the end
    if ($previous_question_id != $searchQuestionId[$key]) {
        $previous_question_id = $searchQuestionId[$key];
    }
}
于 2012-11-06T01:27:26.760 回答