Видаліть печиво


260

Коли я хочу видалити cookie, я намагаюся

unset($_COOKIE['hello']);

Я бачу в своєму браузері файлів cookie від firefox, що файл cookie все ще існує. Як я дійсно можу видалити печиво?


Ви можете знайти $cookie->delete()з github.com/delight-im/PHP-Cookie корисні. Код із запитання просто видаляє властивість, яка була проаналізована на стороні сервера. Файли cookie продовжують працювати на стороні клієнта.
каре

Відповіді:


280

Ви можете спробувати це

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

141
Я розумію, що це приклад, але будь-коли ніколи не зберігайте ім’я користувача або пароль у файлах cookie.
tamasd

3
Це безглуздо unset($_COOKIE['Hello']);. Це нічого не змінить, якщо ви виймете його.
машинобудівний вирок

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

4
працює нормально, але коли спробуйте перезавантажити сторінку. він побачив набір файлів cookie зі старими даними, чому ?.
Nilesh patel

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

284

Встановіть значення "", а термін придатності - вчора (або будь-яку дату в минулому)

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

Тоді файл cookie закінчується при наступному завантаженні сторінки.


10
Як щодо встановлення часу на 0 (епоха)? =]
страгер

12
Якщо ви поставите дату занадто далеко в минулому, IE буде гавкати і ігнорувати її, тобто значення не буде видалено.
Жульєн

52
@strager У посібнику зазначено: Якщо встановлено значення 0 або пропущено, файл cookie закінчується в кінці сеансу (коли браузер закриється). Це дійсно не видалення файлу cookie. Я справді не знаю, чи IE зробить те, що сказав Жульєн, але більш ніж можливо, що IE зробить щось дивне.
янніс

31
Крім того, не забудьте фактично зняти ($ _ COOKIE ["привіт") теж, тому що якщо на іншій сторінці є код, який переглядає $ _COOKIE ["привіт"], він все одно знайде його встановленим. Мене просто покусав цей.
Магматичний

12
Плюс - це гарна ідея встановити шлях, тому setcookie ('привіт', '', час () - 3600, '/');
Стефан Вайнхолд

226

Чистий спосіб видалити файл cookie - це очистити як $_COOKIEфайл файлу cookie зі значення, так і файл cookie:

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

3
Це найкращий метод, тому що вам не потрібно оновлювати сторінку!
MaxV

19
Я продовжую спускати сторінку, а відповіді стають кращими, смішнішими. Але це найкраще, перестаньте шукати тут.
Андрій

23
FYI, якщо ви встановите файл cookie за допомогою шляху, вам також потрібно буде включити шлях до цього setcookieдзвінка:setcookie('key', '', time() - 3600, '/');
Gavin

1
@Gavin Дякую за цю пораду. Мені було цікаво, чому це не було видалено, але було unsettingуспішно.
stinkysGTI

1
Для тих, хто перевіряє існування файлу cookie та піклується про файли cookie, які існують зі nullзначеннями, замість цього вам потрібно буде використовувати array_key_exists () , оскільки файл cookie зі 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 оновлюється в кожному запиті, вона просто повернеться до наступного запиту на сторінці.

Щоб фактично позбутися від cookie, встановіть дату закінчення терміну дії:

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

1
Чи немає потреби unset()в печиві?
Пратік

2
@PratikCJoshi Тільки якщо ваш код шукає його згодом.
AlphaMycelium

14

У мене була така ж проблема в моєму коді, і я виявив, що це проблема шляху cookie. Ознайомтеся з цим повідомленням про переповнення стека. Неможливо видалити файли cookie

Я встановив файл cookie, використовуючи значення шляху "/", але не мав значення шляху, коли я намагався його очистити, тому він не очистив. Ось ось приклад того, що працювало:

Налаштування файлу cookie:

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

Очищення файлу cookie:

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

Сподіваюся, що це допомагає.



7

Дивіться зразок з написом " Приклад №2 setcookie () delete example " з документів 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

Дотримуючись пакетів у наступних запитах, Браузер більше не надсилає ці файли cookie в заголовки


4

Для видалення файлу cookie просто потрібно встановити значення NULL:

"Якщо ви встановили файл cookie з значеннями, що не встановлені за замовчуванням, протягом часу, шляху чи домену, ви повинні надати ті самі значення ще раз, коли ви видалите файл cookie для належного видалення файлу cookie." Цитата з книги "Навчання PHP5".

Отже, цей код повинен працювати (працює для мене):

Налаштування файлу cookie: setcookie('foo', 'bar', time() + 60 * 5);

Видалення файлу cookie: setcookie('foo', '', time() + 60 * 5);

Але я помітив, що всі встановлюють термін придатності до минулого, це потрібно, і чому?


1
Це надійно, саме тому. Комбінація встановлення значення нічого і часу в минулому (але не надто далеко, оскільки IE час від часу не любить це занадто далеко від того, що я читав) працює в усьому світі.
PaulSkinner

Порожній рядок ''- це не те саме, що null.
орев

3

Щоб видалити всі файли cookie, які ви могли написати:

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

3
Це фактично не видалить файли cookie, якщо вони не мають однакових налаштувань шляху та домену, як і типові налаштування для setcookie.
Шум

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, що втратили чинність, у випадку, якщо функція скидання не працює.

Це означає, що навіть якщо функція скидання працює, вона все одно матиме 2 файли cookie на комп’ютері. Задана мета, з логічної точки зору, - видалити файли cookie, якщо це можливо, а якщо насправді це не так, змусити його закінчитися; щоб отримати «найчистіший» результат.

Отже, я думаю, що нам краще зробити:

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

Дякую і приємного дня :)


Відключення функції призначене для логіки PHP (якщо ви хочете використовувати змінну $ _COOKIE ['Привіт'], ви не можете, оскільки вона не встановлена). А функція setcookie призначена для навігатора. 2 різні цілі, порядок функцій не впливає на фактичний код.
Кальзем

Насправді я знав це так, але якщо ви абсолютно хочете бути впевненим, що файл 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

Якщо ви хочете повністю видалити файли cookie з усіх ваших поточних доменів, наступний код вам точно допоможе.

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);

Не потрібно встановлювати значення для видалення файлу cookie!
Амір Фо

1

Коли ви вводите 0час, ви маєте на увазі "зараз" (+ 0s - це насправді зараз) для браузера, і він видаляє файли cookie.

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

Я перевірив це в хромованому браузері, який дає мені:

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 , параметр закінчується . "Якщо встановлено значення 0 або пропущено, файл cookie закінчується в кінці сеансу (коли браузер закриється)."
DrLightman

1

Просто встановіть значення файлу cookie false, щоб скасувати його,

setcookie('cookiename', false);

PS: - Це найпростіший спосіб зробити це.


-1

Ви повинні видалити файли cookie з 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

Ви навіть читаєте текст, який, мабуть, над кодом? перестаньте клопотати мене, я працюю. я закінчив розмову з u.
Пітер Группелаар

Я не розумію, чому ви дратуєтесь на інших користувачів, якщо вони вказують на помилку у вашій відповіді. setcookieпрацює для будь-якого домену, будь то localhost чи ні.
xorinzor

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