2012-06-26 5 views
-2

У меня есть приложение здесь: APPLICATIONКак связать каждую кнопку с отдельными отметками?

Что у меня есть некоторые вопросы и связанные с каждым из вопросов в их возможных ответов на кнопках флажок и три текстовых входов, показывающие QuestionID, тип параметра и количество баллов для каждого отдельного ответа.

Фактически количество меток для каждого индивидуального ответа, если проблема возникает. То, что я хочу попытаться, заключается в том, что для каждого правильного ответа для каждого вопроса они связаны с их собственным вводом текста, показывающим количество оценок, которые они стоят (см. Таблицу Individual_Answer ниже), для всех неправильных ответов, все они стоят 0 в их текстовые входы/

Теперь здесь таблицы базы данных для данного примера приложения:

Вопрос:

QuestionId (PK auto) QuestionNo SessionId (FK Session) OptionId (FK Option)  
72     1   26      3 
73     2   26      4 

Option_Table:

OptionId (PK Auto) OptionType 
1     A-C 
2     A-D 
3     A-E 
4     A-F 

Ответ:

AnswerId (PK auto) QuestionId (FK Question)  Answer 
1       72       C    
2       73       A    
3       73       C    
4       73       D  

Individual_Answer:

AnswerId (PK auto) AnswerMarks 
1     2 
2     2 
3     1 
4     2 

Фактический код ниже:

//$qandaqry query is here and executed 


     $qandaqrystmt->bind_result($qandaQuestionId,$qandaQuestionNo,$qandaQuestionContent,$qandaOptionType,$qandaAnswer,$qandaAnswerMarks); 

     $arrQuestionId = array(); 
     $arrQuestionNo = array(); 
     $arrQuestionContent = array(); 
     $arrOptionType = array(); 
     $arrAnswer = array(); 
     $arrAnswerMarks = array(); 

     while ($qandaqrystmt->fetch()) { 
     $arrQuestionId[ $qandaQuestionId ] = $qandaQuestionId; //QuestionId 
     $arrQuestionNo[ $qandaQuestionId ] = $qandaQuestionNo; //QuestionNo 
     $arrQuestionContent[ $qandaQuestionId ] = $qandaQuestionContent; //QuestionContent 
     $arrOptionType[ $qandaQuestionId ] = $qandaOptionType; //OptionType 
     $arrAnswer[ $qandaQuestionId ] = $qandaAnswer; //Answer 
     $arrAnswerMarks[ $qandaQuestionId ] = $qandaAnswerMarks; //AnswerMarks 
     } 


    ?> 
    <form action='results.php' method='post' id='exam'> 

    <?php 

//Retrieve options for each question 

    function ExpandOptionType($option) { 
     $options = explode('-', $option); 
     if(count($options) > 1) { 
      $start = array_shift($options); 
      $end = array_shift($options); 
      do { 
       $options[] = $start; 
      }while(++$start <= $end); 
     } 
     else{ 
      $options = explode(' or ', $option); 
     } 
     echo '<p>'; 
     foreach($options as $indivOption) { 
      echo '<div class="ck-button"><label class="fixedLabelCheckbox"><input type="checkbox" name="options[]" id="option-' . $indivOption . '" value="' . $indivOption . '" /><span>' . $indivOption . '</span></label></div>'; 
     } 
      echo '</p>'; 


    } 


    foreach ($arrQuestionId as $key=>$question) { 

    ?> 

    <div class="queWrap"> 

//Each QuestionNo and QuestionContent 
    <p><?php echo htmlspecialchars($arrQuestionNo[$key]) . ": " . htmlspecialchars($arrQuestionContent[$key]); ?></p> 

//Output each Individual Option 
    <p><?php echo ExpandOptionType(htmlspecialchars($arrOptionType[$key])); ?></p> 

//Output each QuestionId text input per question 
    <p>Question Id:<input type='text' class='questionIds' name='questionids' value='<?php echo htmlspecialchars($arrQuestionId[$key]); ?>' /></p> 

//Output each OptionType text input per question 
    <p>Option Type: <input type='text' class='optionType' name='optiontype' value='<?php echo htmlspecialchars($arrOptionType[$key]); ?>' /></p> 

//Output each AnswerMarks per answer in each question 
    <p>Each Answer's Marks<input type='text' class='answermarks' name='answerMarks' value='<?php echo htmlspecialchars($arrAnswerMarks[$key]); ?>' /></p> 

    </div> 


    <?php 

    } 

    ?> 
    </form> 
