我对PHP很新,并且遇到了困难。当用户登录我的站点时,会生成会话ID并将其与过期时间,用户的电子邮件和IP一起存储在数据库中。会话ID也存储在用户的cookie中,并在30分钟不活动后过期。加载页面时,导航栏的一部分取决于它们是否已登录,这取决于是否设置了cookie。我的代码如下所示。
body
<?php
if (isset($_COOKIE['sessionID'])) {
echo "<li><a href=\"login\"><i class=\"material-icons\">account_circle</i></a></li>";
} else {
echo "<li><a href=\"login\">Login</a></li>\n";
}
?>
我知道用户已登录,至少在一定程度上,因为$sql = "SELECT * FROM users WHERE `email`='$email'";
$query = mysqli_query($conn, $sql);
if (password_verify($password, mysqli_fetch_assoc($query)['password'])) {
$sessionID = uniqid('id_', true);
$sql = "INSERT INTO sessions (`email`, `ID`, `expiration`, `ip`) VALUES ('$email', '$sessionID', '" . date("Y-m-d H:i:s", strtotime("+30 minutes")) . "', '" . $_SERVER['REMOTE_ADDR'] . "')";
setcookie("sessionID", $sessionID);
$_COOKIE['sessionID'] = $sessionID;
mysqli_query($conn, $sql);
header("Location: https://[censor]/");
exit();
} else {
header("Location: https://[censor]/login?success=false");
exit();
}
显示在数据库和我的cookie上。
我开始使用PHP会话,在让他们上班一次之后,他们似乎已停止工作了。我的新代码如下。
sessionID
不,我没有忘记开始一个会话,它是在文件的最开头开始的。
$sql = "SELECT * FROM users WHERE `email`='$email'";
$query = mysqli_query($conn, $sql);
if (password_verify($password, mysqli_fetch_assoc($query)['password'])) {
$_SESSION['email'] = $email;
header("Location: https://[censor]/");
echo $_SESSION['email'];
exit();
} else {
header("Location: https://[censor]/login?success=false");
exit();
}
答案 0 :(得分:0)
我遇到了同样的错误。我不知道为什么这不起作用,但我解决了这个问题:
$val = true;
if(isset($_COOKIE['sessionID'])){
$val = false;
}
if($val == true){
//action 1
}
else{
//action 2
}
我认为这也适用于你的情况。或者,如果你在没有使用的情况下使用它,那么它通常不起作用吗?
答案 1 :(得分:0)
如果您使用 SESSIONS 进行登录会更好;这是一个示例代码。我从登录表单中获取登录信息,将其分配给相应的变量并与我的数据库中的内容进行比较。
<?php session_start();
if (isset($_POST['submit'])) {
$username=$_POST['username'];
$password=$_POST['password'];
$username=validate_data($username);
$query="SELECT * FROM users;";
$result=mysqli_query($connection,$query);
comfirm_query($result);
//fetching login info
while ($user=mysqli_fetch_assoc($result)) {
//verifying info
if($user['username']==$username){
if (password_verify($password,$user['password'])) {
/*if success set the session super global variable with indexes
user_id and username with the values gotten from the database*/
$_SESSION['user_id']=$user['id'];
$_SESSION['username']=$username;
redirect_to("admin.php");
}
else{
$_SESSION['login_message']="username or password not correct";
}
}
else
$_SESSION['login_message']="username or password not correct";
}
}
?>
现在验证要求用户登录的任何页面上的登录
<?php
if(!isset($_SESSION['user_id'])){
header("location:login.php");
exit;
}else{
/*continue executing code on page; the else is not really
necessary as if the variable is not set, the user
will be redirected; but if it #is set ,
the just skip (permit me to use this word)
the if and get on with the code*/
}
?>