由PHP $_COOKIE引起的一个疑惑到解惑

本文通过一个简单的PHP程序探讨了Cookie的工作原理。详细解释了$_COOKIE变量如何从HTTP请求头中获取值,以及setcookie()函数如何在服务器响应中设置Cookie。
 最近因为七七八八的原因想深入了解下cookie这东西,于是写了个简单的php程序想帮助理解,可写完了之后,发现了个问题,更加的困惑了,问题及code 如下:
code:
<?php
date_default_timezone_set("PRC");
if(!isset($_POST['email']))
{
?>
<html>
<title>
this is a cookie test page
</title>
<body>
<form method="post">
please type your email:<input type="text" name="email" value="<?php echo $_COOKIE['email']; ?>">
                       <input type="submit" name="submit" value='go ahead' >

</form>
</body>
</html>
<?php
}else
 {
if(!empty($_POST['email'])){
    setcookie("email",$_POST['email'],mktime()+86400,"/");
setcookie("lastsave",time(),mktime()+86400,"/");
var_dump($_COOKIE['email']);
}else{
echo 'email is empty,please type the email address in the textarea';
}
 }
?>
问题:
当第一次访问这个php的时候,即使我在name="email"的这个"text"里面输入了内容,例如123,点击 name="submit" value='go ahead' 的时候,发var_dump($_COOKIE['email'])打印出来的是NUll,另外,我再次输入将123改为456之后,点击 name="submit" value='go ahead' 的时候,发var_dump($_COOKIE['email'])打印出来的又是123,预期难道不该是456吗?难道是php $_COOKIE的bug 还是我自己用错了?


debug过程:
借助工具fiddler
第一次访问该php文件的时候,抓包的结果(Request)
Response Time抓包结果:
这个时候是没有做任何setcookie操作的,所以$_COOKIE['email']这个时候应该是null,但是为什么我输入了内容在text文本框中点击go ahead还是null呢?
继续抓包
输入123,Request包内容
Reponse 包内容
这里对Client(browser)做了setcookie的操作,但Request的http header中cookie仍然是null(因为在这之前没有谁对它set-cookie),而$_COOKIE获取的是Request http header中的cookie值,所以仍然为null
为了进一步验证,将123修改为456,再次提交(Request抓包内容,可以对比上面123的,多了cookie这个header域)
Respon抓包信息
所以预期应该是打印出123,实际页面打印效果
总结:
1、set-cookie动作的完成是在server返回的response header里面完成的
2、$_COOKIE是从Request_header里面获取cookie该头域的值

这个小问题总算解惑了,看来精髓都在细节里啊~顺手记录下来这次debug $_COOKIE的过程和理解,因个人能力有限,理解不对和不全的地方烦请多见谅和及时给予指正,谢谢
<think>好的,我需要帮助用户了解PHP$_COOKIE的使用方法和示例。首先,我得回忆一下PHP的超全局变量相关知识,特别是$_COOKIE的作用和用法。根据用户提供的引用内容,引用[4]提到$_COOKIE是自动化的全局变量,所有作用域都可用,不需要用global声明。这很重要,要强调它在脚本中的访问方式。 接下来,用户可能需要知道如何设置和读取cookie。根据示例中的PHP代码,设置cookie应该使用setcookie()函数,而读取则是通过$_COOKIE数组。需要区分清楚这两个步骤,避免混淆。 然后,引用[1]中的示例代码显示直接给$_COOKIE赋值可能有问题,因为超全局变量通常是只读的。正确的做法应该是用setcookie()函数来设置cookie,这样客户端浏览器才会保存,并在下次请求时发送回来。这一点需要特别指出,避免用户犯错。 还要考虑cookie的有效期、路径和域名等参数,这些在setcookie()中都是可选的,但常用参数需要解释清楚。比如设置过期时间,用户可能需要用time()函数加上秒数来指定。 另外,安全性的问题也不能忽视,比如HttpOnly和Secure标志,这些可以增强cookie的安全性,防止XSS攻击。引用[2]提到性能问题,虽然这里主要是关于$_ENV,但提醒用户合理使用cookie也是好的,比如不要存储敏感信息。 用户可能需要示例代码来具体理解如何操作。比如设置cookie的例子,读取的例子,以及删除cookie的方法。删除cookie通常是将过期时间设为过去的时间,同时确保路径和域名匹配。 最后,总结使用时的注意事项,比如作用域、浏览器限制、安全性等,这些都能帮助用户避免常见错误。要确保回答结构清晰,分步骤说明,并给出代码示例,这样用户能跟着操作。同时,根据用户提供的引用内容,适当标注引用来源,比如提到$_COOKIE是超全局变量时引用[4],提到直接赋值的问题时引用[1]。 现在需要把这些点组织成连贯的步骤,先解释$_COOKIE是什么,然后如何设置、读取、删除,再给出示例代码,最后注意事项。确保每个部分都有对应的代码示例和解释,同时引用相关的内容支持说明。这样用户就能全面了解$_COOKIE的使用方法和常见问题。</think>### PHP $_COOKIE 使用方法及示例 #### 1. $_COOKIE 的基本概念 `$_COOKIE` 是 PHP 的超全局变量,用于存储通过 HTTP Cookie 传递到当前脚本的数据[^4]。它是自动全局的,无需在函数或方法中使用 `global` 关键字即可访问。 #### 2. 设置 Cookie 需使用 `setcookie()` 函数,而非直接对 `$_COOKIE` 赋值(直接赋值仅影响当前脚本,不会持久化到浏览器)[^1]。 **语法**: ```php setcookie(name, value, expire, path, domain, secure, httponly); ``` **示例**: ```php // 设置名为 "user" 的 Cookie,有效期 1 小时 setcookie("user", "John", time() + 3600, "/"); ``` #### 3. 读取 Cookie 通过 `$_COOKIE` 数组访问已存储的 Cookie 值。 **示例**: ```php if (isset($_COOKIE["user"])) { echo "欢迎用户:" . $_COOKIE["user"]; // 输出:欢迎用户:John } ``` #### 4. 删除 Cookie 将过期时间设为过去的时间以删除 Cookie: ```php setcookie("user", "", time() - 3600, "/"); ``` #### 5. 完整示例 ```php // 设置 Cookie setcookie("theme", "dark", time() + 86400, "/", "example.com", true, true); // 读取 Cookie if (isset($_COOKIE["theme"])) { echo "当前主题:" . $_COOKIE["theme"]; } // 删除 Cookie setcookie("theme", "", time() - 3600, "/"); ``` #### 注意事项 1. **作用域限制**:Cookie 的路径(`path`)和域名(`domain`)需与设置时一致才能被正确访问[^4]。 2. **浏览器限制**:单个 Cookie 大小通常不超过 4KB,每个域名下 Cookie 数量有限(约 20-50 个)。 3. **安全性**:敏感数据应避免存储于 Cookie,建议启用 `Secure`(仅 HTTPS 传输)和 `HttpOnly`(禁止 JS 访问)标志[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值