【问题标题】:Understanding Cookies in PHP了解 PHP 中的 Cookie
【发布时间】:2012-01-01 18:18:40
【问题描述】:

以下代码第一次运行时,它没有回显“var1”值,但在浏览器刷新 (f5) 时会回显,为什么?据我了解,当浏览器将代码发送到服务器时,setcookie() 将 cookie 变量(“var1”)存储到本地文件中的客户端(浏览器),并通过 $_COOKIE superglobal 将“var1”值放在全局域中.

既然“var1”值在第一个服务器回复浏览器的初始请求后立即在 $_COOKIE 中可用,那么为什么“var1”没有回显出来。是否 setcookie() 在第一次请求时将“var1”值存储在客户端浏览器中,并且只有在刷新页面(第二次请求)时,浏览器才会将“var1”值发送回服务器,然后服务器使其在全局域中可用通过 $_COOKIE 函数。


代码

<?php
  setcookie("var1","5");
  echo $_COOKIE['var1'];
?>

请帮我解决这个问题。

谢谢 杰恩。

【问题讨论】:

标签: php


【解决方案1】:

这一切都在手册中进行了解释。 setcookie() 导致将 Set-Cookie: 响应标头返回给浏览器。只有当浏览器有机会回复Cookie: 请求标头时,$_COOKIE 数组才能填充下一次 HTTP 刷新。

以下代码第一次运行时,没有回显“var1”值,但在浏览器刷新(f5)时会回显,为什么?

浏览器需要发回 cookie。在第一个请求中,它还不知道该 cookie。刷新后就可以了。只有这样它才能发送。

据我了解,当浏览器将代码发送到服务器时,

关于第二个请求。

setcookie() 将 cookie 变量(“var1”)存储到本地文件中的客户端(浏览器)

浏览器保存它。

并通过 $_COOKIE superglobal 将“var1”值放入全局域中。

不是马上。

既然“var1”值在第一台服务器回复浏览器的初始请求后立即在 $_COOKIE 中可用,那么为什么“var1”没有回显。

它不是立即在 $_COOKIE 中。不可能。该数组仅在 PHP 启动时填充一次。

setcookie() 是否在第一次请求时将“var1”值存储在客户端浏览器中,并且仅当页面刷新(第二次请求)时,浏览器才会将“var1”值发送回服务器,然后服务器使其可用通过 $_COOKIE 函数获取全局域。

是的。这就是它的工作原理。

【讨论】:

  • 是的,不知道刚刚发生了什么^^。
【解决方案2】:

调用setcookie 时,PHP 设置一个HTTP Cookie 标头,该标头与脚本的其余输出一起传送到客户端。客户端(浏览器)然后会将此 cookie 存储在其 cookie 存储中,并在后续请求时将其发送回服务器。

$_COOKIE 包含客户端当前请求中已收到的所有 cookie。第一次是nothing,因为客户端还没有收到Cookie 标头。只有在后续请求中,客户端才会发送存储在$_COOKIE 中的 cookie。 setcookie() 不填充 $_COOKIE 变量。

      Client       Server

1.            -->  $_COOKIE is empty

2.           Cookie
      store   <--  setcookie()

3.           Cookie
       send   -->  $_COOKIE is set

【讨论】:

    【解决方案3】:

    我相信这与 $_COOKIE 的填充方式有关。根据参考资料,它来自客户端发送的任何 cookie。当您对页面发出请求时,cookie 会在 HTTP 标头中发送,因此它只在第二次工作时才有意义。第一次,您正在设置 cookie(客户端还不知道它与第一个请求一起发送)。当您刷新时,cookie 已在第一个页面加载时设置,因此客户端会随请求一起发送 cookie,PHP 会看到该请求并将其填充到 $_COOKIE 变量中。

    http://php.net/manual/en/features.cookies.php

    【讨论】:

      【解决方案4】:

      Cookie 存储在响应中并根据请求从用户加载,例如 get 标头或 post 标头。

      您的 http 响应不会触发 http 请求。(这是完全正常的)

      setcookie()
      

      通过发送 cookie 标头在客户端设置 cookie,而不是在服务器上。 $_COOKIE 由来自 http 请求的 cookie 标头设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        • 2015-03-16
        • 1970-01-01
        • 2017-03-24
        • 2013-09-27
        相关资源
        最近更新 更多