PHP if (isset ($ _ COOKIE ['visitor']) не работает с обновлениями страницы - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над простым уведомлением о файлах 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 голосов
/ 16 мая 2018

Я не думаю, что с вашим кодом что-то не так - то есть он работает, как и ожидалось, основываясь на коде. Я просто не думаю, что вы видите, что на самом деле делает код. Вы говорите, что файл 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;))

Приведенный выше код очень неуклюжий, и я немного заплакал, когда писал его. Опять же, я советую вам сделать шаг назад и переосмыслить, как вы справляетесь со всем этим, чтобы сделать его более надежным. Разделяйте ваши требования по разным файлам, лучше используйте функции, а затем вызывайте вещи так, как и когда они вам нужны, на основе других устанавливаемых вещей:)

...