Удалить куки


260

Когда я хочу удалить Cookie, я пытаюсь

unset($_COOKIE['hello']);

В браузере файлов cookie от Firefox я вижу, что файл cookie все еще существует. Как я могу действительно удалить куки?


Вы можете найти $cookie->delete()из github.com/delight-im/PHP-Cookie полезного. Код из вопроса просто удаляет свойство, которое было проанализировано на стороне сервера. Cookie все еще будет храниться на стороне клиента.
caw

Ответы:


280

Вы можете попробовать это

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}

141
Я понимаю, что это пример, но, пожалуйста, никогда не храните имя пользователя или пароль в файлах cookie.
Тамасд

3
Это бессмысленно unset($_COOKIE['Hello']);. Это ничего не изменит, если вы удалите его.
машинный приговор

30
@machineaddict unset($_COOKIE['Hello']);действительно важен, если вы можете проверить cookie где-нибудь позже в коде.
Андреас Халтгрен

4
работает нормально, но при попытке перезагрузить страницу. он видел набор файлов cookie со старыми данными, почему?
Нилеш Патель

9
======= НЕ РАБОТАЕТ В ХРОМЕ ======= Я попробовал этот код сегодня, и когда я захожу на сайт с помощью Google Chrome, а затем захожу в инструменты разработчика в Chrome, я вижу, что время истечения устанавливается на 1 секунду до начала эпохи (например, 1969-12-31 23:59:59), однако, когда я в следующий раз отправляю страницу, файл cookie отправляется на сервер. Когда я изменил -1 на 1 (например, 1970-01-01 00:00:01), чтобы дать следующую команду: setcookie ('Hello', null, 1, '/'); Затем Chrome действовал, как и ожидалось, и не отправил печенье
Питер Хиндс

284

Установите значение «» и дату истечения срока до вчерашнего дня (или любую дату в прошлом)

setcookie("hello", "", time()-3600);

Тогда срок действия файла cookie истечет при следующей загрузке страницы.


10
Как насчет установки времени на 0 (эпоха)? =]
Страгер

12
Если вы поставили дату слишком далеко в прошлом, IE будет ее лаять и игнорировать, то есть значение не будет удалено.
Julien

52
@strager В руководстве говорится: Если установлено значение 0 или не указано, срок действия файла cookie истекает в конце сеанса (когда браузер закрывается). Это не совсем удаление куки. Я действительно не знаю, будет ли IE делать то, что сказал Жюльен, но более чем возможно, что IE сделает что-то странное.
Яннис

31
Кроме того, не забудьте также сбросить ($ _ COOKIE ["hello"]), потому что если на остальной части страницы есть код, который смотрит на $ _COOKIE ["hello"], он все равно найдет его установленным. Я только что получил немного от этого.
Магматик

12
Кроме того, неплохо было бы установить путь, поэтому setcookie ('hello', '', time () - 3600, '/');
Стефан Вайнхолд,

227

Чистый способ удалить cookie - это очистить как $_COOKIEфайл cookie, так и файл cookie браузера:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}

3
Это лучший способ, потому что вам не нужно обновлять страницу!
MaxV

19
Я продолжаю спускаться по странице, и ответы становятся все лучше, смешно. Но это лучший, перестань искать здесь.
Эндрю

23
К вашему сведению, если вы установили файл cookie, используя путь, вам нужно будет также включить путь и в этот setcookieвызов:setcookie('key', '', time() - 3600, '/');
Гэвин

1
@Gavin Спасибо за этот совет. Я задавался вопросом, почему это не удаляло, но было unsettingуспешно.
stinkysGTI

1
Для любого, кто проверяет существование куки и заботится о куки, которые существуют со nullзначениями, вам нужно будет использовать array_key_exists () , поскольку куки со nullзначением не будут найдены isset()проверкой.
Лейт

27

Чтобы надежно удалить cookie-файл, недостаточно установить срок его действия в любое время в прошлом, как рассчитывает ваш PHP-сервер. Это связано с тем, что на клиентских компьютерах время от времени может отличаться от времени вашего сервера.

Рекомендуется перезаписать текущий файл cookie пустым файлом cookie, срок действия которого истекает через одну секунду в будущем после эпохи (1 января 1970 года, 00:00:00 UTC), например:

setcookie("hello", "", 1);

