在登录时设置会话:
<?php
require 'lib/password.php';
include_once '../inc/dbconPDO.inc.php';
if (isset($_SESSION['user']) != "") {
header("Location: /control/home");
}
if (isset($_POST['btn-login'])) {
$email = strtolower($_POST['email']);
$upass = $_POST['pass'];
$sql = "SELECT * FROM users WHERE email=:email";
$stmt = $db->prepare($sql);
$stmt->bindParam(':email', $email);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_BOTH);
$pass = $row['password'];
if (password_verify($upass, $pass)) {
$_SESSION['user'] = $row['user_id'];
header("Location: /control/home");
} else { ?>
<script>alert("Gegevens incorrect!"); </script>
<?php
}
}
?>
Home.php:
<?php
session_start();
if (isset($_SESSION['user']) == "") {
header("Location: /");
}
?>
// Rest of the page below.
应该让我转到home.php页面,因为它应该在登录时设置一个会话。
目前,每当我访问home.php页面时,我都会被重定向回主页,这意味着会话未处于活动状态。
有人能告诉我为什么会这样吗?
先谢谢!
答案 0 :(得分:3)
您需要在每个页面上调用session_start();
,而不仅仅是主页,并且必须在发送任何其他输出之前执行此操作。通常,它应该是代码中第一个避免任何问题的东西。如果您不在每个页面上调用它,则不会在不调用$_SESSION
的网页上填充session_start()
。
此外,isset()
返回布尔值(true
或false
)。你不应该将它与字符串进行比较。也许,你想要更像这样的东西:
if (!array_key_exists('user', $_SESSION) || $_SESSION['user'] === "")
{
header("Location: /");
exit; // stops it from further execution of code below
}
另外,最好在每个标题后添加exit;
,否则您的代码可能希望继续执行。
答案 1 :(得分:0)
您的脚本中是否已初始化会话? (@session_start()) 你在这里犯了一个错误:
if(isset($_SESSION['user'])!="")
{
header("Location: /control/home");
}
应该是
if(!empty($_SESSION['user']))
{
header("Location: /control/home");
}