我想我在这里犯了一个尴尬的错误,但我真的找不到它。我使用过浏览器开发工具,并密切关注每一步。这是代码,我希望在按下Restart链接后重置访问次数,但它只是不断递增:
//test.php:
<?php
if(isset($_COOKIE['visits']) && isset($_GET['restart'])){
if($_GET['restart']=='true') {
setcookie('visits',null,time()-24*3600*365,'/');
unset($_COOKIE['visits']);
header("Location: test.php");
exit;
}
}
if(!isset($_COOKIE['visits'])){
$visits = 1;
setcookie('visits',$visits,time()+24*3600*365);
echo "Welcome To This Website";
}
else{
$visits = $_COOKIE['visits']+1;
setcookie('visits',$visits,time()+24*3600*365);
echo "You've visited this website ".$_COOKIE['visits']. ' times before.<br>';
echo "<a href='?restart=true'>Restart</a><br>";
}
我现在最后想到的是,当使用重定向标题时,浏览器会在设置收到的Cookie之前执行重定向请求 ,我不确定虽然。否则,我无法想到任何可能导致此行为的事情。有人可以对此发表评论并说清楚吗?
答案 0 :(得分:1)
在您的代码中,它看起来像是已发送标头,并且在设置Cookie之前会重定向用户。您可以尝试output buffering并直接在echo ".";
行之前回显一个点header(...
,以确保在重定向之前与客户进行一些通信。
编辑:我对此处发生的事情的理解是同时发送Cookie和重定向标头,但在某些服务器/客户端组合中,重定向正在浏览器有机会设置之前发生饼干。将一些内容与标题一起推送到浏览器使其有机会处理cookie,但您必须在php.ini中启用输出缓冲,或者在标题设置之前和之后使用ob_start()
和ob_end_flush()
和回声。