0

質問の「合計点数」と、質問の各回答のテキスト入力との差を計算したいと思います。また、質問に回答が1つしかない場合は、テキスト入力を読み取り専用として表示し、そのテキスト入力のその質問の「合計マーク」の下の数値と同じ値を表示する必要があります。

以下は、両方のシナリオで私が抱えている表と書かれた問題を示すスクリーンショットです。

表のスクリーンショットと問題に関する情報

以下は、計算を実行し、必要に応じて読み取り専用テキストボックスを表示する必要がある現在のjquery変数です。しかし、現時点では機能していません。また、現時点では、計算時に合計点数を「5」と表示していますが、これは各行内の数であるため間違っているので、数で$sessionMarksあるはずの変数だと思います。 、5ではありません。

$(function(){             
var questions = $('#markstbl td[class*="_ans"]').length-1;

//disable single entry
for (var i=0;i<=questions;i++){   
if($("[class*=q"+i+"_mark]").length ==1){
$("[class*=q"+i+"_mark]").attr("disabled","disabled")
}                    
}

//find each question set and add listeners
for (var i=0;i<=questions;i++){                                     
$('input[class*="q'+i+'"]').keyup(function(){
var cl = $(this).attr('class').split(" ")[1]
var questionno = cl.substring(cl.indexOf('q')+1,cl.indexOf('_'))
var t=0;
$("[class*=q"+questionno+"_mark]").each(function(){
var num = (isNaN(parseInt($(this).val())))?0:parseInt($(this).val());
t+=parseInt(num);                             
})   
var fixedno = 5;
$(".q"+questionno+"_ans").text((t>fixedno)?fixedno:t);
})
}
})

以下はテーブルのコードです。クエリからデータベースから各質問の詳細を出力し、テーブルに表示します。

<?php

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

include('connect.php');

   $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;
      } 

?>  

....

<tbody>
<tr>
<?php
$previous_question_id = null;
$rowspans = array_count_values($searchQuestionId);
$output = "";
$questionid = 0; //whole question
$questionno = 0; //part of question
foreach ($searchQuestionContent as $key => $question) {
if ($previous_question_id != $searchQuestionId[$key]){
$questionno=0;
}

// removed logic, not necessary to set empty strings if you're skipping them
$output.= '<tr class="questiontd">' . PHP_EOL;
if ($previous_question_id != $searchQuestionId[$key]) {
$output.= '<td class="questionnumtd" name="numQuestion" rowspan="' . $rowspans[$searchQuestionId[$key]] . '">' . htmlspecialchars($searchQuestionId[$key]) . '</td>' . PHP_EOL;
$output.= '<td class="questioncontenttd q{$questionno++}_mark{$questionid}" rowspan="' . $rowspans[$searchQuestionId[$key]] . '">' . htmlspecialchars($question) . '</td>' . PHP_EOL;
}

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

if ($previous_question_id != $searchQuestionId[$key]) {
$output.= '<td class="noofmarkstd  q{$questionid++}_ans" q_group="1" 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];
}
}
echo $output;
?>
</tr>
</tbody>

アップデート:

このフィドルにあるサンプルHTMLでは、それを機能させることができます(ただし、テキスト入力に数値を入力したときの現在の処理ではなく、テキスト入力に入力された数値を差し引いた合計マークを計算する必要があります) 0からテキスト入力に入力された数値に加算を実行します)が、同じことを行うために上記のコードを編集しようとすると、機能せず、何も起こりません。

サンプルhtmlは以下のとおりです。

<form id="Marks" action="/u0867587/Mobile_app/individualmarks.php" method="post">

<table border='1' id='markstbl'>
<thead>
<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>
</thead>
<tbody>

<tr class="questiontd">
<td class="questionnumtd" name="numQuestion" rowspan="3">1</td>
<td class="questioncontenttd" rowspan="3">Name three features in a ROM</td>
<td class="answertd" name="answers[]">A</td>
<td class="answermarkstd">
<input class="individualMarks q0_mark_0"  q_group="1" name="answerMarks[]" id="individualtext" type="text" />
</td>
<td class="noofmarkstd q0_ans"  q_group="1" rowspan="3">5</td>
</tr>
<tr class="questiontd">
<td class="answertd" name="answers[]">B</td>
<td class="answermarkstd">
<input class="individualMarks q0_mark_1" q_group="1" name="answerMarks[]" id="individualtext" type="text" />
</td>
</tr>
<tr class="questiontd">
<td class="answertd" name="answers[]">D</td>
<td class="answermarkstd">
<input class="individualMarks q0_mark_2" q_group="1" name="answerMarks[]" id="individualtext" type="text" />
</td>
</tr>
<tr class="questiontd">
<td class="questionnumtd" name="numQuestion" rowspan="1">2</td>
<td class="questioncontenttd" rowspan="1">Here is a single answer</td>
<td class="answertd" name="answers[]">True</td>
<td class="answermarkstd">
<input class="individualMarks q1_mark_0" q_group="1" name="answerMarks[]" id="individualtext" type="text" />
</td>
<td class="noofmarkstd q1_ans" q_group="1" rowspan="1">5</td>
</tr>
</tbody>
</table>
</form>

