我在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没有正确使用正确答案?是不是一个接一个地使用标题?
答案 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
}
}