【问题标题】:Any reason why this code snippet wouldn't set a cookie properly?这个代码片段没有正确设置cookie的任何原因?
【发布时间】:2011-10-20 01:19:51
【问题描述】:

这个小的 PHP sn-p 用于设置一个 cookie,让我确定用户是否登录。出于某种原因,在我使用 javascript 重定向后,我的任何 cookie 都不再设置。为什么会发生这种情况?

我可能没有给你足够的信息,如果有,请告诉我。

...some database queries...
<?php 
    $expire=time()+(7 * 24 * 60 * 60);
    $row = mysql_fetch_array($query);
    $email = $row['email'];
    $userinfo['name'] = $name;
    $userinfo['email'] = $email;
    $userinfo = serialize($userinfo);
    setcookie("user", $userinfo, $expire);
    echo '<script type="text/javascript">
        window.location = "../index.php";
    </script>';

?>

【问题讨论】:

    标签: php cookies setcookie


    【解决方案1】:

    Tory,请确保在 PHP 中调用 set setcookie 之前不输出任何内容。甚至没有空白。没有回声。没有。我猜你的脚本会在 setcookie 之前输出一些东西,这会破坏你的脚本。您是否看到标头已发送错误?注释掉你的 JS 然后检查。你这样设置cookie

    setcookie(name,value,expire,path,domain,secure); 
    

    Domain 需要像example.com 这样的字符串中的域名值,它是可选的。 Secure 需要一个布尔值并且是可选的。跳过这两个并通过将路径设置为'/'来检查

    【讨论】:

    • 不,没有标头已发送错误。我的印象是,当我使用 javascript 来重定向而不是 header 函数时,不管我是否事先输出都没关系。另外,setcookieheader 一样挑剔吗?你确定我不能在setcookie之前输出任何东西吗?
    • 啊,路径在哪里?当您设置cookie时,您还指定了路径,从您的JS中,您似乎在a.com/folder/setcookie中设置cookie,如果您不指定路径,a.com/checkcookie可能无法使用,路径的默认值是当前工作目录,设置'/'(斜杠)的路径,然后检查
    • 知道了。如何设置 cookie 的路径?
    【解决方案2】:

    函数 setcookie 返回真或假,取决于 cookie 是否设置成功。你可以试试这个来测试:

    if(!setcookie("user", $userinfo, $expire)) {
        echo 'Could not set cookie!';
    }
    

    如果返回 false,那么 Kum​​ar 是对的。否则肯定有其他原因。

    EDIT setcookie 可以调用更多参数,像这样:

    setcookie(name,value,expire,path,domain,secure)
    

    注意路径和域值。过去我遇到过问题,两个不同的页面由于不同的路径/域而找不到彼此的 cookie。

    我注意到您重定向到“../index.php”。尝试重定向到“index.php”并查看 cookie 是否存在。如果是,那么您应该使用一个通用的“路径”变量来设置 cookie。

    来自http://www.php.net/setcookie关于“路径”变量:

    cookie 可用的服务器上的路径。如果设置为“/”,cookie 将在整个域中可用。如果设置为 '/foo/',cookie 将仅在 /foo/ 目录和域的 /foo/bar/ 等所有子目录中可用。默认值是设置 cookie 的当前目录。

    【讨论】:

    • Rauni 我觉得他在子文件夹中设置 cookie,然后在根目录下检查它,看看他重定向到的路径,它不是 ./ 而是 ../,所以这可能会导致问题
    • @Kumar 我怀疑这一点。如何在根目录下设置?
    • 使用/,它将被设置为root或使用domain.com作为路径,它应该适合你。看看我的评论
    • @Kumar So, setcookie("user", $userinfo, $expire, "/");?
    • 使用谷歌缓存结果:P
    【解决方案3】:

    可能是因为 $userinfo 是一个数组。它必须是一个字符串,要存储多个项目,您需要多个 cookie

    【讨论】:

    • 他正在将数组序列化为字符串。
    • @Johan 不,$userinfo = serialize($userinfo); 改为使用逗号分隔值,也就是字符串。
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多