PHP if(isset($ _ COOKIE ['visitor'])不使用页面刷新

时间:2018-05-15 23:22:49

标签: php if-statement setcookie

我正在制作一个简单的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>';
}
?>

1 个答案:

答案 0 :(得分:0)

我认为您的代码没有任何问题 - 即它根据代码按预期工作。我只是不认为你看到代码实际上在做什么。您说cookie最终已设置,但您在页面上设置cookie,继续,然后使用后退按钮并再次访问包含该消息的页面。这可能是浏览器缓存,并且可能已经确认,因为您说硬刷新修复此问题。

你做这一切的方式似乎很奇怪。我可以从您的问题和代码中获得所有内容:

  • 首次访问 - 用户看到消息并设置了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;)

上面的代码非常笨重,我哭了一下写了一下。我再次建议你退后一步,重新思考如何处理所有这些,使其更加强大。将您的需求分离到不同的文件中,更好地使用函数,然后根据所设置的其他内容在需要时调用它们:)