【问题标题】:PHP Page refresh issuePHP页面刷新问题
【发布时间】:2017-04-17 08:08:31
【问题描述】:

我正在做一个在线测验。
每次单击“下一个问题”按钮时,我都尝试了以下操作:

if(isset($_POST['submit']) && isset($_POST['ans']))
{
  //process answers and fetch next question
  //Increment the Session variable which contains serial of next question
  $_SESSION['qnum'] = $_SESSION['qnum']+1;
}

每当我单击 F5 按钮时,会话都会更新并获取新问题。
在单击下一个问题按钮时才应增加会话,否则不应增加。
以下是我参考一篇文章后尝试过的:

$pageWasRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) && $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
if($pageWasRefreshed) 
{
  //refetch the current question.
}
else
{
 //refetch the current question and increment the Session Variable 
}
  • 这种方法在 Mozilla Firefox 中运行良好
  • 在 IE 中,按钮点击和 F5 点击都被视为未刷新
  • 在 Chrome 中,按钮单击和 F5 都被视为已刷新

我尝试了 StackOverflow 和 Google 上其他文章的一些其他变体,但这些变体根本不起作用包括基于 ajax 的解决方案

【问题讨论】:

  • 你可以浏览本地存储
  • 您是否将所有这些都保存到数据库中?也许有更好的方法使用数据库,同时使用 SID。
  • 不,这是在线考试 MCQ,在提取考试问题期间,数据库中不会保存任何内容。尝试最后一个问题后,数据将被保存。
  • 谷歌“发布重定向获取”en.wikipedia.org/wiki/Post/Redirect/Get
  • @ITSagar 您是否提交到同一页面..?我认为这是你的问题。参考伊曼纽尔的解决方案。

标签: javascript php ajax session session-cookies


【解决方案1】:

您永远不应显示使用 POST 请求的页面。

你所做的是处理 POST 数据,然后用 php 刷新页面。

像这样:

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST') {
  //handle the POST data
  ...

  // now refresh
  header('location: index.php');  // or what ever url you were on
  exit();
}
// else: show the page
echo '<html> ...';
?>

注意:如果你使用 header('location: ...') NOTHING 必须打印/回显,甚至不是空格/换行/ ...

所以 .php 文件的第一个字符必须是“

【讨论】:

  • 虽然小写标题有效,但它应该是Location:
【解决方案2】:

以下应该是您的最佳解决方案:

$RSig = md5($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].print_r($_POST, true));

    if(isset($_SESSION['LastRequest']) && $_SESSION['LastRequest'] == $RSig)
    {
        $_SESSION['reqstat']='refresh';
    }
    else
    {
        $_SESSION['qnum'] = $_SESSION['qnum']+1;
        $_SESSION['reqstat']='newrequest';
        $_SESSION['LastRequest'] = $RSig;
    }

您可以使用 Session: reqstat 来检查应该在按钮单击而不是刷新时完成的操作。

【讨论】:

    【解决方案3】:

    可能不是完美的解决方案,但会起作用

    if(isset($_POST['submit']) && isset($_POST['ans']))
    {
      //I am assuming we have question id or any  uniq data about question
      if($_SESSION['last_que'] != $_POST['que_id']){
          $_SESSION['qnum'] = $_SESSION['qnum']+1;
          $_SESSION['last_que'] = $_POST['que_id'];
      }
    
    }
    

    如果您想防止计算所有页面,请使用 arraysarray_search

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多