【问题标题】:PHP – setcookie() not workingPHP – setcookie() 不工作
【发布时间】:2016-01-09 10:34:06
【问题描述】:

如果您选中一个复选框,我有一个设置 cookie 并回显字符串的页面。字符串打印正确,但 cookie 从未设置,我不知道为什么。

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<label for="checkbox">Option 1:</label>
<input type="checkbox" name="checkbox" id="checkbox"><br>
<input type="submit" name="submit" value="Submit">
</form>
  <?php
if (isset($_POST['checkbox'])) {
  setcookie("cookie", "on", time()+3600*24);
  echo "You checked the checkbox and a cookie was set with a value of:<br>";
}
else {
  setcookie("cookie", "off", time()+3600*24);
  echo "You didn't check the checkbox and a cookie was set with a value of:<br>";
}
echo $_COOKIE['cookie'];
  ?>

有谁知道为什么上面的代码不起作用?

【问题讨论】:

    标签: php cookies


    【解决方案1】:

    PHP 超全局变量在脚本启动时填充,然后在脚本的生命周期内不再被 PHP 修改或触及。这意味着$_COOKIE 表示在触发脚本的 http 请求中发送到服务器的 cookie。它不会显示您在脚本生命周期中添加/更改/删除的任何 cookie。这些更改只会在 NEXT 请求中显示。

    唯一的例外是$_SESSION,它在您调用session_start() 时填充。

    如果您需要立即将这些值包含在 $_COOKIE 中,则必须手动添加它们,例如

    setcookie('cookie', $value, ....);
    $_COOKIE['cookie'] = $value;
    

    【讨论】:

      【解决方案2】:

      根据http://php.net/manual/en/function.setcookie.php 的 PHP 手册:

      如果在调用此函数之前存在输出,setcookie() 将失败 并返回 FALSE。如果 setcookie() 成功运行,它将返回 正确。这并不表示用户是否接受了 cookie。

      换句话说,函数setcookie() 不起作用,因为它位于页面内部。如果你想让它工作,你需要把这个函数放在页面之前,特别是在任何标题之前。

      这样做:

      <?php
        if ( isset($_POST['checkbox']) ) {
           setcookie("cookie", "on", time()+3600*24);
           echo "You checked the checkbox and a cookie was set with a value of:<br>";
        } else {
           setcookie("cookie", "off", time()+3600*24);
           echo "You didn't check the checkbox and a cookie was set with a value of:<br>";
        }
      
        echo $_COOKIE['cookie'];
      ?>
      <!doctype html>
      <html>
        <head>...</head>
        <body>
            <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
               <label for="checkbox">Option 1:</label>
               <input type="checkbox" name="checkbox" id="checkbox"><br>
               <input type="submit" name="submit" value="Submit">
            </form>
        </body>
      </html>
      

      【讨论】:

      • 这是正确答案。 Tim 提出的问题是“设置 cookie 不起作用”,而不是“无法访问 $_COOKIE 值”:Tim 给出的代码仍然无法使用“$_COOKIE['cookie'] = $value;”技巧建议马克 B.
      【解决方案3】:

      Cookie 在设置好并发送新的页面请求后才会生效。这是因为 cookie 是与页面请求一起发送的,它们不会神奇地出现在服务器上。

      您的解决方案是在设置 cookie 后进行页面刷新。

      // set cookie
      setcookie("cookie", "off", time()+3600*24);
      // not available because this cookie was not sent with the page request.
      echo $_COOKIE['cookie'];
      

      【讨论】:

      • 设置cookie后如何刷新页面?我不认为页面刷新可以用 php 完成...我会使用 header 重定向到同一页面还是使用 javascript?
      • 您将使用header(),因为您将从服务器进行重定向。
      猜你喜欢
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多