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