Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 跨多个页面的倒计时变量_Php_Javascript_Countdown - Fatal编程技术网

Php 跨多个页面的倒计时变量

Php 跨多个页面的倒计时变量,php,javascript,countdown,Php,Javascript,Countdown,我有一个电子考试的演示网站,每个学生在整个考试中有15分钟的时间(包括5个科目,每个科目有10个问题)。我希望学生在主页上单击开始时,倒数计时器立即启动并自动更新。事实上,这是很容易做到的一页 问题是,如果学生单击进入下一页,我希望计时器从上一页停止的位置开始,然后继续倒计时。 我曾想过使用会话,但如何让Javascript在PHP中设置会话变量?当时的想法是使用AJAX,但我不知道如何使用它 有人能帮我吗,即使它需要AJAX以外的东西 附言: 我想要显示的是剩余的秒数,而不是当前时间 谢谢。您

我有一个电子考试的演示网站,每个学生在整个考试中有15分钟的时间(包括5个科目,每个科目有10个问题)。我希望学生在主页上单击开始时,倒数计时器立即启动并自动更新。事实上,这是很容易做到的一页

问题是,如果学生单击进入下一页,我希望计时器从上一页停止的位置开始,然后继续倒计时。
我曾想过使用会话,但如何让Javascript在PHP中设置会话变量?当时的想法是使用AJAX,但我不知道如何使用它

有人能帮我吗,即使它需要AJAX以外的东西

附言:
我想要显示的是剩余的秒数,而不是当前时间


谢谢。

您可以使用如下算法:

  • 当“开始”事件发生时,将开始时间存储在数据库中
  • 定期向后端脚本发送AJAX请求。如果时间已过期,则返回结束测试的响应

  • 在这种情况下,没有真正的“计时器”——只有一个开始时间,以及检查15分钟是否已经过去的逻辑。如果你想向用户显示一个计时器,那么数学计算将很简单。

    你不必知道它在另一页的什么地方停止

    您只想知道用户何时单击开始

    只需将其保存在数据库或文件中即可

    并在每次请求时计算服务器上剩余的时间

    因为客户端很容易被操纵


    在服务器上计算剩余时间后,您可以在每页上使用javascript进行倒计时。

    您只需将页面放入iFrame中,并在主页上设置倒计时计时器。

    我找到了一种简单的方法,只需进行少量搜索

    PHP: 然后在每一页上:

    <script type="text/javascript">
        var startTime = <?php echo $_SESSION['start_time']; ?>;
        //calculate remaining time
    </script>
    
    
    var startTime=;
    //计算剩余时间
    
    很简单,您可以存储学生第一次开始测试的时间戳,并将其输出到每个页面。然后,只需从时间戳中减去当前时间,即可得到经过的时间

    然而,依赖Javascript是确保计时器启动的一种非常糟糕的方法。更好的方法是强制用户单击实际的链接/按钮,而不涉及Javascript。你在服务器上记录时间戳,然后点击进来,然后一切都好了

    start.php:

    <a href="page1.php">Start Test - Page 1</a>
    
    
    
    page1.php:

    <?php
    
    if(!isset($_SESSION['test_start_timestamp')) {
        $_SESSION['test_start_timestamp'] = time();
    }
    ?>
    
    <h3>Question #1</h3>
    etc...
    
    
    问题#1
    等
    

    重要的是,一旦设置了时间戳值,就不要在会话中重置它。否则,考生只需点击一下,直到到达计数器重置的页面,就可以获得更多的考试时间。

    @Ravan:如果我的浏览器崩溃了怎么办?我可以再次参加测试吗/我失败了吗?@Ravan
    $\u SESSION['start\u time']
    将只给出测试开始的时间,而不是页面离开的时间。@PeeHaa这是一种极端情况如果用户获得页面的缓存版本,它可能会失败。正如我所说的,这是一个简单的解决方案。@afaolek:这是你应该现在考虑而不是以后考虑的事情。相信我,现在想一个好的可持续解决方案总是比以后好。在过去,我通过艰苦的方式学会了:D
    <?php
    
    if(!isset($_SESSION['test_start_timestamp')) {
        $_SESSION['test_start_timestamp'] = time();
    }
    ?>
    
    <h3>Question #1</h3>
    etc...