Php 在在线考试系统中随时保存给定答案
我正在用php开发一个在线考试系统。我设计了一个题库类型的东西,这样在考试中每个学生都可以从题库中随机得到问题。基本上这意味着,如果我有100道题,那么在考试中我可以随机抽取60道题。而且他们随机抽取 问题是当用户刷新页面时,他们每次都会收到新的随机问题。我试图将问题与给出的答案一起存储在HTML5 localStorage中。因此,希望在每次页面刷新时从本地存储加载,而不是从数据库查询 然后我意识到php是服务器端的,当页面刷新发生时,我无法从localStorage加载到php脚本。有些文章据说使用了ajax。但我不知道如何在按下刷新按钮或F5时将数据加载到同一页面。(是的,我在卸载前尝试了OnForeUnload) 以下是我所做的解决方案。我已将加载的问题保存到$\u会话,并访问该会话以保持相同问题的刷新 我目前遇到的问题虽然这可以保留问题,但保存已标记的答案并没有帮助,如果用户意外关闭了窗口,他们将无法继续离开的地方 有什么想法吗?如果你想看我的代码,请让我知道。 多谢各位 更新这是我的代码Php 在在线考试系统中随时保存给定答案,php,local-storage,session-variables,Php,Local Storage,Session Variables,我正在用php开发一个在线考试系统。我设计了一个题库类型的东西,这样在考试中每个学生都可以从题库中随机得到问题。基本上这意味着,如果我有100道题,那么在考试中我可以随机抽取60道题。而且他们随机抽取 问题是当用户刷新页面时,他们每次都会收到新的随机问题。我试图将问题与给出的答案一起存储在HTML5 localStorage中。因此,希望在每次页面刷新时从本地存储加载,而不是从数据库查询 然后我意识到php是服务器端的,当页面刷新发生时,我无法从localStorage加载到php脚本。有些文章
<?php if($_GET['exam_id']!="")
{
$e_id=decrypt_string($_GET['exam_id']);
$query_p_exam=mysqli_fetch_array(mysqli_query($conn,"select * from exam where e_id='".$e_id."'"));
$category_id=$query_p_exam['category_id'];
$subcategory_id=$query_p_exam['subcategory_id'];
$subject_id=$query_p_exam['subject_id'];
$exam_name=$query_p_exam['exam_name'];
$exam_duration=$query_p_exam['exam_duration'];
$neg_mark_status=$query_p_exam['neg_mark_status'];
$negative_marks=$query_p_exam['negative_marks'];
$question_limit = $query_p_exam['question_limit'];
//echo $question_limit;
}
?>
<div class="main-content">
<br>
<div class="container-fluid padded">
<div class="container-fluid padded">
<div class="row-fluid">
<div class="span8">
<div class="box">
<div class="box-header">
<span class="title"><i class="icon-reorder"></i> Questions</span>
</div>
<div class="box-content scrollable" style="max-height: 500px; overflow-y: auto">
<div class="box-section news with-icons">
<form method='post' id='quiz_form' action="main_result.php">
<table style="width:100%;vertical-align:top" class="table table-normal">
<tr>
<td style="vertical-align:top">
<?php
if($_SESSION["rows"]){
$tempArray = $_SESSION["rows"];
//var_dump($tempArray);
$total_querstion= $question_limit;
$timeduration=60000*$query_exam_Name['duration'];
$i=1;
$m_e_id=1;
foreach($tempArray as $result){
$rows[] = $result;
?>
<!-- DISPLAY QUESTION BEGINS -->
<div <?php if($i==1){}else{echo 'style="display: none;"';}?> id="<?php echo $m_e_id;?>_<?php echo $i;?>" class="display_question">
<div class="bradcome-menu qu-pa">
<div class="col-md-6"> <span class="question"> Question No. <?php echo $i;?></span></div>
</div>
<h4 class="quction"><p><?php echo $result['question'];?></p></h4>
<?php if($result['typeofquestion']=='Single'){?>
<table class="answeers" border="0" width="100%">
<tbody>
<tr>
<td style="width:10px"><input name="radio_<?php echo $result['q_id'];?>" value="A" id="" type="radio"></td>
<td><?php echo $result['option_a'];?> </td>
</tr>
<tr>
<td>
<input name="radio_<?php echo $result['q_id'];?>" value="B" id="" type="radio"></td><td>
<?php echo $result['option_b'];?> </td>
</tr>
<tr>
<td>
<input name="radio_<?php echo $result['q_id'];?>" value="C" id="" type="radio"></td><td>
<?php echo $result['option_c'];?> </td>
</tr>
<tr>
<td>
<input name="radio_<?php echo $result['q_id'];?>" value="D" id="" type="radio"></td><td>
<?php echo $result['option_d'];?> </td>
</tr>
</tbody>
</table>
<?php }
if($result['typeofquestion']=='Multiple'){?>
<table class="answeers" border="0" width="100%">
<tbody><tr>
<td style="width:10px">
<input name="checkbox_A_<?php echo $result['q_id'];?>" value="A" id="" type="checkbox"></td><td>
<?php echo $result['option_a'];?> </td>
</tr>
<tr>
<td>
<input name="checkbox_B_<?php echo $result['q_id'];?>" value="B" id="" type="checkbox"></td><td>
<?php echo $result['option_b'];?> </td>
</tr>
<tr>
<td>
<input name="checkbox_C_<?php echo $result['q_id'];?>" value="C" id="" type="checkbox"></td><td>
<?php echo $result['option_c'];?> </td>
</tr>
<tr>
<td>
<input name="checkbox_D_<?php echo $result['q_id'];?>" value="D" id="" type="checkbox"></td><td>
<?php echo $result['option_d'];?> </td>
</tr>
</tbody>
</table>
<?php }?>
</div>
<!-- DISPLAY QUESTION ENDS -->
<?php $i++;}
}else{
$query_pag_data = mysqli_query($conn,"SELECT * from question where e_id='".$e_id."' and question_status=1 and c_id='".$category_id."' and s_c_id='".$subcategory_id."' order by rand() LIMIT ".$question_limit);
$total_querstion= $question_limit;
$timeduration=60000*$query_exam_Name['duration'];
$i=1;
$m_e_id=1;
while($result=mysqli_fetch_array($query_pag_data)){
$rows[] = $result;
?>
<!-- DISPLAY QUESTION BEGINS -->
<!-- same code -->
<!-- DISPLAY QUESTION ENDS -->
<?php $i++;
$_SESSION["rows"] = $rows;
}
}
?>
<?php
$json = json_encode($rows);
$_SESSION ['json'] = $json;
?>
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td><div id="prev" class="btn btn-gray "><?php echo constant('TI_PREVIOUS_BUTTON');?></div></td>
<td><div id="mnext" class="btn btn-gray"><?php echo constant('TI_MARK_FOR_REVIEW_BUTTON');?></div></td>
<td><div id="next" class="btn btn-gray"><?php echo constant('TI_NEXT_BUTTON');?></div></td>
<td><div id="clearAnswer" class="btn btn-gray"><?php echo constant('TI_CLEAR_ANSWER_BUTTON');?></div></td>
<td><div style="float:right"><input id="finish" class="btn btn-green" value="Finish" name="Finish" onclick="return confirm('<?php echo constant('TI_SUBMITALERT_MESSAGE')?>')" type="submit"></div></td>
</tr>
</table>
</td>
</tr>
</table>
<input type="hidden" name="exam_id" value="<?php echo $_GET['exam_id'];?>">
</form>
</div>
</div>
</div>
</div>
是您使用会话所遵循的步骤将起作用,对于已标记的答案,您必须更新数据库,并获得新的答案集。在第一页加载时,将所有问题id和用户id关系保存在数据库中,如
qid uid ans
1 1 update
1 5 update
2 5 update
所以像这样,所有队列都是第一个以随机顺序存储用户id的存储,在每个答案上更新这个记录,我认为这很容易,因为如果用户关闭窗口或关闭任何指示灯,计算就很容易检测到它的剩余位置
如果用户回答了3个问题,那么你可以检测出哪些问题没有答案,然后只提取那些问题或你想应用的任何其他逻辑。这对你来说很容易
因此,数据库是最好的解决方案,因为如果您正在使用,您将无法获得值,如果您更改浏览器或存在任何其他问题,那么它将不起作用。能否发布代码请将代码发送到堆栈溢出!你可以选择第一个,学习一个好的问题,然后创造一个新的答案。这使我们更容易帮助您。我已经更新了我的问题并添加了代码。请看一看。@Katie谢谢你的建议,将来我会让自己在提问方面做得更好。我会尝试这种方法。谢谢