13
Поправьте меня, если я ошибаюсь, но если установить значение «1», это будет секунда после эпохи, а не одна секунда в будущем ..? Я полагаю, что вы правы относительно различий в часовых поясах, поэтому лучшим решением было бы установить его на 2 дня в прошлом (чтобы даже самый дальний часовой пояс все равно сбрасывал cookie).
PaulSkinner

@PaulSkinner дата эпохи не зависит от часовых поясов, компьютер делает это за вас.
AlexR

3
@AlexR Да. Хотя на самом деле не отвечает на мой вопрос. В моем понимании, приведенный выше код делает установить куки , чтобы истекать в прошлом (один второй прошлое эпохи), если я не ошибаюсь.
PaulSkinner

@PaulSkinner, конечно, остальная часть вашего комментария в порядке.
AlexR

9
+1 за «1». Я не понимаю, почему все остальные так зациклены на установке удаленного cookie ровно через час.
Мейснер

20

Это приведет к удалению cookie в вашем коде, но, поскольку переменная $ _COOKIE обновляется при каждом запросе, он просто возвращается при запросе следующей страницы.

Чтобы на самом деле избавиться от куки, установите дату истечения срока действия в прошлом:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);

1
Нет ли необходимости unset()в печенье?
Пратик

2
@PratikCJoshi Только если ваш код ищет его позже.
AlphaMycelium

14

У меня была та же проблема в моем коде, и я обнаружил, что это проблема с файлами cookie. Проверьте этот пост переполнения стека: Не могу удалить php set cookie

Я установил cookie, используя значение пути "/", но у меня не было никакого значения пути, когда я пытался его очистить, поэтому он не был очищен. Итак, вот пример того, что сработало:

Установка куки:

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);

Очистка куки:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

Надеюсь, это поможет.



7

Смотрите пример с пометкой « Пример # 2 пример удаления setcookie () » из документации PHP. Чтобы удалить cookie из браузера, необходимо сообщить браузеру, что срок действия файла cookie истек ... браузер затем удалит его. unsetпоскольку вы использовали его, он просто удаляет «привет» cookie из массива COOKIE.


7

Вот как работает PHP v7 setcookie ():

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

Исходя из вывода tcpdump во время прослушивания порта 80, сервер отправляет клиенту (браузеру) следующие заголовки HTTP:

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

Наблюдая за пакетами в следующих запросах, браузер больше не отправляет эти куки в заголовках


4

Чтобы удалить cookie, вам просто нужно установить значение NULL:

«Если вы установили файл cookie со значениями, отличными от значений по умолчанию, в течение срока действия, пути или домена, вы должны снова указать эти же значения при удалении файла cookie, чтобы файл cookie был удален должным образом». Цитата из книги "Изучение PHP5".

Так что этот код должен работать (работает для меня):

Установка куки: setcookie('foo', 'bar', time() + 60 * 5);

Удаление куки: setcookie('foo', '', time() + 60 * 5);

Но я заметил, что все устанавливают дату истечения срока годности, это необходимо и почему?


1
Это надежно, вот почему. Комбинация установки значения в ничто и времени в прошлом (но не слишком далеко, поскольку IE иногда не нравится это слишком далеко от того, что я прочитал) работает по всем направлениям.
PaulSkinner

Пустая строка ''- это не то же самое, что null.
Орев

3

Чтобы удалить все куки, вы можете написать:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}

3
Это на самом деле не удалит куки, если они не имеют те же настройки пути и домена, что и настройки по умолчанию для setcookie.
Noishe

2

Просто установите дату окончания срока действия на один час назад, если вы хотите «удалить» cookie, например так:

setcookie ("TestCookie", "", time() - 3600);

или

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

Источник: http://www.php.net/manual/en/function.setcookie.php

Вы должны использовать эту filter_input()функцию для всех глобальных переменных, которые посетитель может вводить / манипулировать, например:

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

Вы можете прочитать больше об этом здесь: http://www.php.net/manual/en/function.filter-input.php и здесь: http://www.w3schools.com/php/func_filter_input.asp


2

Я знаю, что прошло много времени с тех пор, как эта тема была создана, но я видел небольшую ошибку в этом решении (я могу назвать это так, потому что это деталь). Я согласен, что лучшее решение, вероятно, это решение:

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

Но в данном случае вы удаляете файлы cookie в каждом случае, когда работает функция отмены установки, и сразу же создаете новые файлы cookie с истекшим сроком действия в случае, если функция отмены не работает.

