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

本文通过一个简单的PHP程序探讨了Cookie的工作原理。详细解释了$_COOKIE变量如何从HTTP请求头中获取值,以及setcookie()函数如何在服务器响应中设置Cookie。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近因为七七八八的原因想深入了解下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的过程和理解,因个人能力有限,理解不对和不全的地方烦请多见谅和及时给予指正,谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值