PHP页面刷新问题

时间:2016-12-02 12:02:32

标签: javascript php ajax session session-cookies

我正在进行在线测验 每次点击“下一个问题”按钮,我都尝试了以下内容:

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的解决方案

3 个答案:

答案 0 :(得分: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> ...';
?>

注意:如果您使用标题(&#39;位置:...&#39;)必须打印/回显NOTHING,甚至不是空格/新行/ ...

因此.php文件的第一个字符必须是&#34;&lt;&#34; (开放的php标签)

答案 1 :(得分:1)

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

$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来检查应该在按钮点击时执行的操作,而不是刷新。

答案 2 :(得分:0)

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

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