PHP Cookie在会话结束时被删除

时间:2016-08-11 14:09:00

标签: php session firefox cookies session-cookies

使用页面设置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并不是问题所在。这很好。

2 个答案:

答案 0 :(得分:0)

永远不会设置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>  

答案 1 :(得分:0)

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

<!DOCTYPE html>

之前移动您的Cookie设置

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

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

来自the PHP manual

  

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