标头不使用会话

时间:2014-02-25 13:29:13

标签: php session login header logout

我在php中使用会话和cookie创建了一个登录系统。

登录后,我希望用户按顺序浏览页面,阻止他们使用后退按钮或输入网址返回上一页或任何页面(即使他们已登录)。除了第一个信息页面,每个页面都有一个问题,只有正确的答案才能到达下一页,有点像寻宝。为此,我正在为每个页面使用会话变量。

登录后的第一页(users-area.php):

<?php
session_start();
require_once("user.cookies.php");

$firstname_user = $_SESSION["SESS_USERFIRSTNAME"];
?>

/*html part*/
<a href="q1.php">Question 1</a><br><br>
<?php
    $_SESSION["from_start"] = "true";
?>

<a href="logout.php">Logout</a>

之后的第二页(q1.php):

<?php
session_start();
require_once("user.cookies.php");

$firstname_user = $_SESSION["SESS_USERFIRSTNAME"];

if (isset($_POST["ans1"])) {         //if answer is submitted
    if ($_POST["ans1"]=="correct") {          //if answer is correct
        $_SESSION["from_q1"] = "true";    //for verifying in next page, q2.php
        header('Location: q2.php');       //heading to next page
    }
    else{                                 //if answer is not correct
        $_SESSION["from_start"] = "true";   //same page loads   
    }

}

if($_SESSION['from_start'] == "false"){    //to check that it came from users-area.php
   //if not, logout
   header("Location: logout.php");
}
else{             
   //if yes,reset the variable so that they can't access from anywhere else anymore
   $_SESSION['from_start'] = "false";
}
?>

//html part
<form method="POST">   //sending input to same page
    <input type="text" name="ans1">
    <input name="submit" type="submit" value="Sumbit">
</form>
<a href="logout.php">Logout</a>

之后的页面(q2.php):

<?php
session_start();
require_once("user.cookies.php");

$firstname_user = $_SESSION["SESS_USERFIRSTNAME"];

 if($_SESSION['from_q1'] == "false"){
   header("Location: logout.php");
 }
 else{
   $_SESSION['from_q1'] = "false";
 }

}
?>

登录系统运行良好。但是在添加所有这些限制之后,在q1.php中,提交正确的答案会导致退出。即使我已将header('Location: q2.php');放在与注销相关的任何内容之前。提交正确的答案应该导致q2.php。

其他一切都有效。 q1.php中的错误答案仅按预期重新加载页面。尝试通过后退按钮或输入网址进入任何页面都会导致注销。

如果有帮助,这里是user.cookies.php:

<?php
  //redirect function
  function returnheader($location){
    $returnheader = header("location: $location");
    return $returnheader;
  }

  if(!strlen($_SESSION["SESS_USERNAME"]) ){
    //redirect
    returnheader("index.php");
  }
?>

为什么q1.php没有正确使用正确答案?是不是一个接一个地使用标题?

1 个答案:

答案 0 :(得分:1)

标题后('Location:q2.php');你必须退出脚本,否则执行将在下一行继续。

if (isset($_POST["ans1"])) {         //if answer is submitted
    if ($_POST["ans1"]=="correct") {          //if answer is correct
        $_SESSION["from_q1"] = "true";    //for verifying in next page, q2.php
        header('Location: q2.php');       //heading to next page
        exit;
    }
    else{                                 //if answer is not correct
        $_SESSION["from_start"] = "true";   //same page loads   
    }

}