我正在使用php创建一个登录系统,当我提交正确的信息时,它会设置一个cookie。表单操作发送到同一页面,其中有一个isset cookie验证在顶部,但由于cookie在设置后需要刷新,您需要再次刷新页面,以便它可以注意到cookie在那里。
它的解决方法是什么?这是我的代码(其中用户名和密码是“admin”,就像占位符一样。当我让系统工作时,我会从数据库中提取值。)
<?php
if(isset($_COOKIE['user']))
{
echo "Hello, administrator.<br />";
echo "<a href=?logout=yes>logout</a>";
if(isset($_GET['logout']))
{
setcookie("user", $_POST['username'], time() - 3600);
}
}
else
{
if (isset($_POST['submit']))
{
if (($_POST['username']=="admin")&&($_POST['password']=="admin"))
{
setcookie("user", $_POST['username'], time() + 3600);
}
else
{
echo "empty field or wrong user/pass.";
}
}
else
{
echo "nothing submitted. show form.";
}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table border="0">
<tr><td colspan=2><h1>Login</h1></td></tr>
<tr><td>Username:</td><td>
<input type="text" name="username" maxlength="40">
</td></tr>
<tr><td>Password:</td><td>
<input type="password" name="password" maxlength="50">
</td></tr>
<tr><td colspan="2" align="right">
<input type="submit" name="submit" value="Login">
</td></tr>
</table>
</form>
答案 0 :(得分:1)
除非你绝对需要使用自定义cookie,否则我建议使用$ _SESSION全局。设置后,$ _SESSION数据即可使用。但其更重要的特征是数据不存储在客户端上。简单来说,用户永远无法访问其数据。所以很难破解你的登录系统。正如其他人所指出的,使用cookie,任何人都可以阅读和编辑数据!
session_start();
if (isset($_GET['logout']))
{
unset($_SESSION['username']);
}
if ($_SESSION['username'] == 'admin')
{
echo "hello admin!";
}
else if (($_POST['username']=="admin")&&($_POST['password']=="admin"))
{
$_SESSION['username'] = $_POST['username'];
}
要使用$ _SESSION全局变量,您需要将session_start()
放在脚本的开头(在发送任何数据之前)。它应该同时解决您的重定向问题。请注意,在场景后面,$ _SESSION使用一个小cookie,但你真的不必考虑它。它只包含一个小ID。
有关会话的更多信息
http://www.php.net/manual/en/book.session.php
PS:说实话,我仍然会在这里使用重定向。当您发布表单并按后退按钮时,浏览器会要求您再次发送数据并且令人讨厌。使用header("Location: " . $newUrl);
重定向可以消除这种烦恼。但只是我的2美分。
答案 1 :(得分:0)
$loggedin = false;
if(isset($_POST['submit'])) {
// Do login checking and set cookies
$loggedin = true; // if the case
}else if(isset($_COOKIE['username']) && isset($_COOKIE['password'])) {
// Check if valid login
$loggedin = true; // if the case
}else{
// They are not logged in.
}
然后使用变量$登录来查看他们是否已登录。我建议创建一个用户类来处理这个问题,所以你在文件中一遍又一遍地使用相同的代码。
答案 2 :(得分:0)
您可以创建自己的功能来设置Cookie,即:
function my_setcookie($name,$value,$expire){
$_COOKIE[$name] = $value;
return setcookie($name,$value,$expire);
}
但更好的想法是在成功的'POST'请求后重定向用户,因此如果刷新页面,浏览器将不会抱怨重发POST数据。