两段PHP Cookie代码逻辑差异解析:为何Block1未达预期?
先看两段代码:
Block 1
<?php setcookie("test_cookie","0",time()-3600); if(empty($_COOKIE["test_cookie"])){ echo "First time browsing"; setcookie("test_cookie","1",time()+3600); }else{ $count = $_COOKIE['test_cookie']; $count++; setcookie("test_cookie",$count,time()+3600); echo "Cookie set as " . $_COOKIE["test_cookie"] ; }
Block 2
<?php if(empty($_COOKIE["test_cookie"])){ echo "First time browsing"; setcookie("test_cookie","1",time()+3600); }else{ $count = $_COOKIE['test_cookie']; $count++; setcookie("test_cookie",$count,time()+3600); echo "Cookie set as " . $_COOKIE["test_cookie"] ; } setcookie("test_cookie","0",time()-3600);
核心原因:Cookie的读写时机差
这里的关键要搞懂PHP里$_COOKIE和setcookie()的本质:
$_COOKIE是读取当前请求从浏览器带过来的Cookie值,也就是上一次请求结束时浏览器保存的内容,本次请求里的setcookie()操作不会立刻改变它。setcookie()是往HTTP响应头里添加设置/删除Cookie的指令,只有当浏览器收到响应后,才会修改本地保存的Cookie,下一次请求时才会把新的Cookie带过来。
对Block 1的分析
你开头调用setcookie("test_cookie","0",time()-3600)是告诉浏览器“删掉这个Cookie”,但这是给响应头的指令,当前请求的$_COOKIE["test_cookie"]还是上一次访问留下的计数数值,所以empty()判断为false,直接走进else分支输出旧的计数,之后的setcookie操作要等下一次请求才会生效。
对Block 2的分析
你先判断$_COOKIE["test_cookie"]——第一次访问时浏览器没带这个Cookie,所以empty()为true,直接输出“First time browsing”,然后设置Cookie的指令和末尾删除Cookie的指令都放进响应头,浏览器收到后会先设置再立刻删掉这个Cookie,但本次输出已经完成了,所以结果符合预期。
内容的提问来源于stack exchange,提问作者designerdarpan
相关产品推荐
相关产品推荐

