我正在做一个在线测试。
在“下一个问题”按钮的每一次点击中,我都尝试了以下几点:
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
}我尝试过其他一些StackOverflow和谷歌文章的变体,但这些版本在上都没有用,包括基于ajax的解决方案。
发布于 2016-12-02 12:31:42
以下是您的最佳解决方案:
$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;
}您可以使用会话: reqstat来检查应该在按钮单击而不是刷新时执行的操作。
发布于 2016-12-02 12:13:16
您不应该显示带有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> ...';
?>注意:如果使用标头(“位置:.”)没有任何东西必须打印/回响,即使是空格/新行/.
因此,.php文件的第一个字符必须是"<“(开始的php标记的字符)。
发布于 2016-12-02 12:13:34
也许不是完美的解决方案,但会奏效
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'];
}
}如果您想防止计算所有页面,只需使用arrays和array_search
https://stackoverflow.com/questions/40931785
复制相似问题