我正在制作一个简单的Cookie通知,该通知仅在首次访问时出现,但仅在30天后才会显示。
我遇到的问题是设置整个域的cookie的页面一旦我转到另一个页面然后再返回就会收到通知,除非我进行硬刷新(CTRL + F5)通知就不会消失。
在我的header.php中,我有:
$value = 'first_visit';
setcookie("visitor", $value);
setcookie("visitor", $value, time()+604800);
setcookie("visitor", $value, time()+604800, "/", ".example.com");
if(isset($_COOKIE['visitor']) && ($_COOKIE['visitor'] == true)){
// do nothing
} else {
echo '<div id="cookie">By continuing to use our Site, you are agreeing to the placement of cookies on your computer by us and our third party service providers.</div>';
}
所以代码的想法是用户访问网站然后页面触发了cookie的创建,这个cookie的值并不重要,因为代码只会检查一个是否存在,第一次访问者访问该网站,它不存在,因此他们回应其他人,去我刚访问的页面以外的其他页面按预期// nothing
但是如果我回到触发创建的页面,它仍然否则,除非我刷新硬页面。
我也尝试过:
<?php
if(isset($_COOKIE['visitor']) && ($_COOKIE['visitor'] == true)){
// DO NOTHING
} else {
$value = 'first_visit';
setcookie("visitor", $value, time()+604800, "/");
echo '<div id="cookie">By continuing to use our Site, you are agreeing to the placement of cookies on your computer by us and our third party service providers</div>';
}
?>
答案 0 :(得分:0)
我认为您的代码没有任何问题 - 即它根据代码按预期工作。我只是不认为你看到代码实际上在做什么。您说cookie最终已设置,但您在页面上设置cookie,继续,然后使用后退按钮并再次访问包含该消息的页面。这可能是浏览器缓存,并且可能已经确认,因为您说硬刷新修复此问题。
你做这一切的方式似乎很奇怪。我可以从您的问题和代码中获得所有内容:
您可以避免浏览器为您解决此问题的唯一方法是在设置cookie后进行重定向(例如$_SERVER['PHP_SELF']
)。但是你不能使用同一个文件来显示消息,然后就会设置cookie。
你应该重新考虑这一点,并以不同的方式处理整个事情,但就目前而言,使用你提供的代码,我可以建议设置一个会话。
的header.php
session_start();
if (!isset($_COOKIE['visitor']) || ($_COOKIE['visitor'] != true)) {
$value = 'first_visit';
setcookie("visitor", $value, time() + 604800, "/", ".example.com");
$SESSION['displayMessage'] = true;
} else {
if (isset($SESSION['displayMessage'])) {
unset($SESSION['displayMessage']);
}
}
if (isset($SESSION['displayMessage'])) {
echo '<div id="cookie">By continuing to use our Site, you are agreeing to the placement of cookies on your computer by us and our third party service providers.</div>';
}
在第一次访问时,不会设置cookie,因此设置了会话并设置了会话,因为会话已设置,它将显示消息。然后在任何其他页面加载时,如果设置了cookie,ELSE将启动并且会话未被设置,因此不显示该消息。
(我恢复了你的cookie检查,所以你没有那么可怕的无意义// do nothing
;)
上面的代码非常笨重,我哭了一下写了一下。我再次建议你退后一步,重新思考如何处理所有这些,使其更加强大。将您的需求分离到不同的文件中,更好地使用函数,然后根据所设置的其他内容在需要时调用它们:)