我想做一个类似于应用程序的测验,其中将给用户一个特定的时间(例如1分钟)来回答问题。目前我正在使用计时器在超时时自动提交表单。但我需要确保没有人能够绕过计时器。所以我决定在服务器端创建一个检查,以检查第一个请求和表单提交是否在固定的时间之间。但是我如何处理PHP中的网络延迟。如果我的网络加载表单需要10秒钟,而提交表单需要5秒钟,我的总时间将是1分15秒。有更好的解决方案吗?
客户端
<body onload="myFunc">
<form action="submit.php" id="myForm" method="POST">
<h4>My Question</h4>
<input type="text" placeholder="Your answer">
<input type="submit" value="Submit">
</form>
</body>
<script>
function myFunc(){
setTimeout(function(){
$("#myForm").submit();
},60*1000);
}
</script>
服务器
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] === 'GET'){
echo "The form...";
$_SESSION['start'] = time();
}else{
$end = time();
if($end - $_SESSION['start'] > 60){ // Need help here. It will be always > 60
echo "You are too late..";
}
else{
echo "Submitted";
}
}
?>
代码中可能存在语法错误。这不是正确的代码,我试图解释我的想法。
答案 0 :(得分:0)
使用javascript处理的所有东西都不能依赖它,因为用户可以在客户端更改它。可能最好的解决方案是你的数据库中服务器端有startTime,当你在服务器端时有请求保存完成时间并查看它是否正常。
为了获得网络延迟,您可以使用javascript在客户端设置发送时间,但用户可以操作它并且它不可靠。 你可以从这样的javascript获得UTC时间戳:
var now = new Date;
var utc_timestamp = Date.UTC(now.getFullYear(),now.getMonth(), now.getDate() ,
now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
或者您可以从考试开始时设置计时器,当表格提交或考试结束时计算已经过的秒数并将其发送到服务器但是我已经说过它可以由用户更改
也许通过捏造您的javascript代码,您会更加信任您从客户端收到的javascript和数据