以下はデータベーステーブルがどのように見えるかです(これはスクリーンショットのものと同じデータに従います)

セッションテーブル:(試験の詳細が保存されている場所)

SessionId  SessionName
1          AAA

質問表:(各試験の質問が保存される場所)

SessionId   QuestionId       QuestionContent                Total Marks
1                 1          Name three features in a ROM        5 
1                 2          Here is a single answer             5     

解答表:(各試験の各質問の解答を保存します)

AnswerId(auto)  SessionId QuestionId  Answer
1               1         1           A
2               1         1           B
3               1         1           D
4               1         2           True

Individual_Answerテーブル:(個々の回答ごとに個々のマークを格納します)

AnswerId   AnswerMarks
1          2
2          2
3          1
4          5
4

1 に答える 1

1

何らかの形で計算または整数値に属する html() を使用して html 要素から値を取得および配置することはお勧めできません。したがって、このタイプの問題には常に隠しフィールドを使用してください。最終値については、最後に非表示フィールドから合計マーク値を簡単に取得できます。

コードは動的データ用に更新されます。クエリには独自のコードを使用してください。私のものは大まかなコードです。

        <html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript">
            $(function() {           
                var questions = $('#markstbl td[class*="_ans"]').length;

                //disable single entry
                for (var i=1;i<=questions;i++){   
                    if($("[class*=q"+i+"_marks]").length ==1){
                        var t_marks = $("[class*=q"+i+"_ans]").html();
                        alert(t_marks);
                        $("[class*=q"+i+"_marks]").val(t_marks).attr("disabled","disabled");
                        //$("[class*=q"+i+"_mark]").attr("disabled","disabled");
                    }                    
                }

                //find each question set and add listeners
                for (var i=0;i<=questions;i++){                                     
                    $('input[class*="q'+i+'"]').keyup(function(){
                        var cl = $(this).attr('class').split(" ")[1]
                        var questionno = cl.substring(cl.indexOf('q')+1,cl.indexOf('_'));
                        var tot_marks = $(".q"+questionno+"_ans_org").val();

                        var ans_t=0;
                        $("[class*=q"+questionno+"_marks]").each(function(){
                            var num = (isNaN(parseInt($(this).val())))?0:parseInt($(this).val());
                            ans_t+=parseInt(num);                             
                        });
                        ans_t=tot_marks-ans_t;                             

                        var ans = (parseInt(ans_t)<0)?tot_marks:ans_t;
                        $(".q"+questionno+"_ans").val(ans);
                        $(".q"+questionno+"_ans_text").html(ans);
                    });
                }
            });
        </script>
    </head>
<body>
<form id="Marks" action="/u0867587/Mobile_app/individualmarks.php" method="post">
    <?php
    $ident = mysqli_connect('localhost','root','');
    mysqli_select_db($ident,'testdata');

    $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
    ORDER BY q.QuestionId, an.Answer
    ";

    $res = mysqli_query($ident,$query);
    $searchQuestionId = array();
    $searchQuestionContent = array();
    $searchAnswer = array();
    $searchMarks = array();

   while ($row = mysqli_fetch_array($res)) {
        $searchQuestionId[] = $row['QuestionId'];
        $searchQuestionContent[] = $row['QuestionContent'];
        $searchAnswer[] = $row['Answer'];
        $searchMarks[] = $row['QuestionMarks'];

    } 

?>  


<form id="Marks" action="/u0867587/Mobile_app/individualmarks.php" method="post">

<table border='1' id='markstbl'>
<thead>
<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>
</thead>
<tbody>
<?php
$row_span = array_count_values($searchQuestionId);
$output = '';
$rowCount = 1;
$newQuest_id = true;

foreach($searchQuestionId as $key=>$questionId){

    if($newQuest_id == true){

        $output.= '<tr class="questiontd">';
        $output.= '<td class="questionnumtd" name="numQuestion" rowspan="'.$row_span[$questionId].'">'.$questionId.' <input type="hidden" name="q'.$questionId.'_ans_org" class="q'.$questionId.'_ans_org" value="'.$searchMarks[$key].'"><input type="hidden" name="q'.$questionId.'_ans" class="q'.$questionId.'_ans" value="'.$searchMarks[$key].'"></td>';
        $output.= '<td class="questioncontenttd" rowspan="'.$row_span[$questionId].'">'.$searchQuestionContent[$key].' </td>';
    }

    $output.= '<td class="answertd" name="answers[]">'.$searchAnswer[$key].'</td>';
    $output.= '<td class="answermarkstd">';
    $output.= '<input class="individualMarks q'.$questionId.'_marks"  q_group="1" name="answerMarks[]" id="individualtext" type="text" />';
    $output.= '</td>';


    if($newQuest_id == true){
        $output.= '<td class="noofmarkstd q'.$questionId.'_ans_text"  q_group="1" rowspan="'.$row_span[$questionId].'">'.$searchMarks[$key].'</td>';
        $newQuest_id = false;
    }
    $output.= '</tr>';

    if($row_span[$questionId] == $rowCount){
        $newQuest_id = true;
    }

    $rowCount++;
}

echo $output;
?>
</tbody>
</table>
</form>
</form>
</body>
</html>
于 2012-11-13T18:50:05.720 に答える