Это означает, что даже если функция unset работает, на компьютере все равно будет 2 куки. Запрашиваемая цель, с логической точки зрения, состоит в том, чтобы удалить куки, если это возможно, и если это действительно так, сделать так, чтобы срок их действия истек; чтобы получить «самый чистый» результат.

Итак, я думаю, что нам лучше сделать:

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

Спасибо, и хорошего дня :)


Функция unset предназначена для логики PHP (если вы хотите использовать переменную $ _COOKIE ['Hello'], вы не можете, поскольку она не установлена). А функция setcookie предназначена для навигатора. 2 различных целей, порядок функций не влияет на фактический код.
Kalzem

На самом деле, я знаю, что да, но если вы абсолютно хотите быть уверены, что cookie был сброшен / удален, и поэтому вы используете два решения прямо, было бы чище, прежде чем истечет срок действия тезисов, а затем сбросить тезисы, чем сбросить тезисы и затем воссоздайте просроченный файл cookie ... если вы понимаете, о чем я?
Грег

Да, извините, что отвечаю только сейчас :) Я отправил это, потому что я видел, как люди делают это по-другому ... но я думаю, что это кажется более умным, как это.
Грег

2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.

2

Если вы хотите полностью удалить куки со всего вашего текущего домена, то следующий код определенно вам поможет.

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

Этот код полностью удалит переменную cookie со всего вашего домена, т.е. «/» - это значение переменной cookie, установленное для всего домена, а не только для текущего домена или пути. time () - 300 означает, что он устанавливает предыдущее время, поэтому срок его действия истекает.

Вот как это отлично удалено.


1

Вы можете установить переменную сеанса на основе значений cookie

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");

1

Вы можете просто использовать эту функцию настройки:

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

Если вы хотите удалить $ _COOKIE ['user_account'].
Просто используйте:

unset_cookie('user_account');

1

Это просто!

setcookie("cookiename", "cookievalue", 1);

Не нужно устанавливать значение для удаления куки!
Амир Фо

1

Когда вы вводите 0время, вы имеете в виду «сейчас» (+ 0 с сейчас - сейчас) для браузера, и он удаляет куки.

setcookie("key", NULL, 0, "/");

Я проверил это в браузере Chrome, который дает мне:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM

Нет. Просто прочитайте документы. «Если установлено значение 0 или опущено, срок действия файла cookie истекает в конце сеанса (когда браузер закрывается)».
DrLightman

@DrLightman Спасибо за ваше участие, не могли бы вы привести документацию?
Амир Фо

function.setcookie.php , параметр expires . «Если установлено значение 0 или опущено, срок действия файла cookie истекает в конце сеанса (когда браузер закрывается)».
DrLightman

1

Просто установите значение cookie false, чтобы сбросить его,

setcookie('cookiename', false);

PS: - Это самый простой способ сделать это.


-1

Вы должны удалить куки с php на вашем сервере, а также с js для вашего браузера .. (Они сделали с php, но файлы cookie тоже есть в клиенте браузера):

Пример:

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);

Вам не нужен JavaScript для установки / удаления значения cookie. Php-функция setcookie сделает это за вас php.net/manual/en/function.setcookie.php
Майкл Халили,

-5

Большинство из вас забывают, что это будет работать только на локальной машине. На домене вам понадобится шаблон, как в этом примере.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);

1
Параметр домена будет означать текущий домен, если он опущен.
DustWolf

Я хотел сказать, что ваш ответ неверен. Он будет работать для любого домена, а не только для локальной машины, так как он будет автоматически использовать текущий домен. А ваш комментарий означает, что вы обижены или что-то в этом роде?
DustWolf

Вы даже читаете текст, который находится выше кода? перестань меня беспокоить, я работаю. я закончил с тобой разговаривать
Питер Группелаар

Я не понимаю, почему вас раздражают другие пользователи, если они указывают на ошибку в вашем ответе. setcookieработает для любого домена, локального или нет.
xorinzor

Так что, если все скажут, что это так ... тогда, должно быть, что-то явно не так с моим ответом ... То, что это было указано в этом посте, не имеет значения? ... вам нужны только некоторые направления ответов и игнорировать любых глобальных пользователей, которые работают над симуляцией ситуации ... я понял ... перестаньте меня беспокоить, мой ответ не ошибается.
Питер Группелаар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.