我的饼干在哪里?

时间:2013-01-23 07:13:01

标签: php cookies

我在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" 
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

此:

time() * 7 * 24 * 60 * 60

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

time() + 7 * 24 * 60 * 60

此外,正如MrCode所说,除非您使用ob_start(),否则请勿在发送Cookie之前发送输出。

希望这有帮助