+0

дубликата [ранее спросил ** слишком локализованный вопрос **] (http: // stackoverflow.com/questions/14803913/how-to-display-individual-marks) –

+0

Вы пытаетесь создать форму для того, чтобы кто-то задал вопрос или кому-то ответить на вопрос? Если это для кого-то, ставящего вопрос, то почему в схеме БД нет нигде для текста вопроса и текста ответа? Если это для кого-то, отвечающего на вопрос, вы все равно не должны показывать какие-либо из этих значений в текстовых вводах. – runspired

+0

@runspired Я попытался ограничить информацию в вопросе, поэтому я не включил такие вещи, как вопрос, например, вопрос. Текст ответа отображается в таблице «Ответ» для каждого вопроса, и у меня есть таблица «Student_Answer», которая будет отслеживать ответы учащихся. Эта страница - фактическая оценка, которую принимает студент. Причина, по которой они представляют собой текст, вводит нас, поэтому я могу видеть, что происходит со значениями, после этого они будут заменены на скрытый ввод. – user1394925

ответ

0

Во-первых, я хотел бы рекомендовать вам пересмотреть схему БД. У вас гораздо больше таблиц, чем вам нужно создать БД вопросов, и все соединения и т. Д. Вам нужно получить один вопрос, это дорогостоящие операции.

Допустим, вы хотите, чтобы ваши HTML смотреть что-то вроде следующего:

<div class="queWrap" id="question-72"> 
    <h2 class="question-text">What is 4+4?</h2> 
    <h3>Answers: <span class="questionMarks">(this question is worth 2 points)</span></h3> 

    <div class="ck-button"> 
     <label class="fixedLabelCheckbox"> 
      <input type="checkbox" name="options_72[]" id="option-A" value="A"> 
      <span>0</span> 
     </label> 
    </div> 

    <div class="ck-button"> 
     <label class="fixedLabelCheckbox"> 
      <input type="checkbox" name="options_72[]" id="option-B" value="B"> 
      <span>4</span> 
     </label> 
    </div> 

    <div class="ck-button"> 
     <label class="fixedLabelCheckbox"> 
      <input type="checkbox" name="options_72[]" id="option-C" value="C"> 
      <span>8</span> 
     </label> 
    </div> 

    <div class="ck-button"> 
     <label class="fixedLabelCheckbox"> 
      <input type="checkbox" name="options_72[]" id="option-D" value="D"> 
      <span>16</span> 
     </label> 
    </div> 
</div> 

Теперь скажем result->fetch() выше был переписан более шикарно как и ваш запрос в:

$_Questions = array(); 
while($qandaqrystmt->fetch()) { 
    $_Questions[] = array('id'=>$qandaQuestionId,'num'=>$qandaQuestionNo,'content'=>$qandaQuestionContent,'type'=>$qandaOptionType,'answer'=>$qandaAnswer,'marks'=>$qandaAnswerMarks); 
} 

затем к выходу на вопросы мы просто хотим создать цикл и создать соответствующий HTML. Я хочу отметить, что было бы невероятно глупо посылать правильный ответ вместе с вопросом испытуемому, даже если он скрыт в html. Вы заметите, что этот HTML похож на ваш собственный, но имеет одно изменение, которое является CRITICAL: потому что у вас есть только один элемент формы, окружающий все ваши вопросы, для каждого элемента checkbox array требуется уникальное имя. Я выбрал для добавления _ (QuestionID) для каждого массива, как так

(например, вопрос 72) <input type="checkbox" name="options_72[]" id="option-D" value="D">

Вот как бы цикл его с помощью heredoc

foreach($_Questions AS $question) { 
    echo <<<EOT 
    <div class="queWrap" id="question-{$question['id']}"> 
     <h2 class="question-text">{$question['content']}</h2> 
     <h3>Answers: <span class="questionMarks">(this question is worth {$question['marks']} points)</span></h3> 
    EOT; 

$options = ['A','B','C','D','E','F']; 
$lastOption = substr($question['type'], -1, 1); 
foreach($options as $opt) { 
    echo <<<EOT 
    <div class="ck-button"> 
     <label class="fixedLabelCheckbox"> 
      <input type="checkbox" name="options_{$questions['id']}[]" value="$opt"> 
      <span>$opt</span> 
     </label> 
    </div> 
    EOT; 
    if($opt == $lastOption) 
    break; 
} 

} 
Смежные вопросы