使用 PHP 创建和操作 Cookie

Creating and Manipulating Cookies Using PHP

我正在研究一个涉及创建初始 cookie (nag) 的迷你项目,该 cookie 跟踪用户访问该页面的次数,每五次,它会提示用户通过显示注册表单进行注册。如果他们决定跳过它,计数器会重置并重新开始。但是,如果用户决定注册,我需要做的就是删除 nag cookie,并用一个包含用户名和一个用于电子邮件的 cookie 替换它。因此,当用户返回网页时,它会显示一条类似 Hello Name (Email) 的消息,而不是计数器和表格。

我设法让 nag cookie 工作,但是当用户将数据输入表单并注册时,nag cookie 会重新开始而不是被删除,它不会显示 Hello 部分,而是继续计数器。它还为我提供了 Chrome 上的 Confirm Form Resubmission 面板。我不知道为什么。

<?php
    if(isset($_POST['submit'])){
   setcookie("register", 1);
   $_COOKIE['register'] = 1;
   setcookie("username", $_POST['username']);
   $_COOKIE['username'] = $_POST['username'];
   setcookie("email", $_POST['email']);
   $_COOKIE['email'] = $_POST['email'];
   setcookie("nag","", time()-3600); 
   $_COOKIE['nag'] = time()-3600;
}

    if(isset($_COOKIE['register'])){
        $user = $_COOKIE['username'];
        $email = $_COOKIE['email'];
    }else{
        if(isset($_COOKIE['nag'])) {
                $_COOKIE['nag']--;
            setcookie("nag", $_COOKIE['nag']);
        }else{
            setcookie("nag", 5);
        }
    }
?>

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Lab 5</title>
</head>
<body>
    <?php 
        if(isset($_COOKIE['register'])){
            echo "<p>Welcome back $user ($email)</p>";
        }else{
            echo $_COOKIE['nag'];
            if($_COOKIE['nag'] == "0"){
                setcookie("nag", 5);
                echo "<br>Please Register, otherwise continue refreshing.";
                echo"<form action='$_SELF' method='POST'>";
                echo "Username: <input type='text' name='username' value=''<br><br>Email: <input type='text' name='email' value=''<br><br> <input type='submit' name='submit' value='Register'>";
                echo "</form>";
            }
        }
    ?>
    <p>Hello</p>
</body>
</html>

刷新页面将重新提交以前的表单数据(因此 chrome 中的消息),这将再次触发您的 isset($_POST['submit'])。您可以在成功提交表单后使用重定向来解决此问题。示例:

if (isset($_POST['submit'])) {
    setcookie("register", 1);
    setcookie("username", $_POST['username']);
    setcookie("email", $_POST['email']);
    setcookie("nag", "", time() - 3600);
    header('Location: index.php');
    exit;
}
...

setcookie() 仅影响发送到客户端的 HTTP cookie header,新的 cookie 值将在下一个请求的 PHP 中可见。

$_COOKIE 变量在 Web 服务器从客户端收到的 cookie header 收到的每个请求的开头填充。

这意味着 setcookie() 不会更新 $_COOKIE

您需要像这样更改 cookie 更改代码:

if(isset($_POST['submit'])){
    setcookie("register", 1);
    $_COOKIE['register'] = 1;
    setcookie("username", $_POST['username']);
    $_COOKIE['username'] = $_POST['username'];
    setcookie("email", $_POST['email']);
    $_COOKIE['email'] = $_POST['email'];
    setcookie("nag","", time()-3600); 
    $_COOKIE['nag'] = time()-3600);
}

因此,如果您在处理请求时修改了 cookie 数据,并且想在同一个请求中访问更新后的数据,请记得将更改也应用到 $_COOKIE 变量。