0

我在 login.php 中有这段代码

if ( $sth->execute() ) {
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    if ( $row ) {
        var_dump($row); // See below
        $_SESSION['login'] = $row['login'];
        setcookie('login', $row['login'], time() * 7 * 24 * 60 * 60);
        if ( $row['right'] == ACCESS_ADMIN ) {
            echo "true"; // true
            $_SESSION['right'] = ACCESS_ADMIN;
            setcookie('right', $row['login'], time() * 7 * 24 * 60 * 60);
        }
    }
}


var_dump($row) - array(3) 
{ 
    ["login"]=> string(6) "phplox"
    ["password"]=> string(32) "827ccb0eea8a706c4c34a16891f84e7b"
    ["right"]=> string(5) "admin" 
} ?>
<br>

好的没问题。转到 index.php。

<?php var_dump($_COOKIE) ?> `// array(1) { ["PHPSESSID"]=> string(26) "o05mr9luc2ok8ieadss4v9mhg0" }`

但如果

<?php var_dump($_SESSION) ?> // 

结果是:

array(3) 
{
    ["request_token"]=> string(32) "335f1dcd4283889f0f2fe602cfa36d71"
    ["login"]=> string(6) "phplox" ["right"]=> string(5) "admin" 
}
4

2 回答 2

0

在设置 cookie 之前,您不能发送任何输出。Cookie 是通过 HTTP 标头发送的,因此必须在将任何输出发送到浏览器之前发送它们。在这里,你回显了一些东西,然后尝试设置 cookie:

            echo "true"; // <--- REMOVE THIS
            $_SESSION['right'] = ACCESS_ADMIN;
            setcookie('right', $row['login'], time() + (7 * 24 * 60 * 60)); // add to the time, don't multiply time()

您还可以检查 的返回值,如果输出已发送setcookie(),则返回布尔值。false

于 2013-01-23T07:20:45.790 回答
0

这:

time() * 7 * 24 * 60 * 60

溢出,所以它环绕int值并创建一个引用过去的值,因此浏览器不会创建 cookie。将其更改为:

time() + 7 * 24 * 60 * 60

此外,正如 MrCode 所说,除非您使用ob_start().

希望这可以帮助

于 2013-01-23T07:23:38.477 回答