【问题标题】:PHP Cookie gets removed on session endPHP Cookie 在会话结束时被删除
【发布时间】:2016-08-11 23:14:01
【问题描述】:

在页面上设置 cookie 是可行的,但是一旦我离开页面,cookie 就会被删除。浏览器设置设置为保留 cookie,仅使用此 php 代码的其他网站不会出现此问题:

<!DOCTYPE html>

<html>
<title>Authentication cookie</title>
<body>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Authentication code: <input type="text" name="authcode" value="<?php echo $_GET["authcode"]; ?>">
<input type="submit" name="submit" value="Submit">
</form><br>



<?php
$cookie_name = "authpi";
$cookie_value = $_POST["authcode"];
setcookie($cookie_name, $cookie_value, time() + (10 * 365 * 24 * 60 * 60), '/', '10.0.0.2'); // 86400 = 1 day

 ?>


<?php
if(!isset($_COOKIE["authpi"])) {
     echo "Authentication Cookie named '" . $cookie_name . "' is not set!";
        #//header("Location: http://www.google.at/");
} else {
     echo "Authentication Cookie '" . $cookie_name . "' is set!<br>";
     echo "Your authentication code is: " . $_COOKIE[$cookie_name];
}
?>

 <p><strong>Note:</strong> After setting the Cookie reload the page to make sure it works!</p>
 </body>
</html>

为什么离开页面后cookie会被移除?

PS:创建 cookie 不是问题。效果很好。

【问题讨论】:

  • 浏览器离开页面后如何检查cookie是否存在?你的意思是离开去另一个域,还是离开页面但留在你的域上?
  • 转到另一个域并再次访问该页面说 cookie 不存在。离开页面并转到同一域上的另一个页面,然后返回还说 cookie 不存在
  • 听起来像是我帖子中的第 1 期。你说创建cookie不是问题。您如何确定 cookie 开始时已正确设置?

标签: php session firefox cookies session-cookies


【解决方案1】:

永远不会设置 cookie。

您正尝试在发送标头后设置 cookie。如果你想这样做,你需要使用输出缓冲区,这意味着你必须使用ob_start(); 才能将任何标题发送到浏览器。

更多关于ob_start();Output Buffers PHP

简单说明:该代码.. 是一团糟。

您的代码的工作示例(仍然很乱,因为它是快速编码)

<?php

    $cookie_name = "authpi";

    if( isset($_POST['submit']) ) {
        $cookie_value = $_POST["authcode"];
        $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;

        setcookie($cookie_name, $cookie_value, time() + (10 * 365 * 24 * 60 * 60 * 60), '/', $domain); // 86400 = 1 day
    }
    if(!isset($_COOKIE["authpi"])) {
        echo "Authentication Cookie named '" . $cookie_name . "' is not set!";
    } else {
        echo "Authentication Cookie '" . $cookie_name . "' is set!<br>";
        echo "Your authentication code is: " . $_COOKIE[$cookie_name];
    }


?>

<!DOCTYPE html>

<html>
    <head>
        <title>Authentication cookie</title>
    </head>
    <body>

        <form method="post" action="<?=$_SERVER['PHP_SELF']?>">

            Authentication code: <input type="text" name="authcode" value="<?php echo $_GET["authcode"]; ?>">
            <input type="submit" name="submit" value="Submit">
        </form>

        <br>

        <p><strong>Note:</strong> After setting the Cookie reload the page to make sure it works!</p>
    </body>
</html>  

【讨论】:

  • 也许我错了,但我认为这样做(你的)方式不会将用户表单输入设置为 cookie 值?
  • PS:我知道我的代码确实很乱,但这只是家庭自动化系统的一个小解决方法,因此网络上的任何人都无法控制东西。
  • @cr78 是的,它确实将 cookie 设置为用户输入的值。该页面在表单提交后设置POST数据,并将其重定向到本身的action。然后,使用POST 数据。
  • 你说cookie永远不会被设置。如果在页面上的 html 表单中输入内容并按提交,则设置 cookie。如果我重新加载页面,cookie 也会被 php 代码识别,并且它会回显它找到了 cookie。 cookie 也存在于浏览器中(firefox 删除 cookie 菜单显示 cookie)。问题如下:如果我离开设置 cookie 的页面,cookie 将从浏览器中删除。就像会话结束一样,但所有其他网站的 cookie 都没有显示此问题。
  • @cr78 我没有不尊重的意思!您需要阅读有关表单提交和标题的更多信息。如果不激活output buffering,就无法设置您的 cookie。此外,用户在输入中键入的值仅在提交表单并重定向到action 目的地后才能使用。在 te action 目的地,您可以使用 $_POST 安全地检索数据,但在大多数情况下,即使不推荐使用 $_GET,您也可以这样做。
【解决方案2】:

在您已经将内容发送到浏览器之后,您不能使用 setcookie() 或任何其他更改 http 标头的函数。在包含这些功能的代码块的开头&lt;?php 之前不能有任何东西(甚至没有空格)(除非您启用了输出缓冲)。

将您的 cookie 设置移到 &lt;!DOCTYPE html&gt; 之前

如果您只想在用户在表单上提交身份验证代码后设置 cookie,正确的代码(仍然位于所有 HTML 之前)如下所示:

if(isset($_POST['submit'],$_POST['authcode'])){
    //set your cookie here
}

来自the PHP manual

与其他标头一样,Cookie 必须在您的任何输出之前发送 脚本。这需要您放置 在任何输出之前调用此函数,包括和 标签以及任何空格。

【讨论】:

  • 1.如果我在代码的开头设置 cookie,那么在用户输入 auth-code 之前,整个事情就会失去它的目的,因为用户输入的 authcode 是重要的。使用上述代码设置 cookie 仍然可以正常工作。 2. authcode 不是来自 url,它来自用户输入的 html 表单。 3. 所有这些都不能解决问题!问题是 cookie 在离开页面后在 firefox 中消失了,尽管 cookie 的生命周期足够长。
  • @cr78 你搞错了 cookie 设置事件的时间。如果您的 cookie 设置成功,它仍然在用户看到表单之前被设置,无论 setcookie() 在代码中的哪个位置。正如我所写,这是一个标题设置功能,这意味着它总是发生在浏览器甚至下载页面之前。我已经更新了我的答案。
  • 我想我明白了......所以你的意思是 cookie 是在页面加载时(或之前)设置的,并且在用户在表单中输入想要的值后值会发生变化?
  • @cr78 从根本上说,PHP 代码执行和 html/javascript 执行永远不会重叠。所有 PHP 都发生在浏览器参与之前。 setcookie 要求浏览器在最终下载页面时设置 cookie。 cookie 设置本身是在页面离开服务器后完成的,因此 PHP 无法根据用户输入动态更改此值。发生的情况是,在下一个 http 请求(页面重新加载、表单提交等)时,PHP 可以看到用户的输入并询问浏览器,当它稍后收到来自服务器的响应时,将 cookie 设置为不同的值.
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多