登录后$ _SESSION无法正常工作?

时间:2015-07-31 14:08:06

标签: php

在登录时设置会话:

<?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页面时,我都会被重定向回主页,这意味着会话未处于活动状态。

有人能告诉我为什么会这样吗?

先谢谢!

2 个答案:

答案 0 :(得分:3)

您需要在每个页面上调用session_start();,而不仅仅是主页,并且必须在发送任何其他输出之前执行此操作。通常,它应该是代码中第一个避免任何问题的东西。如果您在每个页面上调用它,则不会在不调用$_SESSION的网页上填充session_start()

此外,isset()返回布尔值(truefalse)。你不应该将它与字符串进行比较。也许,你想要更像这样的东西:

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");
}